Solitaire: Tweak scoring for three-card draw mode

Currently, the player loses 100 points each time the waste stack is
recycled. In three-card draw mode, it's standard to only lose 20 points
after the third recycle event.
This commit is contained in:
Timothy Flynn 2021-05-25 12:27:53 -04:00 committed by Andreas Kling
parent cf9094cf46
commit 0f80e9e4db
Notes: sideshowbarker 2024-07-18 17:23:59 +09:00
2 changed files with 30 additions and 1 deletions

View File

@ -110,6 +110,7 @@ void Game::setup(Mode mode)
m_new_deck.clear();
m_new_game_animation_pile = 0;
m_passes_left_before_punishment = recycle_rules().passes_allowed_before_punishment;
m_score = 0;
update_score(0);
@ -182,7 +183,11 @@ void Game::mousedown_event(GUI::MouseEvent& event)
stock.push(card);
}
update_score(-100);
if (m_passes_left_before_punishment == 0)
update_score(recycle_rules().punishment);
else
--m_passes_left_before_punishment;
update(stock.bounding_box());
} else {
auto play_bounding_box = play.bounding_box();

View File

@ -6,6 +6,7 @@
#pragma once
#include <AK/Array.h>
#include <LibCards/CardStack.h>
#include <LibGUI/Frame.h>
#include <LibGUI/Painter.h>
@ -97,6 +98,11 @@ private:
bool m_dirty { false };
};
struct WasteRecycleRules {
uint8_t passes_allowed_before_punishment { 0 };
int8_t punishment { 0 };
};
enum StackLocation {
Stock,
Waste,
@ -116,6 +122,23 @@ private:
};
static constexpr Array piles = { Pile1, Pile2, Pile3, Pile4, Pile5, Pile6, Pile7 };
ALWAYS_INLINE const WasteRecycleRules& recycle_rules()
{
static constexpr Array<WasteRecycleRules, 2> rules { {
{ 0, -100 },
{ 2, -20 },
} };
switch (m_mode) {
case Mode::SingleCardDraw:
return rules[0];
case Mode::ThreeCardDraw:
return rules[1];
default:
VERIFY_NOT_REACHED();
}
}
void mark_intersecting_stacks_dirty(Card& intersecting_card);
void update_score(int to_add);
void move_card(CardStack& from, CardStack& to);
@ -156,6 +179,7 @@ private:
uint8_t m_new_game_animation_delay { 0 };
uint32_t m_score { 0 };
uint8_t m_passes_left_before_punishment { 0 };
};
}