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