#ifndef GAME_H #define GAME_H #include #include #include #include #include "Font.h" #include "ScreenSettings.h" /* FIXME: Can't forward declare this enum in C++, unfortunately. * In C, enum sizes are always the same, so you can forward declare them. * In C++ instead, enum sizes are based on how many enums there are. * You cannot specify the underlying type until C++11. * But bumping the standard opens up a can of worms. I'd rather just move to C. -Misa */ #include "Enums.h" // Forward decl without including all of namespace tinyxml2 { class XMLDocument; class XMLElement; } /* 40 chars (160 bytes) covers the entire screen, + 1 more for null terminator */ #define MENU_TEXT_BYTES 161 struct MenuOption { char text[MENU_TEXT_BYTES]; bool active; uint32_t print_flags; }; //Menu IDs namespace Menu { enum MenuName { mainmenu, playerworlds, confirmshowlevelspath, showlevelspath, levellist, quickloadlevel, deletequicklevel, youwannaquit, errornostart, errorsavingsettings, errorloadinglevel, warninglevellist, graphicoptions, ed_settings, ed_desc, ed_music, ed_quit, ed_font, options, gameplayoptions, speedrunneroptions, setglitchrunner, advancedoptions, audiooptions, accessibility, controller, language, translator_main, translator_options, translator_options_limitscheck, translator_options_stats, translator_options_exploregame, translator_options_cutscenetest, translator_maintenance, translator_maintenance_sync, translator_error_setlangwritedir, cleardatamenu, clearcustomdatamenu, setinvincibility, setslowdown, unlockmenu, credits, credits2, credits25, credits3, credits4, credits5, credits6, credits_localisations_implementation, credits_localisations_translations, play, unlocktimetrial, unlocktimetrials, unlocknodeathmode, unlockintermission, unlockflipmode, newgamewarning, playmodes, intermissionmenu, playint1, playint2, continuemenu, startnodeathmode, gameover, gameover2, unlockmenutrials, timetrials, nodeathmodecomplete, nodeathmodecomplete2, timetrialcomplete, timetrialcomplete2, timetrialcomplete3, gamecompletecontinue }; } enum SLIDERMODE { SLIDER_NONE, SLIDER_MUSICVOLUME, SLIDER_SOUNDVOLUME }; /* enums for swngame variable */ enum SWNMODE { SWN_GRAVITRON, SWN_SUPERGRAVITRON, SWN_START_GRAVITRON_STEP_3, SWN_START_GRAVITRON_STEP_2, SWN_START_GRAVITRON_STEP_1, SWN_FINISH_GRAVITRON_STEP_1, SWN_START_SUPERGRAVITRON_STEP_1, SWN_START_SUPERGRAVITRON_STEP_2, SWN_FINISH_GRAVITRON_STEP_2, SWN_NONE }; /* enums for unlock, unlocknotify arrays and unlocknum function */ enum { Unlock_SPACESTATION1_COMPLETE = 0, Unlock_LABORATORY_COMPLETE = 1, Unlock_TOWER_COMPLETE = 2, Unlock_SPACESTATION2_COMPLETE = 3, Unlock_WARPZONE_COMPLETE = 4, UnlockTrophy_GAME_COMPLETE = 5, Unlock_INTERMISSION1_COMPLETE = 6, Unlock_INTERMISSION2_COMPLETE = 7, Unlock_SECRETLAB = 8, Unlock_TIMETRIAL_SPACESTATION1 = 9, Unlock_TIMETRIAL_LABORATORY = 10, Unlock_TIMETRIAL_TOWER = 11, Unlock_TIMETRIAL_SPACESTATION2 = 12, Unlock_TIMETRIAL_WARPZONE = 13, Unlock_TIMETRIAL_FINALLEVEL = 14, Unlock_INTERMISSION_UNUSED = 15, Unlock_INTERMISSION_REPLAYS = 16, Unlock_NODEATHMODE = 17, Unlock_FLIPMODE = 18, UnlockTrophy_FLIPMODE_COMPLETE = 19, UnlockTrophy_NODEATHMODE_COMPLETE = 20 }; /* enums for bestrank, bestlives, besttrinkets, besttimes, bestframes arrays * and timetriallevel */ enum { TimeTrial_SPACESTATION1 = 0, TimeTrial_LABORATORY = 1, TimeTrial_TOWER = 2, TimeTrial_SPACESTATION2 = 3, TimeTrial_WARPZONE = 4, TimeTrial_FINALLEVEL = 5 }; struct MenuStackFrame { int option; enum Menu::MenuName name; }; class Game { char magic[16]; public: void init(void); void setdefaultcontrollerbuttons(void); int crewrescued(void); std::string unrescued(void); void resetgameclock(void); bool customsavequick(const std::string& savfile); bool savequick(void); void gameclock(void); std::string giventimestring(int hrs, int min, int sec); std::string timestring(void); std::string resulttimestring(void); std::string timetstring(int t); void timestringcenti(char* buffer, size_t buffer_size); void returnmenu(void); void returntomenu(enum Menu::MenuName t); void createmenu(enum Menu::MenuName t, bool samemenu = false); bool can_unlock_ndm(void); void unlock_ndm(void); void lifesequence(void); void gethardestroom(void); void levelcomplete_textbox(void); void crewmate_textbox(const int color); void remaining_textbox(void); void actionprompt_textbox(void); void savetele_textbox(void); void setstate(int gamestate); void incstate(void); void setstatedelay(int delay); void lockstate(void); void unlockstate(void); void updatestate(void); void unlocknum(int t); void loadstats(struct ScreenSettings* screen_settings); bool savestats(const struct ScreenSettings* screen_settings, bool sync = true); bool savestats(bool sync = true); void deletestats(void); void deserializesettings(tinyxml2::XMLElement* dataNode, struct ScreenSettings* screen_settings); void serializesettings(tinyxml2::XMLElement* dataNode, const struct ScreenSettings* screen_settings); void loadsettings(struct ScreenSettings* screen_settings); bool savesettings(const struct ScreenSettings* screen_settings); bool savesettings(void); bool savestatsandsettings(void); void savestatsandsettings_menu(void); void deletesettings(void); void deletequick(void); bool savetele(void); void loadtele(void); void deletetele(void); void customstart(void); void start(void); void startspecial(int t); void starttrial(int t); void swnpenalty(void); void deathsequence(void); void customloadquick(const std::string& savfile); void loadquick(void); void customdeletequick(const std::string& file); void loadsummary(void); static const int numcrew = 6; struct Summary { bool exists; int seconds; int minutes; int hours; int saverx; int savery; int trinkets; bool crewstats[numcrew]; }; struct Summary last_telesave, last_quicksave; bool save_exists(void); void readmaingamesave(const char* savename, tinyxml2::XMLDocument& doc); struct Summary writemaingamesave(tinyxml2::XMLDocument& doc); void initteleportermode(void); const char* saveFilePath; int roomx, roomy; int prevroomx, prevroomy; int savex, savey, saverx, savery; int savegc, savedir; int savecolour; //Added for port int edsavex, edsavey, edsaverx, edsavery; int edsavegc, edsavedir; //State logic stuff int state, statedelay; bool glitchrunkludge; enum GameGamestate gamestate; enum GameGamestate prevgamestate; //only used sometimes bool hascontrol, jumpheld; int jumppressed; int gravitycontrol; bool isingamecompletescreen(void); bool muted; int mutebutton; bool musicmuted; int musicmutebutton; int tapleft, tapright; //Menu interaction stuff void mapmenuchange(const enum GameGamestate newgamestate, const bool user_initiated); bool mapheld; int menupage; int lastsaved; int deathcounts; int framecounter; bool seed_use_sdl_getticks; bool editor_disabled; int frames, seconds, minutes, hours; bool gamesaved; bool gamesavefailed; std::string savetime; int saveframes, saveseconds; int savetrinkets; bool startscript; std::string newscript; bool menustart; //Teleporting bool teleport_to_new_area; int teleport_to_x, teleport_to_y; std::string teleportscript; bool useteleporter; int teleport_to_teleporter; //Main Menu Variables std::vector menuoptions; int currentmenuoption ; bool menutestmode; enum Menu::MenuName currentmenuname; enum Menu::MenuName kludge_ingametemp; enum SLIDERMODE slidermode; int current_credits_list_index; int translator_credits_pagenum; int menuxoff, menuyoff; int menuspacing; std::vector menustack; void inline option(const char* text, bool active = true, uint32_t print_flags = PR_RTL_XFLIP) { MenuOption menuoption; SDL_strlcpy(menuoption.text, text, sizeof(menuoption.text)); menuoption.active = active; menuoption.print_flags = print_flags; menuoptions.push_back(menuoption); } int menucountdown; enum Menu::MenuName menudest; int creditposx, creditposy, creditposdelay; int oldcreditposx; bool silence_settings_error; //Sine Wave Ninja Minigame bool swnmode; enum SWNMODE swngame; int swnstate, swnstate2, swnstate3, swnstate4, swndelay, swndeaths; int swntimer, swncolstate, swncoldelay; int swnrecord, swnbestrank, swnrank, swnmessage; //SuperCrewMate Stuff bool supercrewmate, scmhurt; int scmprogress; //Accessibility Options bool colourblindmode; bool noflashingmode; int slowdown; int get_timestep(void); bool physics_frozen(void); bool nodeathmode; int gameoverdelay; bool nocutscenes; int ndmresultcrewrescued; int ndmresulttrinkets; std::string ndmresulthardestroom; int ndmresulthardestroom_x; int ndmresulthardestroom_y; bool ndmresulthardestroom_specialname; void copyndmresults(void); //Time Trials bool intimetrial, timetrialparlost; int timetrialcountdown, timetrialshinytarget, timetriallevel; int timetrialpar, timetrialresulttime, timetrialresultframes, timetrialrank; bool timetrialcheater; int timetrialresultshinytarget, timetrialresulttrinkets, timetrialresultpar; int timetrialresultdeaths; bool start_translator_exploring; bool translator_exploring; bool translator_exploring_allowtele; bool translator_cutscene_test; size_t cutscenetest_menu_page; std::string cutscenetest_menu_play_id; int creditposition; int oldcreditposition; bool insecretlab; bool inintermission; bool crewstats[numcrew]; bool ndmresultcrewstats[numcrew]; bool alarmon; int alarmdelay; bool blackout; static const int numunlock = 25; bool unlock[numunlock]; bool unlocknotify[numunlock]; bool anything_unlocked(void); int stat_trinkets; int bestgamedeaths; static const int numtrials = 6; int besttimes[numtrials]; int bestframes[numtrials]; int besttrinkets[numtrials]; int bestlives[numtrials]; int bestrank[numtrials]; int screenshake, flashlight; bool advancetext, pausescript; int deathseq, lifeseq; int trinkets(void); int crewmates(void); int savepoint, teleportxpos; bool teleport; int edteleportent; bool completestop; float inertia; int companion; SDL_Rect teleblock; bool activetele; int readytotele; int oldreadytotele; int activity_r, activity_g, activity_b, activity_y; std::string activity_lastprompt; bool activity_gettext; bool backgroundtext; int activeactivity, act_fade; int prev_act_fade; bool press_left, press_right, press_action, press_map, press_interact; bool interactheld; bool separate_interact; //Some stats: int totalflips; std::string hardestroom; // don't change to C string unless you wanna handle when this string is loaded from the XML int hardestroomdeaths, currentroomdeaths; int hardestroom_x, hardestroom_y; bool hardestroom_specialname; bool hardestroom_finalstretch; bool quickrestartkludge; //Custom stuff std::string customscript[50]; int customcol; int levelpage; int playcustomlevel; std::string customleveltitle; std::string customlevelfilename; void clearcustomlevelstats(void); void loadcustomlevelstats(void); void savecustomlevelstats(void); void updatecustomlevelstats(std::string clevel, int cscore); void deletecustomlevelstats(void); // name -> score. 0 - not played, 1 - finished, 2 - all trinkets, 3 - finished, all trinkets std::map customlevelstats; std::vector controllerButton_map; std::vector controllerButton_flip; std::vector controllerButton_esc; std::vector controllerButton_restart; std::vector controllerButton_interact; bool skipfakeload; bool ghostsenabled; bool cliplaytest; int playx; int playy; int playrx; int playry; int playgc; int playmusic; std::string playassets; void quittomenu(void); void returntolab(void); bool fadetomenu; int fadetomenudelay; bool fadetolab; int fadetolabdelay; void returntoeditor(void); bool inline inspecial(void) { return inintermission || insecretlab || intimetrial || nodeathmode || translator_exploring; } bool incompetitive(void); bool nocompetitive(void); bool nocompetitive_unless_translator(void); void sabotage_time_trial(void); bool over30mode; bool showingametimer; bool ingame_titlemode; bool ingame_editormode; void returntoingame(void); void unlockAchievement(const char *name); bool disablepause; bool disableaudiopause; bool disabletemporaryaudiopause; bool inputdelay; bool statelocked; int old_skip_message_timer; int skip_message_timer; int old_mode_indicator_timer; int mode_indicator_timer; int old_screenshot_border_timer; int screenshot_border_timer; bool screenshot_saved_success; }; #ifndef GAME_DEFINITION extern Game game; #endif #endif /* GAME_H */