1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 07:37:35 +00:00

Solitaire: Add key combo to dump the state of the layout

Useful for chasing down bugs.
This commit is contained in:
Timothy Flynn 2021-05-15 22:13:11 -04:00 committed by Andreas Kling
parent ce030ca584
commit ddb278ab85
5 changed files with 85 additions and 1 deletions

View file

@ -89,7 +89,6 @@ Card::Card(Type type, uint8_t value)
Gfx::Painter painter(m_front);
auto& font = Gfx::FontDatabase::default_bold_font();
static const String labels[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
auto label = labels[value];
m_front->fill(Color::White);

View file

@ -6,6 +6,8 @@
#pragma once
#include <AK/Array.h>
#include <AK/Format.h>
#include <LibCore/Object.h>
#include <LibGUI/Painter.h>
#include <LibGfx/Bitmap.h>
@ -21,6 +23,9 @@ public:
static constexpr int width = 80;
static constexpr int height = 100;
static constexpr int card_count = 13;
static constexpr Array<StringView, card_count> labels = {
"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"
};
enum Type {
Clubs,
@ -67,3 +72,30 @@ private:
};
}
template<>
struct AK::Formatter<Solitaire::Card> : Formatter<FormatString> {
void format(FormatBuilder& builder, const Solitaire::Card& card)
{
StringView type;
switch (card.type()) {
case Solitaire::Card::Type::Clubs:
type = "C"sv;
break;
case Solitaire::Card::Type::Diamonds:
type = "D"sv;
break;
case Solitaire::Card::Type::Hearts:
type = "H"sv;
break;
case Solitaire::Card::Type::Spades:
type = "S"sv;
break;
default:
VERIFY_NOT_REACHED();
}
Formatter<FormatString>::format(builder, "{:>2}{}", Solitaire::Card::labels[card.value()], type);
}
};

View file

@ -7,6 +7,7 @@
#pragma once
#include "Card.h"
#include <AK/Format.h>
#include <AK/Vector.h>
namespace Solitaire {
@ -28,6 +29,7 @@ public:
bool is_empty() const { return m_stack.is_empty(); }
bool is_focused() const { return m_focused; }
Type type() const { return m_type; }
const NonnullRefPtrVector<Card>& stack() const { return m_stack; }
size_t count() const { return m_stack.size(); }
const Card& peek() const { return m_stack.last(); }
Card& peek() { return m_stack.last(); }
@ -84,3 +86,41 @@ private:
};
}
template<>
struct AK::Formatter<Solitaire::CardStack> : Formatter<FormatString> {
void format(FormatBuilder& builder, const Solitaire::CardStack& stack)
{
StringView type;
switch (stack.type()) {
case Solitaire::CardStack::Type::Stock:
type = "Stock"sv;
break;
case Solitaire::CardStack::Type::Normal:
type = "Normal"sv;
break;
case Solitaire::CardStack::Type::Foundation:
type = "Foundation"sv;
break;
case Solitaire::CardStack::Type::Waste:
type = "Waste"sv;
break;
case Solitaire::CardStack::Type::Play:
type = "Play"sv;
break;
default:
VERIFY_NOT_REACHED();
}
StringBuilder cards;
bool first_card = true;
for (const auto& card : stack.stack()) {
cards.appendff("{}{}", (first_card ? "" : " "), card);
first_card = false;
}
Formatter<FormatString>::format(builder, "{:<10} {:>16}: {}", type, stack.bounding_box(), cards.build());
}
};

View file

@ -5,6 +5,7 @@
*/
#include "Game.h"
#include <AK/Debug.h>
#include <LibGUI/Painter.h>
#include <LibGfx/Palette.h>
#include <time.h>
@ -139,6 +140,8 @@ void Game::keydown_event(GUI::KeyEvent& event)
if (event.shift() && (event.key() == KeyCode::Key_F12))
start_game_over_animation();
else if (event.shift() && (event.key() == KeyCode::Key_F11))
dump_layout();
}
void Game::mousedown_event(GUI::MouseEvent& event)
@ -466,4 +469,13 @@ void Game::paint_event(GUI::PaintEvent& event)
}
}
void Game::dump_layout() const
{
if constexpr (SOLITAIRE_DEBUG) {
dbgln("------------------------------");
for (const auto& stack : m_stacks)
dbgln("{}", stack);
}
}
}

View file

@ -114,6 +114,7 @@ private:
void stop_game_over_animation();
void create_new_animation_card();
void check_for_game_over();
void dump_layout() const;
ALWAYS_INLINE CardStack& stack(StackLocation location)
{