From f22077d8c807c0f89aea7ca9b63f79c43d910281 Mon Sep 17 00:00:00 2001 From: oz Date: Mon, 18 Jan 2021 18:30:19 +0300 Subject: [PATCH] TSink, TDemo ready. --- Doc/FuncStats.xlsx | Bin 38832 -> 38873 bytes SpaceCadetPinball/TDemo.cpp | 195 ++++++++++++++++++++++++ SpaceCadetPinball/TDemo.h | 24 +++ SpaceCadetPinball/TPinballComponent.cpp | 10 ++ SpaceCadetPinball/TPinballComponent.h | 3 + SpaceCadetPinball/TSink.cpp | 108 +++++++++++++ SpaceCadetPinball/TSink.h | 24 ++- SpaceCadetPinball/control.cpp | 36 ++--- SpaceCadetPinball/maths.cpp | 46 +++++- SpaceCadetPinball/maths.h | 28 ++++ SpaceCadetPinball/pb.h | 3 +- 11 files changed, 453 insertions(+), 24 deletions(-) diff --git a/Doc/FuncStats.xlsx b/Doc/FuncStats.xlsx index 16587fca50188d0b211e2f461edc8a899b96d371..c0872b337ac8549cf069725418f5c42e122f8e7b 100644 GIT binary patch delta 27921 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 XL|d;C3{o@*Jrl}PZjeC|@$3E%XQKLI diff --git a/SpaceCadetPinball/TDemo.cpp b/SpaceCadetPinball/TDemo.cpp index f1d0b6c..7284cb1 100644 --- a/SpaceCadetPinball/TDemo.cpp +++ b/SpaceCadetPinball/TDemo.cpp @@ -1,10 +1,205 @@ #include "pch.h" #include "TDemo.h" + +#include "loader.h" +#include "pb.h" +#include "TEdgeSegment.h" +#include "timer.h" #include "TPinballTable.h" +#include "TBall.h" TDemo::TDemo(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, false) { + visualStruct visual{}; + + RestartGameTimer = 0; + PlungerFlag = 0; + FlipLeftTimer = 0; + FlipRightTimer = 0; + MessageField = 0; + UnknownBaseFlag1 = 0; + UnknownBaseFlag2 = 0; + FlipRightFlag = 0; + FlipLeftFlag = 0; table->Demo = this; + auto floatArr1 = loader::query_float_attribute(groupIndex, 0, 407); + if (floatArr1) + { + FlipTimerTime1 = floatArr1[0]; + FlipTimerTime2 = floatArr1[1]; + UnFlipTimerTime1 = floatArr1[2]; + UnFlipTimerTime2 = floatArr1[3]; + } + else + { + FlipTimerTime1 = 0.2f; + FlipTimerTime2 = 0.1f; + UnFlipTimerTime1 = 0.2f; + UnFlipTimerTime2 = 0.1f; + } + loader::query_visual(groupIndex, 0, &visual); + auto v5 = loader::query_float_attribute(groupIndex, 0, 1400); + Edge1 = TEdgeSegment::install_wall(v5, this, &UnknownBaseFlag2, visual.Flag, 0.0, 1400); + + auto v6 = loader::query_float_attribute(groupIndex, 0, 1401); + TEdgeSegment::install_wall(v6, this, &UnknownBaseFlag2, visual.Flag, 0.0, 1401); + + auto v7 = loader::query_float_attribute(groupIndex, 0, 1402); + Edge2 = TEdgeSegment::install_wall(v7, this, &UnknownBaseFlag2, visual.Flag, 0.0, 1402); + + auto v8 = loader::query_float_attribute(groupIndex, 0, 1403); + TEdgeSegment::install_wall(v8, this, &UnknownBaseFlag2, visual.Flag, 0.0, 1403); + + auto v9 = loader::query_float_attribute(groupIndex, 0, 1404); + Edge3 = TEdgeSegment::install_wall(v9, this, &UnknownBaseFlag2, visual.Flag, table->CollisionCompOffset, 1404); +} + +int TDemo::Message(int code, float value) +{ + switch (code) + { + case 1014: + if (RestartGameTimer) + timer::kill(RestartGameTimer); + RestartGameTimer = 0; + break; + case 1022: + if (RestartGameTimer) + timer::kill(RestartGameTimer); + RestartGameTimer = 0; + if (UnknownBaseFlag2 != 0) + RestartGameTimer = timer::set(5.0, this, NewGameRestartTimer); + break; + case 1024: + if (FlipLeftTimer) + timer::kill(FlipLeftTimer); + FlipLeftTimer = 0; + if (FlipRightTimer) + timer::kill(FlipRightTimer); + FlipRightTimer = 0; + + if (FlipLeftFlag != 0) + UnFlipLeft(0, this); + if (FlipRightFlag) + UnFlipRight(0, this); + if (PlungerFlag) + PlungerRelease(0, this); + break; + default: + break; + } + return 0; +} + +void TDemo::Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, TEdgeSegment* edge) +{ + ball->not_again(edge); + ball->Position.X = nextPosition->X; + ball->Position.Y = nextPosition->Y; + ball->RayMaxDistance -= coef; + + switch (edge->WallValue) + { + case 1400: + if (!FlipLeftTimer && !FlipLeftFlag) + { + float time = FlipTimerTime1 + FlipTimerTime2 - static_cast(rand()) * + 0.00003051850947599719f * (FlipTimerTime2 + FlipTimerTime2); + FlipLeftTimer = timer::set(time, this, FlipLeft); + } + break; + case 1401: + FlipLeft(0, this); + break; + case 1402: + if (!FlipRightTimer && !FlipRightFlag) + { + float time = FlipTimerTime1 + FlipTimerTime2 - static_cast(rand()) * + 0.00003051850947599719f * (FlipTimerTime2 + FlipTimerTime2); + FlipRightTimer = timer::set(time, this, FlipRight); + } + break; + case 1403: + FlipRight(0, this); + break; + case 1404: + if (!PlungerFlag) + { + PinballTable->Message(1004, ball->TimeNow); + float time = static_cast(rand()) * 0.00003051850947599719f + 2.0f; + PlungerFlag = timer::set(time, this, PlungerRelease); + } + break; + default: + break; + } +} + +void TDemo::PlungerRelease(int timerId, void* caller) +{ + auto demo = static_cast(caller); + demo->PlungerFlag = 0; + demo->PinballTable->Message(1005, pb::time_next); +} + +void TDemo::UnFlipRight(int timerId, void* caller) +{ + auto demo = static_cast(caller); + if (demo->FlipRightFlag) + demo->PinballTable->Message(1003, pb::time_next); + demo->FlipRightFlag = 0; +} + +void TDemo::UnFlipLeft(int timerId, void* caller) +{ + auto demo = static_cast(caller); + if (demo->FlipLeftFlag) + demo->PinballTable->Message(1001, pb::time_next); + demo->FlipLeftFlag = 0; +} + +void TDemo::FlipRight(int timerId, void* caller) +{ + auto demo = static_cast(caller); + if (!demo->FlipRightFlag) + { + if (demo->FlipRightTimer) + { + timer::kill(demo->FlipRightTimer); + demo->FlipRightTimer = 0; + } + demo->PinballTable->Message(1002, pb::time_next); + demo->FlipRightFlag = 1; + float time = demo->UnFlipTimerTime1 + demo->UnFlipTimerTime2 - static_cast(rand()) * + 0.00003051850947599719f * (demo->UnFlipTimerTime2 + demo->UnFlipTimerTime2); + timer::set(time, demo, UnFlipRight); + } +} + +void TDemo::FlipLeft(int timerId, void* caller) +{ + auto demo = static_cast(caller); + if (!demo->FlipLeftFlag) + { + if (demo->FlipLeftTimer) + { + timer::kill(demo->FlipLeftTimer); + demo->FlipLeftTimer = 0; + } + demo->PinballTable->Message(1000, pb::time_next); + demo->FlipLeftFlag = 1; + float time = demo->UnFlipTimerTime1 + demo->UnFlipTimerTime2 - static_cast(rand()) * + 0.00003051850947599719f * (demo->UnFlipTimerTime2 + demo->UnFlipTimerTime2); + timer::set(time, demo, UnFlipLeft); + } +} + +void TDemo::NewGameRestartTimer(int timerId, void* caller) +{ + auto demo = static_cast(caller); + pb::replay_level(1); + demo->PinballTable->Message(1014, static_cast(demo->PinballTable->PlayerCount)); + demo->RestartGameTimer = 0; } diff --git a/SpaceCadetPinball/TDemo.h b/SpaceCadetPinball/TDemo.h index c48ba74..b289a5d 100644 --- a/SpaceCadetPinball/TDemo.h +++ b/SpaceCadetPinball/TDemo.h @@ -6,4 +6,28 @@ class TDemo : { public: TDemo(TPinballTable* table, int groupIndex); + int Message(int code, float value) override; + void Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, + TEdgeSegment* edge) override; + + static void PlungerRelease(int timerId, void* caller); + static void UnFlipRight(int timerId, void* caller); + static void UnFlipLeft(int timerId, void* caller); + static void FlipRight(int timerId, void* caller); + static void FlipLeft(int timerId, void* caller); + static void NewGameRestartTimer(int timerId, void* caller); + + float FlipTimerTime1; + float FlipTimerTime2; + float UnFlipTimerTime1; + float UnFlipTimerTime2; + int FlipLeftFlag; + int FlipRightFlag; + int FlipLeftTimer; + int FlipRightTimer; + int PlungerFlag; + int RestartGameTimer; + TEdgeSegment* Edge1; + TEdgeSegment* Edge2; + TEdgeSegment* Edge3; }; diff --git a/SpaceCadetPinball/TPinballComponent.cpp b/SpaceCadetPinball/TPinballComponent.cpp index e312144..5c5ce35 100644 --- a/SpaceCadetPinball/TPinballComponent.cpp +++ b/SpaceCadetPinball/TPinballComponent.cpp @@ -109,3 +109,13 @@ int TPinballComponent::get_scoring(int index) { return 0; } + +void* TPinballComponent::operator new(size_t Size) +{ + return calloc(1u, Size); +} + +void TPinballComponent::operator delete(void* p) +{ + free(p); /*Original does not have this*/ +} diff --git a/SpaceCadetPinball/TPinballComponent.h b/SpaceCadetPinball/TPinballComponent.h index 25daaa5..446526d 100644 --- a/SpaceCadetPinball/TPinballComponent.h +++ b/SpaceCadetPinball/TPinballComponent.h @@ -20,6 +20,9 @@ public: virtual void put_scoring(int index, int score); virtual int get_scoring(int index); + void* operator new(size_t Size); + void operator delete(void* p); + __int8 UnknownBaseFlag1; __int8 UnknownBaseFlag2; int MessageField; diff --git a/SpaceCadetPinball/TSink.cpp b/SpaceCadetPinball/TSink.cpp index 8f76394..61a6b18 100644 --- a/SpaceCadetPinball/TSink.cpp +++ b/SpaceCadetPinball/TSink.cpp @@ -1,2 +1,110 @@ #include "pch.h" #include "TSink.h" + + +#include "control.h" +#include "loader.h" +#include "objlist_class.h" +#include "render.h" +#include "TPinballTable.h" +#include "TBall.h" +#include "timer.h" + +TSink::TSink(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, true) +{ + visualStruct visual{}; + + MessageField = 0; + Timer = 0; + loader::query_visual(groupIndex, 0, &visual); + BallAcceleration.X = visual.Kicker.Unknown4F; + BallAcceleration.Y = visual.Kicker.Unknown5F; + BallAcceleration.Z = visual.Kicker.Unknown6F; + ThrowAngleMult = visual.Kicker.Unknown7F; + ThrowSpeedMult1 = visual.Kicker.Unknown2F; + ThrowSpeedMult2 = visual.Kicker.Unknown3F * 0.01f; + SoundIndex4 = visual.SoundIndex4; + SoundIndex3 = visual.SoundIndex3; + auto floatArr = loader::query_float_attribute(groupIndex, 0, 601); + BallPosition.X = floatArr[0]; + BallPosition.Y = floatArr[1]; + TimerTime = *loader::query_float_attribute(groupIndex, 0, 407); +} + +int TSink::Message(int code, float value) +{ + switch (code) + { + case 56: + if (value < 0.0) + value = TimerTime; + Timer = timer::set(value, this, TimerExpired); + break; + case 1020: + PlayerMessagefieldBackup[PinballTable->CurrentPlayer] = MessageField; + MessageField = PlayerMessagefieldBackup[static_cast(floor(value))]; + break; + case 1024: + { + if (Timer) + timer::kill(Timer); + Timer = 0; + MessageField = 0; + + auto playerPtr = PlayerMessagefieldBackup; + for (auto index = 0; index < PinballTable->PlayerCount; ++index) + { + *playerPtr = 0; + + ++playerPtr; + } + + break; + } + default: + break; + } + return 0; +} + +void TSink::put_scoring(int index, int score) +{ + if (index < 3) + Scores[index] = score; +} + +int TSink::get_scoring(int index) +{ + return index < 3 ? Scores[index] : 0; +} + +void TSink::Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, TEdgeSegment* edge) +{ + Timer = 0; + if (PinballTable->TiltLockFlag) + { + maths::basic_collision(ball, nextPosition, direction, UnknownC4F, UnknownC5F, 1000000000.0, 0.0); + } + else + { + ball->UnknownBaseFlag2 = 0; + render::sprite_set_bitmap(ball->RenderSprite, nullptr); + loader::play_sound(SoundIndex4); + control::handler(63, this); + } +} + +void TSink::TimerExpired(int timerId, void* caller) +{ + auto sink = static_cast(caller); + auto ball = static_cast(sink->PinballTable->BallList->Get(0)); + ball->CollisionComp = nullptr; + ball->UnknownBaseFlag2 = 1; + ball->Position.X = sink->BallPosition.X; + ball->Position.Y = sink->BallPosition.Y; + TBall::throw_ball(ball, &sink->BallAcceleration, sink->ThrowAngleMult, sink->ThrowSpeedMult1, + sink->ThrowSpeedMult2); + if (sink->SoundIndex3) + loader::play_sound(sink->SoundIndex3); + sink->Timer = 0; +} diff --git a/SpaceCadetPinball/TSink.h b/SpaceCadetPinball/TSink.h index 38fe23b..b31b6ca 100644 --- a/SpaceCadetPinball/TSink.h +++ b/SpaceCadetPinball/TSink.h @@ -1,11 +1,29 @@ #pragma once +#include "maths.h" #include "TCollisionComponent.h" class TSink : public TCollisionComponent { public: - TSink(TPinballTable* table, int groupIndex) : TCollisionComponent(table, groupIndex, true) - { - } + TSink(TPinballTable* table, int groupIndex); + int Message(int code, float value) override; + void put_scoring(int index, int score) override; + int get_scoring(int index) override; + void Collision(TBall* ball, vector_type* nextPosition, vector_type* direction, float coef, + TEdgeSegment* edge) override; + + static void TimerExpired(int timerId, void* caller); + + int Timer; + float TimerTime; + vector_type BallPosition; + vector_type BallAcceleration; + float ThrowAngleMult; + float ThrowSpeedMult1; + float ThrowSpeedMult2; + int SoundIndex4; + int SoundIndex3; + int Scores[3]; + int PlayerMessagefieldBackup[4]; }; diff --git a/SpaceCadetPinball/control.cpp b/SpaceCadetPinball/control.cpp index b6df663..bd87add 100644 --- a/SpaceCadetPinball/control.cpp +++ b/SpaceCadetPinball/control.cpp @@ -787,9 +787,9 @@ void control::pbctrl_bdoor_controller(int key) void control::table_add_extra_ball(float count) { ++TableG->ExtraBalls; - dynamic_cast(control_soundwave28_tag.Component)->Play(); + static_cast(control_soundwave28_tag.Component)->Play(); auto msg = pinball::get_rc_string(9, 0); - dynamic_cast(control_info_text_box_tag.Component)->Display(msg, count); + static_cast(control_info_text_box_tag.Component)->Display(msg, count); } int control::cheat_bump_rank() @@ -799,7 +799,7 @@ int control::cheat_bump_rank() BOOL control::light_on(component_tag* tag) { - auto light = dynamic_cast(tag->Component); + auto light = static_cast(tag->Component); return light->BmpIndex1 || light->FlasherFlag2 || light->FlasherActive; } @@ -859,10 +859,10 @@ void control::DeploymentChuteToEscapeChuteOneWayControl(int code, TPinballCompon int count = control_skill_shot_lights_tag.Component->Message(37, 0.0); if (count) { - dynamic_cast(control_soundwave3_tag.Component)->Play(); + static_cast(control_soundwave3_tag.Component)->Play(); int score = TableG->AddScore(caller->get_scoring(count - 1)); sprintf_s(Buffer, pinball::get_rc_string(21, 0), score); - dynamic_cast(control_info_text_box_tag.Component)->Display(Buffer, 2.0); + static_cast(control_info_text_box_tag.Component)->Display(Buffer, 2.0); if (!light_on(&control_lite56_tag)) { control_l_trek_lights_tag.Component->Message(34, 0.0); @@ -1109,10 +1109,10 @@ void control::BallDrainControl(int code, TPinballComponent* caller) TableG->Message(1022, 0.0); if (pb::chk_highscore()) { - dynamic_cast(control_soundwave3_tag.Component)->Play(); + static_cast(control_soundwave3_tag.Component)->Play(); TableG->LightGroup->Message(16, 3.0); char* v11 = pinball::get_rc_string(177, 0); - dynamic_cast(control_mission_text_box_tag.Component)->Display(v11, -1.0); + static_cast(control_mission_text_box_tag.Component)->Display(v11, -1.0); } } else @@ -1136,25 +1136,25 @@ void control::BallDrainControl(int code, TPinballComponent* caller) } if (light_on(&control_lite200_tag)) { - dynamic_cast(control_soundwave27_tag.Component)->Play(); + static_cast(control_soundwave27_tag.Component)->Play(); control_lite200_tag.Component->Message(19, 0.0); - dynamic_cast(control_info_text_box_tag.Component)->Display( + static_cast(control_info_text_box_tag.Component)->Display( pinball::get_rc_string(96, 0), -1.0); - dynamic_cast(control_soundwave59_tag.Component)->Play(); + static_cast(control_soundwave59_tag.Component)->Play(); } else if (light_on(&control_lite199_tag)) { - dynamic_cast(control_soundwave27_tag.Component)->Play(); + static_cast(control_soundwave27_tag.Component)->Play(); control_lite199_tag.Component->Message(20, 0.0); control_lite200_tag.Component->Message(19, 0.0); - dynamic_cast(control_info_text_box_tag.Component)-> + static_cast(control_info_text_box_tag.Component)-> Display(pinball::get_rc_string(95, 0), 2.0); - dynamic_cast(control_soundwave59_tag.Component)->Play(); + static_cast(control_soundwave59_tag.Component)->Play(); --TableG->UnknownP78; } else if (TableG->UnknownP75) { - dynamic_cast(control_soundwave27_tag.Component)->Play(); + static_cast(control_soundwave27_tag.Component)->Play(); --TableG->UnknownP75; } else @@ -1163,14 +1163,14 @@ void control::BallDrainControl(int code, TPinballComponent* caller) { int time = SpecialAddScore(TableG->ScoreSpecial2); sprintf_s(Buffer, pinball::get_rc_string(94, 0), time); - dynamic_cast(control_info_text_box_tag.Component)->Display(Buffer, 2.0); + static_cast(control_info_text_box_tag.Component)->Display(Buffer, 2.0); } if (TableG->ExtraBalls) { TableG->ExtraBalls--; char* shootAgainText; - dynamic_cast(control_soundwave59_tag.Component)->Play(); + static_cast(control_soundwave59_tag.Component)->Play(); switch (TableG->CurrentPlayer) { case 0: @@ -1187,7 +1187,7 @@ void control::BallDrainControl(int code, TPinballComponent* caller) shootAgainText = pinball::get_rc_string(100, 0); break; } - dynamic_cast(control_info_text_box_tag.Component)->Display(shootAgainText, -1.0); + static_cast(control_info_text_box_tag.Component)->Display(shootAgainText, -1.0); } else { @@ -1201,7 +1201,7 @@ void control::BallDrainControl(int code, TPinballComponent* caller) { control_lite199_tag.Component->MessageField = 1; } - dynamic_cast(control_soundwave27_tag.Component)->Play(); + static_cast(control_soundwave27_tag.Component)->Play(); } control_bmpr_inc_lights_tag.Component->Message(20, 0.0); control_ramp_bmpr_inc_lights_tag.Component->Message(20, 0.0); diff --git a/SpaceCadetPinball/maths.cpp b/SpaceCadetPinball/maths.cpp index 7df3583..43eed05 100644 --- a/SpaceCadetPinball/maths.cpp +++ b/SpaceCadetPinball/maths.cpp @@ -178,7 +178,7 @@ void maths::line_init(line_type* line, float x0, float y0, float x1, float y1) normalize_2d(&line->Direction); line->PerpendicularL.X = line->Direction.Y; line->PerpendicularL.Y = -line->Direction.X; - line->PreComp1 = -(line->Direction.Y * x0) + (line->Direction.X * y0); + line->PreComp1 = -(line->Direction.Y * x0) + line->Direction.X * y0; if (line->Direction.X >= 0.000000001 || line->Direction.X <= -0.000000001) { v9 = x1; @@ -420,3 +420,47 @@ void maths::RotateVector(vector_type* vec, float angle) * vec->X = tmp */ } + +void maths::find_closest_edge(ramp_plane_type* plane, int planeCount, wall_point_type* wall, vector_type** lineEnd, + vector_type** lineStart) +{ + vector_type wallEnd{}, wallStart{}; + + wallStart.X = wall->X0; + wallStart.Y = wall->Y0; + wallEnd.Y = wall->Y1; + wallEnd.X = wall->X1; + + float maxDistance = 1000000000.0f; + ramp_plane_type* planePtr = plane; + for (auto index = 0; index < planeCount; index++) + { + auto vec1 = reinterpret_cast(&planePtr->V1), + vec2 = reinterpret_cast(&planePtr->V2), + vec3 = reinterpret_cast(&planePtr->V3); + auto distance = Distance(&wallStart, vec1) + Distance(&wallEnd, vec2); + if (distance < maxDistance) + { + maxDistance = distance; + *lineEnd = vec1; + *lineStart = vec2; + } + + distance = Distance(&wallStart, vec2) + Distance(&wallEnd, vec3); + if (distance < maxDistance) + { + maxDistance = distance; + *lineEnd = vec2; + *lineStart = vec3; + } + + distance = Distance(&wallStart, vec3) + Distance(&wallEnd, vec1); + if (distance < maxDistance) + { + maxDistance = distance; + *lineEnd = vec3; + *lineStart = vec1; + } + ++planePtr; + } +} diff --git a/SpaceCadetPinball/maths.h b/SpaceCadetPinball/maths.h index 82587ad..cfbf9f1 100644 --- a/SpaceCadetPinball/maths.h +++ b/SpaceCadetPinball/maths.h @@ -45,6 +45,32 @@ struct __declspec(align(4)) line_type vector_type RayIntersect; }; +struct vector_type2 +{ + int X; + int Y; +}; + +struct wall_point_type +{ + float X0; + float Y0; + float X1; + float Y1; +}; + +struct __declspec(align(4)) ramp_plane_type +{ + float Unknown12; + vector_type2 V0; + vector_type2 V1; + vector_type2 V2; + vector_type2 V3; + float GravityAngle1; + float GravityAngle2; + vector_type2 V5_Zero; +}; + class maths { @@ -69,4 +95,6 @@ public: static void RotatePt(vector_type* point, float sin, float cos, vector_type* origin); static float distance_to_flipper(ray_type* ray1, ray_type* ray2); static void RotateVector(vector_type* vec, float angle); + static void find_closest_edge(ramp_plane_type* plane, int planeCount, wall_point_type* wall, vector_type** lineEnd, + vector_type** lineStart); }; diff --git a/SpaceCadetPinball/pb.h b/SpaceCadetPinball/pb.h index 35748e7..4f6b0ed 100644 --- a/SpaceCadetPinball/pb.h +++ b/SpaceCadetPinball/pb.h @@ -9,7 +9,7 @@ class pb { public: static int time_ticks; - static float ball_speed_limit, time_now; + static float ball_speed_limit, time_now, time_next; static int cheat_mode, game_mode; static datFileStruct* record_table; static TPinballTable* MainTable; @@ -39,7 +39,6 @@ public: static float collide(float timeNow, float timeDelta, TBall* ball); private : static int demo_mode, mode_countdown_; - static float time_next; static high_score_struct highscore_table[5]; static int state; };