Added “easy mode” cheat, aka frustration-free mode.

It involves always on center post and never closing kicker gates.
Issue #161.
This commit is contained in:
Muzychenko Andrey 2022-11-21 09:49:15 +03:00
parent 80947888a0
commit ea32c08c4f
5 changed files with 50 additions and 28 deletions

View File

@ -48,7 +48,9 @@ int TBlocker::Message(MessageCode code, float value)
SpriteSet(0); SpriteSet(0);
if (Timer) if (Timer)
timer::kill(Timer); timer::kill(Timer);
Timer = timer::set(std::max(value, 0.0f), this, TimerExpired); Timer = 0;
if (value >= 0)
Timer = timer::set(value, this, TimerExpired);
break; break;
case MessageCode::TBlockerRestartTimeout: case MessageCode::TBlockerRestartTimeout:
if (Timer) if (Timer)

View File

@ -393,6 +393,8 @@ int TPinballTable::Message(MessageCode code, float value)
} }
else else
{ {
// Some of the control cheats persist across games.
// Was this loose anti-cheat by design?
CheatsUsed = 0; CheatsUsed = 0;
Message(MessageCode::Reset, 0.0); Message(MessageCode::Reset, 0.0);
auto ball = BallList[0]; auto ball = BallList[0];

View File

@ -771,7 +771,7 @@ component_tag_base* control::simple_components[145]
}; };
int control::waiting_deployment_flag; int control::waiting_deployment_flag;
bool control::table_unlimited_balls = false; bool control::table_unlimited_balls = false, control::easyMode = false;
int control::extraball_light_flag; int control::extraball_light_flag;
Msg control::RankRcArray[9] = Msg control::RankRcArray[9] =
{ {
@ -903,7 +903,7 @@ void control::pbctrl_bdoor_controller(char key)
{ {
// Buffer large enough for longest cheat + null // Buffer large enough for longest cheat + null
static char cheatBuffer[11 + 1]{}; static char cheatBuffer[11 + 1]{};
static char* bufferEnd = &cheatBuffer[11]; static const char* bufferEnd = &cheatBuffer[11];
static const char* quotes[8] static const char* quotes[8]
{ {
"Hey, is that a screen saver?", "Hey, is that a screen saver?",
@ -949,6 +949,18 @@ void control::pbctrl_bdoor_controller(char key)
mission_text_box->Display(quote, time += 3); mission_text_box->Display(quote, time += 3);
return; return;
} }
else if (strcmp(bufferEnd - 9, "easy mode") == 0)
{
easyMode ^= true;
if (easyMode)
{
DrainBallBlockerControl(MessageCode::TBlockerEnable, block1);
gate1->Message(MessageCode::TGateDisable, 0.0);
gate2->Message(MessageCode::TGateDisable, 0.0);
}
else
DrainBallBlockerControl(MessageCode::ControlTimerExpired, block1);
}
else else
{ {
return; return;
@ -1165,13 +1177,13 @@ void control::BumperControl(MessageCode code, TPinballComponent* caller)
void control::LeftKickerControl(MessageCode code, TPinballComponent* caller) void control::LeftKickerControl(MessageCode code, TPinballComponent* caller)
{ {
if (code == MessageCode::ControlTimerExpired) if (code == MessageCode::ControlTimerExpired && !easyMode)
gate1->Message(MessageCode::TGateEnable, 0.0); gate1->Message(MessageCode::TGateEnable, 0.0);
} }
void control::RightKickerControl(MessageCode code, TPinballComponent* caller) void control::RightKickerControl(MessageCode code, TPinballComponent* caller)
{ {
if (code == MessageCode::ControlTimerExpired) if (code == MessageCode::ControlTimerExpired && !easyMode)
gate2->Message(MessageCode::TGateEnable, 0.0); gate2->Message(MessageCode::TGateEnable, 0.0);
} }
@ -1235,33 +1247,35 @@ void control::DeploymentChuteToTableOneWayControl(MessageCode code, TPinballComp
void control::DrainBallBlockerControl(MessageCode code, TPinballComponent* caller) void control::DrainBallBlockerControl(MessageCode code, TPinballComponent* caller)
{ {
MessageCode lightMessage;
float blockerDuration;
auto block = static_cast<TBlocker*>(caller); auto block = static_cast<TBlocker*>(caller);
if (code == MessageCode::TBlockerEnable) switch (code)
{
case MessageCode::TBlockerEnable:
{ {
block->MessageField = 1; block->MessageField = 1;
blockerDuration = static_cast<float>(block->InitialDuration); auto blockerDuration = !easyMode ? static_cast<float>(block->InitialDuration) : -1;
block->Message(MessageCode::TBlockerEnable, blockerDuration); block->Message(MessageCode::TBlockerEnable, blockerDuration);
lightMessage = MessageCode::TLightTurnOnTimed; lite1->Message(MessageCode::TLightTurnOnTimed, blockerDuration);
break;
}
case MessageCode::ControlTimerExpired:
{
if (block->MessageField == 1)
{
block->MessageField = 2;
auto blockerDuration = static_cast<float>(block->ExtendedDuration);
block->Message(MessageCode::TBlockerRestartTimeout, blockerDuration);
lite1->Message(MessageCode::TLightFlasherStartTimed, blockerDuration);
break;
} }
else else
{
if (code != MessageCode::ControlTimerExpired)
return;
if (block->MessageField != 1)
{ {
block->MessageField = 0; block->MessageField = 0;
block->Message(MessageCode::TBlockerDisable, 0.0); block->Message(MessageCode::TBlockerDisable, 0.0);
return; break;
}
} }
block->MessageField = 2;
blockerDuration = static_cast<float>(block->ExtendedDuration);
block->Message(MessageCode::TBlockerRestartTimeout, blockerDuration);
lightMessage = MessageCode::TLightFlasherStartTimed;
} }
lite1->Message(lightMessage, blockerDuration);
} }
void control::LaunchRampControl(MessageCode code, TPinballComponent* caller) void control::LaunchRampControl(MessageCode code, TPinballComponent* caller)
@ -2478,6 +2492,8 @@ void control::PlungerControl(MessageCode code, TPinballComponent* caller)
if (code == MessageCode::PlungerFeedBall) if (code == MessageCode::PlungerFeedBall)
{ {
MissionControl(MessageCode::ControlMissionStarted, nullptr); MissionControl(MessageCode::ControlMissionStarted, nullptr);
if (easyMode && !block1->ActiveFlag)
DrainBallBlockerControl(MessageCode::TBlockerEnable, block1);
} }
else if (code == MessageCode::PlungerStartFeedTimer) else if (code == MessageCode::PlungerStartFeedTimer)
{ {

View File

@ -68,7 +68,7 @@ public:
static component_info score_components[88]; static component_info score_components[88];
static component_tag_base* simple_components[145]; static component_tag_base* simple_components[145];
static int waiting_deployment_flag; static int waiting_deployment_flag;
static bool table_unlimited_balls; static bool table_unlimited_balls, easyMode;
static Msg RankRcArray[9], MissionRcArray[17]; static Msg RankRcArray[9], MissionRcArray[17];
static int mission_select_scores[17]; static int mission_select_scores[17];
static std::reference_wrapper<TSink*> WormholeSinkArray[3]; static std::reference_wrapper<TSink*> WormholeSinkArray[3];

View File

@ -732,6 +732,8 @@ void winmain::RenderUi()
pb::PushCheat("rmax"); pb::PushCheat("rmax");
if (pb::FullTiltMode && ImGui::MenuItem("quote")) if (pb::FullTiltMode && ImGui::MenuItem("quote"))
pb::PushCheat("quote"); pb::PushCheat("quote");
if (ImGui::MenuItem("easy mode", nullptr, control::easyMode))
pb::PushCheat("easy mode");
ImGui::EndMenu(); ImGui::EndMenu();
} }