DEADSOFTWARE

restored automap cheat
[d2df-sdl.git] / src / game / g_main.pas
1 unit g_main;
3 interface
5 procedure Main();
6 procedure Init();
7 procedure Release();
8 procedure Update();
9 procedure Draw();
10 procedure KeyPress(K: Word);
11 procedure CharPress(C: Char);
13 var
14 GameDir: string;
15 DataDir: string;
16 MapsDir: string;
17 ModelsDir: string;
18 GameWAD: string;
20 implementation
22 uses
23 SDL2, GL, GLExt, WADEDITOR, e_log, g_window,
24 e_graphics, e_input, g_game, g_console, g_gui,
25 e_sound, g_options, g_sound, g_player,
26 g_weapons, SysUtils, g_triggers, MAPDEF, g_map,
27 MAPSTRUCT, g_menu, g_language, g_net, sfs;
29 var
30 charbuff: Array [0..15] of Char;
32 procedure Main();
33 begin
34 GetDir(0, GameDir);
35 MapsDir := GameDir + '/maps/';
36 DataDir := GameDir + '/data/';
37 ModelsDir := DataDir + 'models/';
38 GameWAD := DataDir + 'Game.wad';
40 e_InitLog(GameDir + '/' + LOG_FILENAME, WM_NEWFILE);
42 e_WriteLog('Read config file', MSG_NOTIFY);
43 g_Options_Read(GameDir + '/' + CONFIG_FILENAME);
45 //GetSystemDefaultLCID()
47 //e_WriteLog('Read language file', MSG_NOTIFY);
48 //g_Language_Load(DataDir + gLanguage + '.txt');
49 e_WriteLog(gLanguage, MSG_NOTIFY);
50 g_Language_Set(gLanguage);
52 {$IFDEF USE_SDLMIXER}
53 if SDL_Init({SDL_INIT_JOYSTICK or SDL_INIT_TIMER or SDL_INIT_VIDEO or SDL_INIT_AUDIO}SDL_INIT_EVERYTHING) < 0 then
54 {$ELSE}
55 if SDL_Init(SDL_INIT_JOYSTICK or SDL_INIT_TIMER or SDL_INIT_VIDEO) < 0 then
56 {$ENDIF}
57 raise Exception.Create('SDL: Init failed: ' + SDL_GetError());
59 SDL_StartTextInput();
61 e_WriteLog('Entering SDLMain', MSG_NOTIFY);
63 {$WARNINGS OFF}
64 SDLMain();
65 {$WARNINGS ON}
67 SDL_StopTextInput();
69 e_WriteLog('Releasing SDL', MSG_NOTIFY);
70 SDL_Quit();
71 end;
73 procedure Init();
74 var
75 a: Integer;
76 begin
77 Randomize;
79 e_WriteLog('Init Input', MSG_NOTIFY);
80 e_InitInput();
82 if (e_JoysticksAvailable > 0) then
83 e_WriteLog('Input: Joysticks available.', MSG_NOTIFY)
84 else
85 e_WriteLog('Input: No Joysticks.', MSG_NOTIFY);
87 if not gNoSound then
88 begin
89 e_WriteLog('Initializing sound system', MSG_NOTIFY);
90 e_InitSoundSystem();
91 end;
93 e_WriteLog('Init game', MSG_NOTIFY);
94 g_Game_Init();
96 for a := 0 to 15 do charbuff[a] := ' ';
97 end;
99 procedure Release();
100 begin
101 e_WriteLog('Releasing engine', MSG_NOTIFY);
102 e_ReleaseEngine();
104 e_WriteLog('Releasing Input', MSG_NOTIFY);
105 e_ReleaseInput();
107 if not gNoSound then
108 begin
109 e_WriteLog('Releasing FMOD', MSG_NOTIFY);
110 e_ReleaseSoundSystem();
111 end;
112 end;
114 procedure Update();
115 begin
116 g_Game_Update();
117 end;
119 procedure Draw();
120 begin
121 g_Game_Draw();
122 end;
124 function Translit(S: String): String;
125 var
126 i: Integer;
127 begin
128 Result := S;
129 for i := 1 to Length(Result) do
130 case Result[i] of
131 'É': Result[i] := 'Q';
132 'Ö': Result[i] := 'W';
133 'Ó': Result[i] := 'E';
134 'Ê': Result[i] := 'R';
135 'Å': Result[i] := 'T';
136 'Í': Result[i] := 'Y';
137 'Ã': Result[i] := 'U';
138 'Ø': Result[i] := 'I';
139 'Ù': Result[i] := 'O';
140 'Ç': Result[i] := 'P';
141 'Õ': Result[i] := Chr(219);
142 'Ú': Result[i] := Chr(221);
143 'Ô': Result[i] := 'A';
144 'Û': Result[i] := 'S';
145 'Â': Result[i] := 'D';
146 'À': Result[i] := 'F';
147 'Ï': Result[i] := 'G';
148 'Ð': Result[i] := 'H';
149 'Î': Result[i] := 'J';
150 'Ë': Result[i] := 'K';
151 'Ä': Result[i] := 'L';
152 'Æ': Result[i] := Chr(186);
153 'Ý': Result[i] := Chr(222);
154 'ß': Result[i] := 'Z';
155 '×': Result[i] := 'X';
156 'Ñ': Result[i] := 'C';
157 'Ì': Result[i] := 'V';
158 'È': Result[i] := 'B';
159 'Ò': Result[i] := 'N';
160 'Ü': Result[i] := 'M';
161 'Á': Result[i] := Chr(188);
162 'Þ': Result[i] := Chr(190);
163 end;
164 end;
167 function CheckCheat (ct: TStrings_Locale; eofs: Integer=0): Boolean;
168 var
169 ls1, ls2: string;
170 begin
171 ls1 := CheatEng[ct];
172 ls2 := Translit(CheatRus[ct]);
173 if length(ls1) = 0 then ls1 := '~';
174 if length(ls2) = 0 then ls2 := '~';
175 result :=
176 (Copy(charbuff, 17-Length(ls1)-eofs, Length(ls1)) = ls1) or
177 (Copy(charbuff, 17-Length(ls2)-eofs, Length(ls2)) = ls2) or
178 (Translit(Copy(charbuff, 17-Length(ls2)-eofs, Length(ls2))) = ls2);
179 end;
182 procedure Cheat();
183 const
184 CHEAT_DAMAGE = 500;
185 label
186 Cheated;
187 var
188 s, s2: string;
189 c: Char16;
190 a: Integer;
191 begin
192 if (not gGameOn) or (not gCheats) or ((gGameSettings.GameType <> GT_SINGLE) and
193 (gGameSettings.GameMode <> GM_COOP) and (not gDebugMode))
194 or g_Game_IsNet then Exit;
196 s := 'SOUND_GAME_RADIO';
198 //
199 if CheckCheat(I_GAME_CHEAT_GODMODE) then
200 begin
201 if gPlayer1 <> nil then gPlayer1.GodMode := not gPlayer1.GodMode;
202 if gPlayer2 <> nil then gPlayer2.GodMode := not gPlayer2.GodMode;
203 goto Cheated;
204 end;
205 // RAMBO
206 if CheckCheat(I_GAME_CHEAT_WEAPONS) then
207 begin
208 if gPlayer1 <> nil then gPlayer1.AllRulez(False);
209 if gPlayer2 <> nil then gPlayer2.AllRulez(False);
210 goto Cheated;
211 end;
212 // TANK
213 if CheckCheat(I_GAME_CHEAT_HEALTH) then
214 begin
215 if gPlayer1 <> nil then gPlayer1.AllRulez(True);
216 if gPlayer2 <> nil then gPlayer2.AllRulez(True);
217 goto Cheated;
218 end;
219 // IDDQD
220 if CheckCheat(I_GAME_CHEAT_DEATH) then
221 begin
222 if gPlayer1 <> nil then gPlayer1.Damage(CHEAT_DAMAGE, 0, 0, 0, HIT_TRAP);
223 if gPlayer2 <> nil then gPlayer2.Damage(CHEAT_DAMAGE, 0, 0, 0, HIT_TRAP);
224 s := 'SOUND_MONSTER_HAHA';
225 goto Cheated;
226 end;
227 //
228 if CheckCheat(I_GAME_CHEAT_DOORS) then
229 begin
230 g_Triggers_OpenAll();
231 goto Cheated;
232 end;
233 // GOODBYE
234 if CheckCheat(I_GAME_CHEAT_NEXTMAP) then
235 begin
236 if gTriggers <> nil then
237 for a := 0 to High(gTriggers) do
238 if gTriggers[a].TriggerType = TRIGGER_EXIT then
239 begin
240 gExitByTrigger := True;
241 g_Game_ExitLevel(gTriggers[a].Data.MapName);
242 Break;
243 end;
244 goto Cheated;
245 end;
246 //
247 s2 := Copy(charbuff, 15, 2);
248 if CheckCheat(I_GAME_CHEAT_CHANGEMAP, 2) and (s2[1] >= '0') and (s2[1] <= '9') and (s2[2] >= '0') and (s2[2] <= '9') then
249 begin
250 if g_Map_Exist(MapsDir+gGameSettings.WAD+':\MAP'+s2) then
251 begin
252 c := 'MAP00';
253 c[3] := s2[1];
254 c[4] := s2[2];
255 g_Game_ExitLevel(c);
256 end;
257 goto Cheated;
258 end;
259 //
260 if CheckCheat(I_GAME_CHEAT_FLY) then
261 begin
262 gFly := not gFly;
263 goto Cheated;
264 end;
265 // BULLFROG
266 if CheckCheat(I_GAME_CHEAT_JUMPS) then
267 begin
268 VEL_JUMP := 30-VEL_JUMP;
269 goto Cheated;
270 end;
271 // FORMULA1
272 if CheckCheat(I_GAME_CHEAT_SPEED) then
273 begin
274 MAX_RUNVEL := 32-MAX_RUNVEL;
275 goto Cheated;
276 end;
277 // CONDOM
278 if CheckCheat(I_GAME_CHEAT_SUIT) then
279 begin
280 if gPlayer1 <> nil then gPlayer1.GiveItem(ITEM_SUIT);
281 if gPlayer2 <> nil then gPlayer2.GiveItem(ITEM_SUIT);
282 goto Cheated;
283 end;
284 //
285 if CheckCheat(I_GAME_CHEAT_AIR) then
286 begin
287 if gPlayer1 <> nil then gPlayer1.GiveItem(ITEM_OXYGEN);
288 if gPlayer2 <> nil then gPlayer2.GiveItem(ITEM_OXYGEN);
289 goto Cheated;
290 end;
291 // PURELOVE
292 if CheckCheat(I_GAME_CHEAT_BERSERK) then
293 begin
294 if gPlayer1 <> nil then gPlayer1.GiveItem(ITEM_MEDKIT_BLACK);
295 if gPlayer2 <> nil then gPlayer2.GiveItem(ITEM_MEDKIT_BLACK);
296 goto Cheated;
297 end;
298 //
299 if CheckCheat(I_GAME_CHEAT_JETPACK) then
300 begin
301 if gPlayer1 <> nil then gPlayer1.GiveItem(ITEM_JETPACK);
302 if gPlayer2 <> nil then gPlayer2.GiveItem(ITEM_JETPACK);
303 goto Cheated;
304 end;
305 // CASPER
306 if CheckCheat(I_GAME_CHEAT_NOCLIP) then
307 begin
308 if gPlayer1 <> nil then gPlayer1.SwitchNoClip;
309 if gPlayer2 <> nil then gPlayer2.SwitchNoClip;
310 goto Cheated;
311 end;
312 //
313 if CheckCheat(I_GAME_CHEAT_NOTARGET) then
314 begin
315 if gPlayer1 <> nil then gPlayer1.NoTarget := not gPlayer1.NoTarget;
316 if gPlayer2 <> nil then gPlayer2.NoTarget := not gPlayer2.NoTarget;
317 goto Cheated;
318 end;
319 // INFERNO
320 if CheckCheat(I_GAME_CHEAT_NORELOAD) then
321 begin
322 if gPlayer1 <> nil then gPlayer1.NoReload := not gPlayer1.NoReload;
323 if gPlayer2 <> nil then gPlayer2.NoReload := not gPlayer2.NoReload;
324 goto Cheated;
325 end;
326 if CheckCheat(I_GAME_CHEAT_AIMLINE) then
327 begin
328 gAimLine := not gAimLine;
329 goto Cheated;
330 end;
331 if CheckCheat(I_GAME_CHEAT_AUTOMAP) then
332 begin
333 gShowMap := not gShowMap;
334 goto Cheated;
335 end;
336 Exit;
338 Cheated:
339 g_Sound_PlayEx(s);
340 end;
342 procedure KeyPress(K: Word);
343 var
344 Msg: g_gui.TMessage;
345 begin
346 case K of
347 IK_PAUSE: // <Pause/Break>:
348 begin
349 if (g_ActiveWindow = nil) then
350 g_Game_Pause(not gPause);
351 end;
353 IK_BACKQUOTE: // <`/~/¨/¸>:
354 begin
355 g_Console_Switch();
356 end;
358 IK_ESCAPE: // <Esc>:
359 begin
360 if gChatShow then
361 begin
362 g_Console_Chat_Switch();
363 Exit;
364 end;
366 if gConsoleShow then
367 g_Console_Switch()
368 else
369 if g_ActiveWindow <> nil then
370 begin
371 Msg.Msg := WM_KEYDOWN;
372 Msg.WParam := IK_ESCAPE;
373 g_ActiveWindow.OnMessage(Msg);
374 end
375 else
376 if gState <> STATE_FOLD then
377 if gGameOn
378 or (gState = STATE_INTERSINGLE)
379 or (gState = STATE_INTERCUSTOM)
380 then
381 g_Game_InGameMenu(True)
382 else
383 if (gExit = 0) and (gState <> STATE_SLIST) then
384 begin
385 if gState <> STATE_MENU then
386 if NetMode <> NET_NONE then
387 begin
388 g_Game_StopAllSounds(True);
389 g_Game_Free;
390 gState := STATE_MENU;
391 Exit;
392 end;
394 g_GUI_ShowWindow('MainMenu');
395 g_Sound_PlayEx('MENU_OPEN');
396 end;
397 end;
399 IK_F2, IK_F3, IK_F4, IK_F5, IK_F6, IK_F7, IK_F10:
400 begin // <F2> .. <F6> � <F12>
401 if gGameOn and (not gConsoleShow) and (not gChatShow) then
402 begin
403 while g_ActiveWindow <> nil do
404 g_GUI_HideWindow(False);
406 if (not g_Game_IsNet) then
407 g_Game_Pause(True);
409 case K of
410 IK_F2:
411 g_Menu_Show_SaveMenu();
412 IK_F3:
413 g_Menu_Show_LoadMenu();
414 IK_F4:
415 g_Menu_Show_GameSetGame();
416 IK_F5:
417 g_Menu_Show_OptionsVideo();
418 IK_F6:
419 g_Menu_Show_OptionsSound();
420 IK_F7:
421 g_Menu_Show_EndGameMenu();
422 IK_F10:
423 g_Menu_Show_QuitGameMenu();
424 end;
425 end;
426 end;
428 else
429 begin
430 gJustChatted := False;
431 if gConsoleShow or gChatShow then
432 g_Console_Control(K)
433 else
434 if g_ActiveWindow <> nil then
435 begin
436 Msg.Msg := WM_KEYDOWN;
437 Msg.WParam := K;
438 g_ActiveWindow.OnMessage(Msg);
439 end
440 else
441 begin
442 if (gState = STATE_MENU) then
443 begin
444 g_GUI_ShowWindow('MainMenu');
445 g_Sound_PlayEx('MENU_OPEN');
446 end;
447 end;
448 end;
449 end;
450 end;
452 procedure CharPress(C: Char);
453 var
454 Msg: g_gui.TMessage;
455 a: Integer;
456 begin
457 if (not gChatShow) and ((C = '`') or (C = '~') or (C = '¸') or (C = '¨')) then
458 Exit;
460 if gConsoleShow or gChatShow then
461 g_Console_Char(C)
462 else
463 if g_ActiveWindow <> nil then
464 begin
465 Msg.Msg := WM_CHAR;
466 Msg.WParam := Ord(C);
467 g_ActiveWindow.OnMessage(Msg);
468 end
469 else
470 begin
471 for a := 0 to 14 do charbuff[a] := charbuff[a+1];
472 charbuff[15] := SFSUpCase(C);
473 Cheat();
474 end;
475 end;
477 end.