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:
parent
cf9094cf46
commit
0f80e9e4db
Notes:
sideshowbarker
2024-07-18 17:23:59 +09:00
Author: https://github.com/trflynn89 Commit: https://github.com/SerenityOS/serenity/commit/0f80e9e4dbb Pull-request: https://github.com/SerenityOS/serenity/pull/7464
2 changed files with 30 additions and 1 deletions
|
@ -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();
|
||||
|
|
|
@ -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 };
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue