1 // SONIC ROBO BLAST 2 2 //----------------------------------------------------------------------------- 3 // Copyright (C) 1993-1996 by id Software, Inc. 4 // Copyright (C) 1998-2000 by DooM Legacy Team. 5 // Copyright (C) 1999-2020 by Sonic Team Junior. 6 // 7 // This program is free software distributed under the 8 // terms of the GNU General Public License, version 2. 9 // See the 'LICENSE' file for more details. 10 //----------------------------------------------------------------------------- 11 /// \file g_game.h 12 /// \brief Game loop, events handling. 13 14 #ifndef __G_GAME__ 15 #define __G_GAME__ 16 17 #include "doomdef.h" 18 #include "doomstat.h" 19 #include "d_event.h" 20 #include "g_demo.h" 21 #include "m_cheat.h" // objectplacing 22 23 extern char gamedatafilename[64]; 24 extern char timeattackfolder[64]; 25 extern char customversionstring[32]; 26 #define GAMEDATASIZE (4*8192) 27 28 extern player_t *seenplayer; 29 extern char player_names[MAXPLAYERS][MAXPLAYERNAME+1]; 30 extern INT32 player_name_changes[MAXPLAYERS]; 31 32 extern player_t players[MAXPLAYERS]; 33 extern boolean playeringame[MAXPLAYERS]; 34 35 // gametic at level start 36 extern tic_t levelstarttic; 37 38 // for modding? 39 extern INT16 prevmap, nextmap; 40 extern INT32 gameovertics; 41 extern UINT8 ammoremovaltics; 42 extern tic_t timeinmap; // Ticker for time spent in level (used for levelcard display) 43 extern INT16 rw_maximums[NUM_WEAPONS]; 44 extern INT32 pausedelay; 45 extern boolean pausebreakkey; 46 47 extern boolean promptactive; 48 49 extern consvar_t cv_pauseifunfocused; 50 51 // used in game menu 52 extern consvar_t cv_tutorialprompt; 53 extern consvar_t cv_chatwidth, cv_chatnotifications, cv_chatheight, cv_chattime, cv_consolechat, cv_chatbacktint, cv_chatspamprotection, cv_compactscoreboard; 54 extern consvar_t cv_crosshair, cv_crosshair2; 55 extern consvar_t cv_invertmouse, cv_alwaysfreelook, cv_chasefreelook, cv_mousemove; 56 extern consvar_t cv_invertmouse2, cv_alwaysfreelook2, cv_chasefreelook2, cv_mousemove2; 57 58 extern consvar_t cv_useranalog[2], cv_analog[2]; 59 extern consvar_t cv_directionchar[2]; 60 61 typedef enum { 62 CS_LEGACY, 63 CS_LMAOGALOG, 64 CS_STANDARD, 65 CS_SIMPLE = CS_LMAOGALOG|CS_STANDARD, 66 } controlstyle_e; 67 #define G_ControlStyle(ssplayer) (cv_directionchar[(ssplayer)-1].value == 3 ? CS_LMAOGALOG : ((!objectplacing && cv_analog[(ssplayer)-1].value ? CS_LMAOGALOG : 0) | (cv_directionchar[(ssplayer)-1].value ? CS_STANDARD : 0))) 68 #define P_ControlStyle(player) ((((player)->pflags & PF_ANALOGMODE) ? CS_LMAOGALOG : 0) | (((player)->pflags & PF_DIRECTIONCHAR) ? CS_STANDARD : 0)) 69 70 extern consvar_t cv_autobrake, cv_autobrake2; 71 extern consvar_t cv_sideaxis,cv_turnaxis,cv_moveaxis,cv_lookaxis,cv_jumpaxis,cv_spinaxis,cv_fireaxis,cv_firenaxis,cv_deadzone,cv_digitaldeadzone; 72 extern consvar_t cv_sideaxis2,cv_turnaxis2,cv_moveaxis2,cv_lookaxis2,cv_jumpaxis2,cv_spinaxis2,cv_fireaxis2,cv_firenaxis2,cv_deadzone2,cv_digitaldeadzone2; 73 extern consvar_t cv_ghost_bestscore, cv_ghost_besttime, cv_ghost_bestrings, cv_ghost_last, cv_ghost_guest; 74 75 // hi here's some new controls 76 extern consvar_t cv_cam_shiftfacing[2], cv_cam_turnfacing[2], 77 cv_cam_turnfacingability[2], cv_cam_turnfacingspindash[2], cv_cam_turnfacinginput[2], 78 cv_cam_centertoggle[2], cv_cam_lockedinput[2], cv_cam_lockonboss[2]; 79 80 typedef enum 81 { 82 LOCK_BOSS = 1<<0, 83 LOCK_ENEMY = 1<<1, 84 LOCK_INTERESTS = 1<<2, 85 } lockassist_e; 86 87 88 // mouseaiming (looking up/down with the mouse or keyboard) 89 #define KB_LOOKSPEED (1<<25) 90 #define MAXPLMOVE (50) 91 #define SLOWTURNTICS (6) 92 93 // build an internal map name MAPxx from map number 94 const char *G_BuildMapName(INT32 map); 95 96 extern INT16 ticcmd_oldangleturn[2]; 97 extern boolean ticcmd_centerviewdown[2]; // For simple controls, lock the camera behind the player 98 extern mobj_t *ticcmd_ztargetfocus[2]; // Locking onto an object? 99 void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer); 100 101 // copy ticcmd_t to and fro the normal way 102 ticcmd_t *G_CopyTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n); 103 // copy ticcmd_t to and fro network packets 104 ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n); 105 106 // clip the console player aiming to the view 107 INT16 G_ClipAimingPitch(INT32 *aiming); 108 INT16 G_SoftwareClipAimingPitch(INT32 *aiming); 109 110 extern angle_t localangle, localangle2; 111 extern INT32 localaiming, localaiming2; // should be an angle_t but signed 112 113 // 114 // GAME 115 // 116 void G_ChangePlayerReferences(mobj_t *oldmo, mobj_t *newmo); 117 void G_DoReborn(INT32 playernum); 118 void G_PlayerReborn(INT32 player, boolean betweenmaps); 119 void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, 120 boolean skipprecutscene, boolean FLS); 121 char *G_BuildMapTitle(INT32 mapnum); 122 123 struct searchdim 124 { 125 UINT8 pos; 126 UINT8 siz; 127 }; 128 129 typedef struct 130 { 131 INT16 mapnum; 132 UINT8 matchc; 133 struct searchdim *matchd;/* offset that a pattern was matched */ 134 UINT8 keywhc; 135 struct searchdim *keywhd;/* ...in KEYWORD */ 136 UINT8 total;/* total hits */ 137 } 138 mapsearchfreq_t; 139 140 INT32 G_FindMap(const char *query, char **foundmapnamep, 141 mapsearchfreq_t **freqp, INT32 *freqc); 142 void G_FreeMapSearch(mapsearchfreq_t *freq, INT32 freqc); 143 144 /* Match map name by search + 2 digit map code or map number. */ 145 INT32 G_FindMapByNameOrCode(const char *query, char **foundmapnamep); 146 147 // XMOD spawning 148 mapthing_t *G_FindCTFStart(INT32 playernum); 149 mapthing_t *G_FindMatchStart(INT32 playernum); 150 mapthing_t *G_FindCoopStart(INT32 playernum); 151 mapthing_t *G_FindMapStart(INT32 playernum); 152 void G_MovePlayerToSpawnOrStarpost(INT32 playernum); 153 void G_SpawnPlayer(INT32 playernum); 154 155 // Can be called by the startup code or M_Responder. 156 // A normal game starts at map 1, but a warp test can start elsewhere 157 void G_DeferedInitNew(boolean pultmode, const char *mapname, INT32 pickedchar, 158 boolean SSSG, boolean FLS); 159 void G_DoLoadLevel(boolean resetplayer); 160 void G_StartTitleCard(void); 161 void G_PreLevelTitleCard(void); 162 boolean G_IsTitleCardAvailable(void); 163 164 // Can be called by the startup code or M_Responder, calls P_SetupLevel. 165 void G_LoadGame(UINT32 slot, INT16 mapoverride); 166 167 void G_SaveGameData(void); 168 169 void G_SaveGame(UINT32 slot, INT16 mapnum); 170 171 void G_SaveGameOver(UINT32 slot, boolean modifylives); 172 173 extern UINT32 gametypedefaultrules[NUMGAMETYPES]; 174 extern UINT32 gametypetol[NUMGAMETYPES]; 175 extern INT16 gametyperankings[NUMGAMETYPES]; 176 177 void G_SetGametype(INT16 gametype); 178 INT16 G_AddGametype(UINT32 rules); 179 void G_AddGametypeConstant(INT16 gtype, const char *newgtconst); 180 void G_UpdateGametypeSelections(void); 181 void G_AddTOL(UINT32 newtol, const char *tolname); 182 void G_AddGametypeTOL(INT16 gtype, UINT32 newtol); 183 void G_SetGametypeDescription(INT16 gtype, char *descriptiontext, UINT8 leftcolor, UINT8 rightcolor); 184 185 INT32 G_GetGametypeByName(const char *gametypestr); 186 boolean G_IsSpecialStage(INT32 mapnum); 187 boolean G_GametypeUsesLives(void); 188 boolean G_GametypeUsesCoopLives(void); 189 boolean G_GametypeUsesCoopStarposts(void); 190 boolean G_GametypeHasTeams(void); 191 boolean G_GametypeHasSpectators(void); 192 boolean G_RingSlingerGametype(void); 193 boolean G_PlatformGametype(void); 194 boolean G_CoopGametype(void); 195 boolean G_TagGametype(void); 196 boolean G_CompetitionGametype(void); 197 boolean G_EnoughPlayersFinished(void); 198 void G_ExitLevel(void); 199 void G_NextLevel(void); 200 void G_Continue(void); 201 void G_UseContinue(void); 202 void G_AfterIntermission(void); 203 void G_EndGame(void); // moved from y_inter.c/h and renamed 204 205 void G_Ticker(boolean run); 206 boolean G_Responder(event_t *ev); 207 208 void G_AddPlayer(INT32 playernum); 209 210 void G_SetExitGameFlag(void); 211 void G_ClearExitGameFlag(void); 212 boolean G_GetExitGameFlag(void); 213 214 void G_SetRetryFlag(void); 215 void G_ClearRetryFlag(void); 216 boolean G_GetRetryFlag(void); 217 218 void G_SetModeAttackRetryFlag(void); 219 void G_ClearModeAttackRetryFlag(void); 220 boolean G_GetModeAttackRetryFlag(void); 221 222 void G_LoadGameData(void); 223 void G_LoadGameSettings(void); 224 225 void G_SetGameModified(boolean silent); 226 227 void G_SetGamestate(gamestate_t newstate); 228 229 // Gamedata record shit 230 void G_AllocMainRecordData(INT16 i); 231 void G_AllocNightsRecordData(INT16 i); 232 void G_ClearRecords(void); 233 234 UINT32 G_GetBestScore(INT16 map); 235 tic_t G_GetBestTime(INT16 map); 236 UINT16 G_GetBestRings(INT16 map); 237 UINT32 G_GetBestNightsScore(INT16 map, UINT8 mare); 238 tic_t G_GetBestNightsTime(INT16 map, UINT8 mare); 239 UINT8 G_GetBestNightsGrade(INT16 map, UINT8 mare); 240 241 void G_AddTempNightsRecords(UINT32 pscore, tic_t ptime, UINT8 mare); 242 void G_SetNightsRecords(void); 243 244 FUNCMATH INT32 G_TicsToHours(tic_t tics); 245 FUNCMATH INT32 G_TicsToMinutes(tic_t tics, boolean full); 246 FUNCMATH INT32 G_TicsToSeconds(tic_t tics); 247 FUNCMATH INT32 G_TicsToCentiseconds(tic_t tics); 248 FUNCMATH INT32 G_TicsToMilliseconds(tic_t tics); 249 250 // Don't split up TOL handling 251 UINT32 G_TOLFlag(INT32 pgametype); 252 253 #endif 254