Increase precision of mode_countdown_ handling (#52)

* fix harmless warnings and properly try/catch allocations via new

otherwise the error handling will never be triggered

* increase precision of mode_countdown_ handling

potentially there could be modes running a bit too long, depending on passed in ms (which were implicitly truncated before when passing in)

also fix some harmless warnings

* document warnings that i cannot handle on my own

* revert changes to have a new cleaner PR after review/cherry picks

* increase precision of mode_countdown_ handling

potentially there could be modes running a bit too long, depending on passed in ms (which were implicitly truncated before when passing in)

also fix some harmless warnings and add comments where original code is 'correct' but weird
This commit is contained in:
toxie 2021-10-23 06:33:04 +02:00 committed by GitHub
parent 8e07b7fc3f
commit 57af3af800
Signed by untrusted user: GitHub
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 27 additions and 28 deletions

View File

@ -40,7 +40,7 @@ TBall::TBall(TPinballTable* table) : TPinballComponent(table, -1, false)
Offset = *loader::query_float_attribute(groupIndex, 0, 500);
auto visualCount = loader::query_visual_states(groupIndex);
auto index = 0;
int index = 0;
if (visualCount > 0)
{
auto visualZPtr = VisualZArray;

View File

@ -65,7 +65,7 @@ TFlipper::~TFlipper()
int TFlipper::Message(int code, float value)
{
if (code == 1 || code == 2 || code > 1008 && code <= 1011 || code == 1022)
if (code == 1 || code == 2 || (code > 1008 && code <= 1011) || code == 1022)
{
float timerTime;
int command = code;

View File

@ -109,7 +109,6 @@ float TFlipperEdge::FindCollisionDistance(ray_type* ray)
{
if (FlipperFlag == 0)
{
EdgeCollisionFlag = 0;
CollisionFlag1 = 0;
CollisionFlag2 = 0;
set_control_points(ogRay->TimeNow);

View File

@ -432,7 +432,7 @@ int TLightGroup::next_light_up()
{
for (auto index = 0u; index < List.size(); ++index)
{
if (!List.at(index)->BmpIndex1)
if (!List[index]->BmpIndex1)
return static_cast<int>(index);
}
return -1;

View File

@ -368,7 +368,7 @@ int TPinballTable::Message(int code, float value)
LightGroup->Message(34, 0.0);
LightGroup->Message(20, 0.0);
Plunger->Message(1016, 0.0);
if (Demo->ActiveFlag)
if (Demo && Demo->ActiveFlag)
rc_text = pinball::get_rc_string(30, 0);
else
rc_text = pinball::get_rc_string(26, 0);

View File

@ -37,7 +37,7 @@ void TPlunger::Collision(TBall* ball, vector_type* nextPosition, vector_type* di
{
if (PinballTable->TiltLockFlag)
Message(1017, 0.0);
coef = RandFloat() * Boost * 0.1f + Boost;
coef = RandFloat() * Boost * 0.1f + Boost; // it is intended that the passed in coef is never used!
maths::basic_collision(ball, nextPosition, direction, Elasticity, Smoothness, Threshold, coef);
}
@ -94,7 +94,7 @@ int TPlunger::Message(int code, float value)
if (PullbackTimer_)
timer::kill(PullbackTimer_);
PullbackTimer_ = 0;
if (code == 1005)
if (code == 1005) // intended that this can never be reached (same as original)
loader::play_sound(SoundIndexP2);
auto bmp = ListBitmap->at(0);
auto zMap = ListZMap->at(0);

View File

@ -6,7 +6,7 @@
#include "TBall.h"
#include "TPinballTable.h"
TTripwire::TTripwire(TPinballTable* table, int groupIndex) : TRollover(table, groupIndex, 1)
TTripwire::TTripwire(TPinballTable* table, int groupIndex) : TRollover(table, groupIndex, true)
{
}

View File

@ -3923,9 +3923,7 @@ void control::SelectMissionController(int code, TPinballComponent* caller)
if (light_on(&control_lite319_tag))
control_lite319_tag.Component->Message(20, 0.0);
if (!light_on(&control_lite317_tag))
{
control_lite317_tag.Component->Message(7, 0.0);
}
}
else
{
@ -4158,6 +4156,7 @@ void control::TimeWarpPartTwoController(int code, TPinballComponent* caller)
control_lite317_tag.Component->Message(20, 0.0);
control_lite198_tag.Component->MessageField = 1;
MissionControl(66, nullptr);
// SpecialAddScore sets the score dirty flag. So next tick it will be redrawn.
}
void control::UnselectMissionController(int code, TPinballComponent* caller)

View File

@ -299,7 +299,7 @@ float maths::basic_collision(TBall* ball, vector_type* nextPosition, vector_type
return projSpeed;
}
float maths::Distance_Squared(vector_type vec1, vector_type vec2)
float maths::Distance_Squared(vector_type& vec1, vector_type& vec2)
{
return (vec1.Y - vec2.Y) * (vec1.Y - vec2.Y) + (vec1.X - vec2.X) * (vec1.X - vec2.X);
}

View File

@ -87,7 +87,7 @@ public:
static float basic_collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float elasticity,
float smoothness,
float threshold, float boost);
static float Distance_Squared(vector_type vec1, vector_type vec2);
static float Distance_Squared(vector_type& vec1, vector_type& vec2);
static float DotProduct(vector_type* vec1, vector_type* vec2);
static void vswap(vector_type* vec1, vector_type* vec2);
static float Distance(vector_type* vec1, vector_type* vec2);

View File

@ -29,8 +29,8 @@
TPinballTable* pb::MainTable = nullptr;
DatFile* pb::record_table = nullptr;
int pb::time_ticks = 0, pb::demo_mode = 0, pb::game_mode = 2, pb::mode_countdown_;
float pb::time_now = 0, pb::time_next = 0, pb::ball_speed_limit, pb::time_ticks_remainder = 0;
int pb::time_ticks = 0, pb::demo_mode = 0, pb::game_mode = 2;
float pb::mode_countdown_, pb::time_now = 0, pb::time_next = 0, pb::ball_speed_limit, pb::time_ticks_remainder = 0;
high_score_struct pb::highscore_table[5];
bool pb::FullTiltMode = false, pb::cheat_mode = false;
@ -169,7 +169,7 @@ void pb::mode_change(int mode)
case 4:
winmain::LaunchBallEnabled = false;
winmain::HighScoresEnabled = false;
mode_countdown_ = 5000;
mode_countdown_ = 5000.f;
break;
}
game_mode = mode;
@ -317,7 +317,7 @@ void pb::window_size(int* width, int* height)
void pb::pause_continue()
{
winmain::single_step = winmain::single_step == 0;
winmain::single_step = (winmain::single_step == 0) ? 1 : 0;
pinball::InfoTextBox->Clear();
pinball::MissTextBox->Clear();
if (winmain::single_step)
@ -399,7 +399,7 @@ void pb::InputDown(GameInput input)
if (game_mode != 1)
{
mode_countdown(-1);
mode_countdown(-1.f);
return;
}
@ -485,7 +485,7 @@ void pb::InputDown(GameInput input)
}
}
int pb::mode_countdown(int time)
int pb::mode_countdown(float time)
{
if (!game_mode || game_mode <= 0)
return 1;
@ -494,13 +494,13 @@ int pb::mode_countdown(int time)
if (game_mode == 3)
{
mode_countdown_ -= time;
if (mode_countdown_ < 0 || time < 0)
if (mode_countdown_ < 0.f || time < 0.f)
mode_change(4);
}
else if (game_mode == 4)
{
mode_countdown_ -= time;
if (mode_countdown_ < 0 || time < 0)
if (mode_countdown_ < 0.f || time < 0.f)
mode_change(1);
}
return 1;
@ -532,7 +532,7 @@ void pb::end_game()
for (auto i = 0; i < playerCount; ++i)
{
for (auto j = i; j < playerCount; ++j)
for (auto j = i+1; j < playerCount; ++j)
{
if (scores[j] > scores[i])
{

View File

@ -57,7 +57,7 @@ public:
static void loose_focus();
static void InputUp(GameInput input);
static void InputDown(GameInput input);
static int mode_countdown(int time);
static int mode_countdown(float time);
static void launch_ball();
static void end_game();
static void high_scores();
@ -66,7 +66,8 @@ public:
static float collide(float timeNow, float timeDelta, TBall* ball);
static void PushCheat(const std::string& cheat);
private:
static int demo_mode, mode_countdown_;
static int demo_mode;
static float mode_countdown_;
static bool AnyBindingMatchesInput(GameInput (&options)[3], GameInput key);
};

View File

@ -420,7 +420,7 @@ void render::build_occlude_list()
}
}
if (!mainSprite->UnknownFlag && mainSprite->Bmp && spriteArr->size() < 2)
if (mainSprite->Bmp && spriteArr->size() < 2)
spriteArr->clear();
if (!spriteArr->empty())
{

View File

@ -180,7 +180,7 @@ int winmain::WinMain(LPCSTR lpCmdLine)
if (!gfr_display)
{
auto plt = static_cast<ColorRgba*>(malloc(1024u));
auto pltPtr = &plt[10];
auto pltPtr = &plt[10]; // first 10 entries are system colors hardcoded in display_palette()
for (int i1 = 0, i2 = 0; i1 < 256 - 10; ++i1, i2 += 8)
{
unsigned char blue = i2, redGreen = i2;
@ -215,8 +215,8 @@ int winmain::WinMain(LPCSTR lpCmdLine)
int x, y, w, h;
SDL_GetMouseState(&x, &y);
SDL_GetWindowSize(window, &w, &h);
float dx = (last_mouse_x - x) / static_cast<float>(w);
float dy = (y - last_mouse_y) / static_cast<float>(h);
float dx = static_cast<float>(last_mouse_x - x) / static_cast<float>(w);
float dy = static_cast<float>(y - last_mouse_y) / static_cast<float>(h);
pb::ballset(dx, dy);
SDL_WarpMouseInWindow(window, last_mouse_x, last_mouse_y);
@ -655,7 +655,7 @@ int winmain::event_handler(const SDL_Event* event)
pb::frame(10);
break;
case SDLK_F10:
single_step = single_step == 0;
single_step = (single_step == 0) ? 1 : 0;
if (single_step == 0)
no_time_loss = 1;
break;