1
0
Fork 0
mirror of https://github.com/k4zmu2a/SpaceCadetPinball.git synced 2024-11-23 09:20:19 +01:00

Compare commits

..

2 commits

Author SHA1 Message Date
Muzychenko Andrey
1391eeba81 Reordered pch includes in Sound.
This might help with #162.
Fixed switch warning.
2022-11-21 10:02:56 +03:00
Muzychenko Andrey
ea32c08c4f Added “easy mode” cheat, aka frustration-free mode.
It involves always on center post and never closing kicker gates.
Issue #161.
2022-11-21 09:49:15 +03:00
7 changed files with 52 additions and 33 deletions

View file

@ -1,5 +1,5 @@
#include "options.h"
#include "pch.h" #include "pch.h"
#include "options.h"
#include "Sound.h" #include "Sound.h"
#include "maths.h" #include "maths.h"

View file

@ -1,8 +1,4 @@
// SpaceCadetPinball.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include "pch.h" #include "pch.h"
#include "winmain.h" #include "winmain.h"
int main(int argc, char* argv[]) int main(int argc, char* argv[])

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,36 @@ 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)
{ {
block->MessageField = 1; case MessageCode::TBlockerEnable:
blockerDuration = static_cast<float>(block->InitialDuration);
block->Message(MessageCode::TBlockerEnable, blockerDuration);
lightMessage = MessageCode::TLightTurnOnTimed;
}
else
{
if (code != MessageCode::ControlTimerExpired)
return;
if (block->MessageField != 1)
{ {
block->MessageField = 0; block->MessageField = 1;
block->Message(MessageCode::TBlockerDisable, 0.0); auto blockerDuration = !easyMode ? static_cast<float>(block->InitialDuration) : -1;
return; block->Message(MessageCode::TBlockerEnable, blockerDuration);
lite1->Message(MessageCode::TLightTurnOnTimed, blockerDuration);
break;
} }
block->MessageField = 2; case MessageCode::ControlTimerExpired:
blockerDuration = static_cast<float>(block->ExtendedDuration); {
block->Message(MessageCode::TBlockerRestartTimeout, blockerDuration); if (block->MessageField == 1)
lightMessage = MessageCode::TLightFlasherStartTimed; {
block->MessageField = 2;
auto blockerDuration = static_cast<float>(block->ExtendedDuration);
block->Message(MessageCode::TBlockerRestartTimeout, blockerDuration);
lite1->Message(MessageCode::TLightFlasherStartTimed, blockerDuration);
break;
}
else
{
block->MessageField = 0;
block->Message(MessageCode::TBlockerDisable, 0.0);
break;
}
}
default: break;
} }
lite1->Message(lightMessage, blockerDuration);
} }
void control::LaunchRampControl(MessageCode code, TPinballComponent* caller) void control::LaunchRampControl(MessageCode code, TPinballComponent* caller)
@ -2478,6 +2493,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();
} }