#pragma once #include "high_score.h" class TEdgeSegment; struct ray_type; struct GameInput; class TPinballTable; class DatFile; class TBall; class TTextBox; enum class Msg : int; enum class GameModes { InGame = 1, GameOver = 2, }; class UsingSdlHint { public: explicit UsingSdlHint(const char* name, const char* value) : HintName(name) { auto originalValue = SDL_GetHint(name); if (originalValue) strncpy(OriginalValue, originalValue, sizeof OriginalValue - 1); SDL_SetHint(name, value); } ~UsingSdlHint() { if (OriginalValue[0]) SDL_SetHint(HintName, OriginalValue); } private: char OriginalValue[40]{}; const char* HintName; }; class pb { public: static int time_ticks; static float time_now, time_next, time_ticks_remainder; static float BallMaxSpeed, BallHalfRadius, BallToBallCollisionDistance; static GameModes game_mode; static bool cheat_mode, CreditsActive; static DatFile* record_table; static TPinballTable* MainTable; static bool FullTiltMode, FullTiltDemoMode; static std::string DatFileName, BasePath; static ImU32 TextBoxColor; static int quickFlag; static TTextBox *InfoTextBox, *MissTextBox; static int init(); static int uninit(); static void SelectDatFile(const std::vector& dataSearchPaths); static void reset_table(); static void firsttime_setup(); static void mode_change(GameModes mode); static void toggle_demo(); static void replay_level(bool demoMode); static void ballset(float dx, float dy); static void frame(float dtMilliSec); static void timed_frame(float timeDelta); static void pause_continue(); static void loose_focus(); static void InputUp(GameInput input); static void InputDown(GameInput input); static void launch_ball(); static void end_game(); static void high_scores(); static void tilt_no_more(); static bool chk_highscore(); static void PushCheat(const std::string& cheat); static LPCSTR get_rc_string(Msg uID); static int get_rc_int(Msg uID, int* dst); static std::string make_path_name(const std::string& fileName); static void ShowMessageBox(Uint32 flags, LPCSTR title, LPCSTR message); private: static bool demo_mode; static float IdleTimerMs; static float BallToBallCollision(const ray_type& ray, const TBall& ball, TEdgeSegment** edge, float collisionDistance); };