28 {$ELSE} |
28 {$ELSE} |
29 program hwengine; |
29 program hwengine; |
30 {$ENDIF} |
30 {$ENDIF} |
31 |
31 |
32 uses SDLh, uMisc, uConsole, uGame, uConsts, uLand, uAmmos, uVisualGears, uGears, uStore, uWorld, uInputHandler, uSound, |
32 uses SDLh, uMisc, uConsole, uGame, uConsts, uLand, uAmmos, uVisualGears, uGears, uStore, uWorld, uInputHandler, uSound, |
33 uScript, uTeams, uStats, uIO, uLocale, uChat, uAI, uAIMisc, uRandom, uLandTexture, uCollisions, |
33 uScript, uTeams, uStats, uIO, uLocale, uChat, uAI, uAIMisc, uLandTexture, uCollisions, |
34 SysUtils, uTypes, uVariables, uCommands, uUtils, uCaptions, uDebug, uCommandHandlers, uLandPainted |
34 SysUtils, uTypes, uVariables, uCommands, uUtils, uCaptions, uDebug, uCommandHandlers, uLandPainted |
35 {$IFDEF SDL13}, uTouch{$ENDIF}{$IFDEF ANDROID}, GLUnit{$ENDIF}; |
35 {$IFDEF USE_VIDEO_RECORDING}, uVideoRec {$ENDIF} |
|
36 {$IFDEF SDL13}, uTouch{$ENDIF}{$IFDEF ANDROID}, GLUnit{$ENDIF}, uAILandMarks; |
|
37 |
36 |
38 |
37 {$IFDEF HWLIBRARY} |
39 {$IFDEF HWLIBRARY} |
38 procedure initEverything(complete:boolean); |
40 procedure initEverything(complete:boolean); |
39 procedure freeEverything(complete:boolean); |
41 procedure freeEverything(complete:boolean); |
40 procedure Game(gameArgs: PPChar); cdecl; export; |
42 procedure Game(gameArgs: PPChar); cdecl; export; |
99 exit(false); |
104 exit(false); |
100 end; |
105 end; |
101 |
106 |
102 SwapBuffers; |
107 SwapBuffers; |
103 |
108 |
|
109 {$IFDEF USE_VIDEO_RECORDING} |
|
110 if flagPrerecording then |
|
111 SaveCameraPosition; |
|
112 {$ENDIF} |
|
113 |
104 if flagMakeCapture then |
114 if flagMakeCapture then |
105 begin |
115 begin |
106 flagMakeCapture:= false; |
116 flagMakeCapture:= false; |
107 {$IFDEF PAS2C} |
117 {$IFDEF PAS2C} |
108 s:= 'hw'; |
118 s:= '/Screenshots/hw'; |
109 {$ELSE} |
119 {$ELSE} |
110 s:= 'hw_' + FormatDateTime('YYYY-MM-DD_HH-mm-ss', Now()) + inttostr(GameTicks); |
120 s:= '/Screenshots/hw_' + FormatDateTime('YYYY-MM-DD_HH-mm-ss', Now()) + inttostr(GameTicks); |
111 {$ENDIF} |
121 {$ENDIF} |
112 |
122 |
|
123 // flash |
113 playSound(sndShutter); |
124 playSound(sndShutter); |
114 |
125 ScreenFade:= sfFromWhite; |
115 if MakeScreenshot(s) then |
126 ScreenFadeValue:= sfMax; |
|
127 ScreenFadeSpeed:= 5; |
|
128 |
|
129 if MakeScreenshot(s, 1) then |
116 WriteLnToConsole('Screenshot saved: ' + s) |
130 WriteLnToConsole('Screenshot saved: ' + s) |
117 else |
131 else |
118 begin |
132 begin |
119 WriteLnToConsole('Screenshot failed.'); |
133 WriteLnToConsole('Screenshot failed.'); |
120 AddChatString(#5 + 'screen capture failed (lack of memory or write permissions)'); |
134 AddChatString(#5 + 'screen capture failed (lack of memory or write permissions)'); |
259 else SDL_Delay(1); |
273 else SDL_Delay(1); |
260 IPCCheckSock(); |
274 IPCCheckSock(); |
261 end; |
275 end; |
262 end; |
276 end; |
263 |
277 |
|
278 {$IFDEF USE_VIDEO_RECORDING} |
|
279 procedure RecorderMainLoop; |
|
280 var oldGameTicks, oldRealTicks, newGameTicks, newRealTicks: LongInt; |
|
281 begin |
|
282 if not BeginVideoRecording() then |
|
283 exit; |
|
284 DoTimer(0); // gsLandGen -> gsStart |
|
285 DoTimer(0); // gsStart -> gsGame |
|
286 |
|
287 if not LoadNextCameraPosition(newRealTicks, newGameTicks) then |
|
288 exit; |
|
289 fastScrolling:= true; |
|
290 DoGameTick(newGameTicks); |
|
291 fastScrolling:= false; |
|
292 oldRealTicks:= 0; |
|
293 oldGameTicks:= newGameTicks; |
|
294 |
|
295 while LoadNextCameraPosition(newRealTicks, newGameTicks) do |
|
296 begin |
|
297 IPCCheckSock(); |
|
298 DoGameTick(newGameTicks - oldGameTicks); |
|
299 if GameState = gsExit then |
|
300 break; |
|
301 ProcessVisualGears(newRealTicks - oldRealTicks); |
|
302 DrawWorld(newRealTicks - oldRealTicks); |
|
303 EncodeFrame(); |
|
304 oldRealTicks:= newRealTicks; |
|
305 oldGameTicks:= newGameTicks; |
|
306 end; |
|
307 StopVideoRecording(); |
|
308 end; |
|
309 {$ENDIF} |
|
310 |
264 /////////////// |
311 /////////////// |
265 procedure Game{$IFDEF HWLIBRARY}(gameArgs: PPChar); cdecl; export{$ENDIF}; |
312 procedure Game{$IFDEF HWLIBRARY}(gameArgs: PPChar); cdecl; export{$ENDIF}; |
266 var p: TPathType; |
313 var p: TPathType; |
267 s: shortstring; |
314 s: shortstring; |
268 i: LongInt; |
315 i: LongInt; |
325 |
372 |
326 WriteToConsole('Init SDL_ttf... '); |
373 WriteToConsole('Init SDL_ttf... '); |
327 SDLTry(TTF_Init() <> -1, true); |
374 SDLTry(TTF_Init() <> -1, true); |
328 WriteLnToConsole(msgOK); |
375 WriteLnToConsole(msgOK); |
329 |
376 |
330 // show main window |
377 {$IFDEF USE_VIDEO_RECORDING} |
331 if cFullScreen then |
378 if GameType = gmtRecord then |
332 ParseCommand('fullscr 1', true) |
379 InitOffscreenOpenGL() |
333 else |
380 else |
334 ParseCommand('fullscr 0', true); |
381 {$ENDIF} |
|
382 begin |
|
383 // show main window |
|
384 if cFullScreen then |
|
385 ParseCommand('fullscr 1', true) |
|
386 else |
|
387 ParseCommand('fullscr 0', true); |
|
388 end; |
335 |
389 |
336 ControllerInit(); // has to happen before InitKbdKeyTable to map keys |
390 ControllerInit(); // has to happen before InitKbdKeyTable to map keys |
337 InitKbdKeyTable(); |
391 InitKbdKeyTable(); |
338 AddProgress(); |
392 AddProgress(); |
339 |
393 |
366 s:= 'eproto ' + inttostr(cNetProtoVersion); |
420 s:= 'eproto ' + inttostr(cNetProtoVersion); |
367 SendIPCRaw(@s[0], Length(s) + 1); // send proto version |
421 SendIPCRaw(@s[0], Length(s) + 1); // send proto version |
368 |
422 |
369 InitTeams(); |
423 InitTeams(); |
370 AssignStores(); |
424 AssignStores(); |
|
425 |
|
426 if GameType = gmtRecord then |
|
427 SetSound(false); |
|
428 |
371 InitSound(); |
429 InitSound(); |
372 |
430 |
373 isDeveloperMode:= false; |
431 isDeveloperMode:= false; |
374 TryDo(InitStepsFlags = cifAllInited, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); |
432 TryDo(InitStepsFlags = cifAllInited, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); |
375 ParseCommand('rotmask', true); |
433 ParseCommand('rotmask', true); |
376 MainLoop(); |
434 |
|
435 {$IFDEF USE_VIDEO_RECORDING} |
|
436 if GameType = gmtRecord then |
|
437 RecorderMainLoop() |
|
438 else |
|
439 {$ENDIF} |
|
440 MainLoop(); |
377 |
441 |
378 // clean up all the memory allocated |
442 // clean up all the memory allocated |
379 freeEverything(true); |
443 freeEverything(true); |
380 end; |
444 end; |
381 |
445 |
410 uGears.initModule; |
474 uGears.initModule; |
411 uInputHandler.initModule; |
475 uInputHandler.initModule; |
412 //uLandGraphics does not need initialization |
476 //uLandGraphics does not need initialization |
413 //uLandObjects does not need initialization |
477 //uLandObjects does not need initialization |
414 //uLandTemplates does not need initialization |
478 //uLandTemplates does not need initialization |
415 uLandTexture.initModule; |
|
416 //uLocale does not need initialization |
479 //uLocale does not need initialization |
417 uRandom.initModule; |
|
418 uScript.initModule; |
480 uScript.initModule; |
419 uSound.initModule; |
481 uSound.initModule; |
420 uStats.initModule; |
482 uStats.initModule; |
421 uStore.initModule; |
483 uStore.initModule; |
422 uTeams.initModule; |
484 uTeams.initModule; |
430 begin |
492 begin |
431 if complete then |
493 if complete then |
432 begin |
494 begin |
433 WriteLnToConsole('Freeing resources...'); |
495 WriteLnToConsole('Freeing resources...'); |
434 uAI.freeModule; |
496 uAI.freeModule; |
|
497 uAILandMarks.freeModule; |
435 uAIMisc.freeModule; //stub |
498 uAIMisc.freeModule; //stub |
436 uCaptions.freeModule; |
499 uCaptions.freeModule; |
437 uWorld.freeModule; |
500 uWorld.freeModule; |
438 uVisualGears.freeModule; |
501 uVisualGears.freeModule; |
439 uTeams.freeModule; |
502 uTeams.freeModule; |
440 uInputHandler.freeModule; |
503 uInputHandler.freeModule; |
441 uStats.freeModule; //stub |
504 uStats.freeModule; //stub |
442 uSound.freeModule; |
505 uSound.freeModule; |
443 uScript.freeModule; |
506 uScript.freeModule; |
444 uRandom.freeModule; //stub |
507 //uRandom does not need to be freed |
445 //uLocale does not need to be freed |
508 //uLocale does not need to be freed |
446 //uLandTemplates does not need to be freed |
509 //uLandTemplates does not need to be freed |
447 uLandTexture.freeModule; |
510 uLandTexture.freeModule; |
448 //uLandObjects does not need to be freed |
511 //uLandObjects does not need to be freed |
449 //uLandGraphics does not need to be freed |
512 //uLandGraphics does not need to be freed |
527 if (ParamCount < 3) then |
591 if (ParamCount < 3) then |
528 GameType:= gmtSyntax |
592 GameType:= gmtSyntax |
529 else |
593 else |
530 if (ParamCount = 3) and ((ParamStr(3) = '--stats-only') or (ParamStr(3) = 'landpreview')) then |
594 if (ParamCount = 3) and ((ParamStr(3) = '--stats-only') or (ParamStr(3) = 'landpreview')) then |
531 internalSetGameTypeLandPreviewFromParameters() |
595 internalSetGameTypeLandPreviewFromParameters() |
|
596 else if ParamCount = cDefaultParamNum then |
|
597 internalStartGameWithParameters() |
|
598 {$IFDEF USE_VIDEO_RECORDING} |
|
599 else if ParamCount = cVideorecParamNum then |
|
600 internalStartVideoRecordingWithParameters() |
|
601 {$ENDIF} |
532 else |
602 else |
533 if (ParamCount = cDefaultParamNum) then |
603 playReplayFileWithParameters(); |
534 internalStartGameWithParameters() |
|
535 else |
|
536 playReplayFileWithParameters(); |
|
537 end; |
604 end; |
538 |
605 |
539 //////////////////////////////////////////////////////////////////////////////// |
606 //////////////////////////////////////////////////////////////////////////////// |
540 /////////////////////////////// m a i n //////////////////////////////////////// |
607 /////////////////////////////// m a i n //////////////////////////////////////// |
541 //////////////////////////////////////////////////////////////////////////////// |
608 //////////////////////////////////////////////////////////////////////////////// |