author | Xeli |
Sun, 21 Aug 2011 22:17:40 +0200 | |
branch | hedgeroid |
changeset 5639 | ebe9858eb6a3 |
parent 5577 | 272c82f82cee |
child 5644 | 4ad07103cfae |
permissions | -rw-r--r-- |
2947 | 1 |
(* |
2 |
* Hedgewars, a free turn based strategy game |
|
4976 | 3 |
* Copyright (c) 2004-2011 Andrey Korotaev <unC0Rr@gmail.com> |
2947 | 4 |
* |
5 |
* This program is free software; you can redistribute it and/or modify |
|
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; version 2 of the License |
|
8 |
* |
|
9 |
* This program is distributed in the hope that it will be useful, |
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
13 |
* |
|
14 |
* You should have received a copy of the GNU General Public License |
|
15 |
* along with this program; if not, write to the Free Software |
|
16 |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|
17 |
*) |
|
51 | 18 |
|
2599 | 19 |
{$INCLUDE "options.inc"} |
2587
0dfa56a8513c
fix a segfault in the iphone simulator by moving options.inc at the beginning of the file
koda
parents:
2586
diff
changeset
|
20 |
|
2800 | 21 |
{$IFDEF WIN32} |
22 |
{$R hwengine.rc} |
|
23 |
{$ENDIF} |
|
24 |
||
2803
1f446fc5c8ec
allow to compile engine as library with HWLIBRARY symbol
koda
parents:
2800
diff
changeset
|
25 |
{$IFDEF HWLIBRARY} |
2698 | 26 |
unit hwengine; |
27 |
interface |
|
28 |
{$ELSE} |
|
51 | 29 |
program hwengine; |
2698 | 30 |
{$ENDIF} |
3407 | 31 |
|
3697 | 32 |
uses SDLh, uMisc, uConsole, uGame, uConsts, uLand, uAmmos, uVisualGears, uGears, uStore, uWorld, uKeys, uSound, |
5174
f5294509783e
initial refactoring of ObjcExports and OverlayViewController
koda
parents:
5167
diff
changeset
|
33 |
uScript, uTeams, uStats, uIO, uLocale, uChat, uAI, uAIMisc, uRandom, uLandTexture, uCollisions, |
5550
50650032c251
Zoom and moving the camera now works with SDL_FINGER* events
Xeli
parents:
5540
diff
changeset
|
34 |
sysutils, uTypes, uVariables, uCommands, uUtils, uCaptions, uDebug, uCommandHandlers, uLandPainted,uTouch {$IFDEF ANDROID}, GLUnit {$ENDIF}; |
3697 | 35 |
|
2803
1f446fc5c8ec
allow to compile engine as library with HWLIBRARY symbol
koda
parents:
2800
diff
changeset
|
36 |
{$IFDEF HWLIBRARY} |
3525 | 37 |
procedure initEverything(complete:boolean); |
38 |
procedure freeEverything(complete:boolean); |
|
5339 | 39 |
procedure Game(gameArgs: PPChar); cdecl; export; |
5458 | 40 |
procedure GenLandPreview(port: Longint); cdecl; export; |
51 | 41 |
|
2698 | 42 |
implementation |
43 |
{$ELSE} |
|
51 | 44 |
procedure OnDestroy; forward; |
3611 | 45 |
procedure initEverything(complete:boolean); forward; |
3525 | 46 |
procedure freeEverything(complete:boolean); forward; |
2698 | 47 |
{$ENDIF} |
51 | 48 |
|
49 |
//////////////////////////////// |
|
371 | 50 |
procedure DoTimer(Lag: LongInt); |
2905 | 51 |
var s: shortstring; |
51 | 52 |
begin |
4454 | 53 |
if isPaused = false then |
54 |
inc(RealTicks, Lag); |
|
564 | 55 |
|
2947 | 56 |
case GameState of |
57 |
gsLandGen: begin |
|
58 |
GenMap; |
|
4389 | 59 |
ParseCommand('sendlanddigest', true); |
2947 | 60 |
GameState:= gsStart; |
61 |
end; |
|
62 |
gsStart: begin |
|
63 |
if HasBorder then DisableSomeWeapons; |
|
64 |
AddClouds; |
|
4806
48c1a395f0a7
added flake configuration also in sudden death and SDClouds for underwater
Henek
parents:
4490
diff
changeset
|
65 |
AddFlakes; |
2947 | 66 |
AssignHHCoords; |
67 |
AddMiscGears; |
|
68 |
StoreLoad; |
|
69 |
InitWorld; |
|
70 |
ResetKbd; |
|
71 |
SoundLoad; |
|
72 |
if GameType = gmtSave then |
|
73 |
begin |
|
74 |
isSEBackup:= isSoundEnabled; |
|
75 |
isSoundEnabled:= false |
|
76 |
end; |
|
77 |
FinishProgress; |
|
78 |
PlayMusic; |
|
79 |
SetScale(zoom); |
|
80 |
ScriptCall('onGameStart'); |
|
81 |
GameState:= gsGame; |
|
82 |
end; |
|
83 |
gsConfirm, |
|
84 |
gsGame: begin |
|
85 |
DrawWorld(Lag); // never place between ProcessKbd and DoGameTick - bugs due to /put cmd and isCursorVisible |
|
86 |
ProcessKbd; |
|
3449
033e4a8a9c74
wait for AI thread to finish before freeing ressources (to avoid segfaults on game exit)
sheepluva
parents:
3444
diff
changeset
|
87 |
if not isPaused then |
033e4a8a9c74
wait for AI thread to finish before freeing ressources (to avoid segfaults on game exit)
sheepluva
parents:
3444
diff
changeset
|
88 |
begin |
3799 | 89 |
DoGameTick(Lag); |
3449
033e4a8a9c74
wait for AI thread to finish before freeing ressources (to avoid segfaults on game exit)
sheepluva
parents:
3444
diff
changeset
|
90 |
ProcessVisualGears(Lag); |
033e4a8a9c74
wait for AI thread to finish before freeing ressources (to avoid segfaults on game exit)
sheepluva
parents:
3444
diff
changeset
|
91 |
end; |
2947 | 92 |
end; |
93 |
gsChat: begin |
|
94 |
DrawWorld(Lag); |
|
3449
033e4a8a9c74
wait for AI thread to finish before freeing ressources (to avoid segfaults on game exit)
sheepluva
parents:
3444
diff
changeset
|
95 |
if not isPaused then |
033e4a8a9c74
wait for AI thread to finish before freeing ressources (to avoid segfaults on game exit)
sheepluva
parents:
3444
diff
changeset
|
96 |
begin |
3843 | 97 |
DoGameTick(Lag); |
3449
033e4a8a9c74
wait for AI thread to finish before freeing ressources (to avoid segfaults on game exit)
sheepluva
parents:
3444
diff
changeset
|
98 |
ProcessVisualGears(Lag); |
033e4a8a9c74
wait for AI thread to finish before freeing ressources (to avoid segfaults on game exit)
sheepluva
parents:
3444
diff
changeset
|
99 |
end; |
2947 | 100 |
end; |
101 |
gsExit: begin |
|
102 |
isTerminated:= true; |
|
103 |
end; |
|
4454 | 104 |
gsSuspend: exit; |
2947 | 105 |
end; |
564 | 106 |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2715
diff
changeset
|
107 |
{$IFDEF SDL13} |
5505
a55aab592950
Ditch the renderer system in sdl1.3 and use the 'old fashioned' sdl/opengl context. This gives us more flexibility and less problem in receiving video events (expecially on mobile platform) as well as not having to care to reset the gl context every time sdl interferes.
koda
parents:
5242
diff
changeset
|
108 |
SDL_GL_SwapWindow(SDLwindow); |
3523 | 109 |
{$ELSE} |
110 |
SDL_GL_SwapBuffers(); |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2715
diff
changeset
|
111 |
{$ENDIF} |
4454 | 112 |
|
2947 | 113 |
if flagMakeCapture then |
114 |
begin |
|
115 |
flagMakeCapture:= false; |
|
116 |
s:= 'hw_' + FormatDateTime('YYYY-MM-DD_HH-mm-ss', Now()) + inttostr(GameTicks); |
|
117 |
WriteLnToConsole('Saving ' + s + '...'); |
|
4359 | 118 |
playSound(sndShutter); |
4939
6d512ba87f72
screenshot binding for library (on ios it just plays the sound)
koda
parents:
4935
diff
changeset
|
119 |
{$IFNDEF IPHONEOS}MakeScreenshot(s);{$ENDIF} |
2947 | 120 |
end; |
51 | 121 |
end; |
122 |
||
123 |
//////////////////// |
|
79 | 124 |
procedure OnDestroy; |
51 | 125 |
begin |
2947 | 126 |
WriteLnToConsole('Freeing resources...'); |
3617 | 127 |
FreeActionsList(); |
2947 | 128 |
StoreRelease(); |
129 |
ControllerClose(); |
|
130 |
CloseIPC(); |
|
131 |
TTF_Quit(); |
|
3598 | 132 |
{$IFDEF SDL13} |
5505
a55aab592950
Ditch the renderer system in sdl1.3 and use the 'old fashioned' sdl/opengl context. This gives us more flexibility and less problem in receiving video events (expecially on mobile platform) as well as not having to care to reset the gl context every time sdl interferes.
koda
parents:
5242
diff
changeset
|
133 |
SDL_GL_DeleteContext(SDLGLcontext); |
3598 | 134 |
SDL_DestroyWindow(SDLwindow); |
5505
a55aab592950
Ditch the renderer system in sdl1.3 and use the 'old fashioned' sdl/opengl context. This gives us more flexibility and less problem in receiving video events (expecially on mobile platform) as well as not having to care to reset the gl context every time sdl interferes.
koda
parents:
5242
diff
changeset
|
135 |
SDLGLcontext:= nil; |
5166
d1eb1560b4d5
and now for something completely different, overlay refactoring!
koda
parents:
5130
diff
changeset
|
136 |
SDLwindow:= nil; |
3598 | 137 |
{$ENDIF} |
2947 | 138 |
SDL_Quit(); |
3063 | 139 |
isTerminated:= false; |
51 | 140 |
end; |
141 |
||
142 |
/////////////////// |
|
3697 | 143 |
procedure MainLoop; |
5339 | 144 |
{$WARNINGS OFF} |
145 |
// disable "Some fields weren't initialized" warning |
|
146 |
const event: TSDL_Event = (); |
|
147 |
{$WARNINGS ON} |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2715
diff
changeset
|
148 |
var PrevTime, CurrTime: Longword; |
5521 | 149 |
prevFocusState: boolean; |
2698 | 150 |
begin |
2947 | 151 |
PrevTime:= SDL_GetTicks; |
3063 | 152 |
while isTerminated = false do |
153 |
begin |
|
5286 | 154 |
{$IFDEF ANDROID} |
155 |
SDL_PumpEvents(); |
|
156 |
while SDL_PeepEvents(@event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT) > 0 do |
|
157 |
{$ELSE} |
|
158 |
while SDL_PollEvent(@event) <> 0 do |
|
159 |
{$ENDIF} |
|
2947 | 160 |
begin |
5339 | 161 |
case event.type_ of |
3647
0d0df215fb52
making chat work... (keyboard support is heavily broken in sdl upstream)
koda
parents:
3634
diff
changeset
|
162 |
SDL_KEYDOWN: if GameState = gsChat then |
4454 | 163 |
{$IFDEF SDL13} |
3647
0d0df215fb52
making chat work... (keyboard support is heavily broken in sdl upstream)
koda
parents:
3634
diff
changeset
|
164 |
// sdl on iphone supports only ashii keyboards and the unicode field is deprecated in sdl 1.3 |
0d0df215fb52
making chat work... (keyboard support is heavily broken in sdl upstream)
koda
parents:
3634
diff
changeset
|
165 |
KeyPressChat(event.key.keysym.sym); |
5339 | 166 |
SDL_WINDOWEVENT: |
5052 | 167 |
if event.window.event = SDL_WINDOWEVENT_SHOWN then |
5521 | 168 |
begin |
4454 | 169 |
cHasFocus:= true; |
5521 | 170 |
onFocusStateChanged() |
171 |
end; |
|
5550
50650032c251
Zoom and moving the camera now works with SDL_FINGER* events
Xeli
parents:
5540
diff
changeset
|
172 |
SDL_FINGERMOTION: onTouchMotion(event.tfinger.x, event.tfinger.y,event.tfinger.dx, event.tfinger.dy, event.tfinger.fingerId); |
50650032c251
Zoom and moving the camera now works with SDL_FINGER* events
Xeli
parents:
5540
diff
changeset
|
173 |
SDL_FINGERDOWN: onTouchDown(event.tfinger.x, event.tfinger.y, event.tfinger.fingerId); |
50650032c251
Zoom and moving the camera now works with SDL_FINGER* events
Xeli
parents:
5540
diff
changeset
|
174 |
SDL_FINGERUP: onTouchUp(event.tfinger.x, event.tfinger.y, event.tfinger.fingerId); |
3647
0d0df215fb52
making chat work... (keyboard support is heavily broken in sdl upstream)
koda
parents:
3634
diff
changeset
|
175 |
{$ELSE} |
0d0df215fb52
making chat work... (keyboard support is heavily broken in sdl upstream)
koda
parents:
3634
diff
changeset
|
176 |
KeyPressChat(event.key.keysym.unicode); |
4744
ecc2c757d0df
general uKey refactor in preparaiton of two new shortcuts
koda
parents:
4490
diff
changeset
|
177 |
SDL_MOUSEBUTTONDOWN: if event.button.button = SDL_BUTTON_WHEELDOWN then wheelDown:= true; |
ecc2c757d0df
general uKey refactor in preparaiton of two new shortcuts
koda
parents:
4490
diff
changeset
|
178 |
SDL_MOUSEBUTTONUP: if event.button.button = SDL_BUTTON_WHEELUP then wheelUp:= true; |
2947 | 179 |
SDL_ACTIVEEVENT: |
180 |
if (event.active.state and SDL_APPINPUTFOCUS) <> 0 then |
|
5521 | 181 |
begin |
182 |
prevFocusState:= cHasFocus; |
|
2947 | 183 |
cHasFocus:= event.active.gain = 1; |
5521 | 184 |
if prevFocusState xor cHasFocus then |
185 |
onFocusStateChanged() |
|
186 |
end; |
|
3463 | 187 |
{$ENDIF} |
2947 | 188 |
SDL_JOYAXISMOTION: ControllerAxisEvent(event.jaxis.which, event.jaxis.axis, event.jaxis.value); |
189 |
SDL_JOYHATMOTION: ControllerHatEvent(event.jhat.which, event.jhat.hat, event.jhat.value); |
|
190 |
SDL_JOYBUTTONDOWN: ControllerButtonEvent(event.jbutton.which, event.jbutton.button, true); |
|
191 |
SDL_JOYBUTTONUP: ControllerButtonEvent(event.jbutton.which, event.jbutton.button, false); |
|
192 |
SDL_QUITEV: isTerminated:= true |
|
4454 | 193 |
end; //end case event.type_ of |
194 |
end; //end while SDL_PollEvent(@event) <> 0 do |
|
3463 | 195 |
|
3063 | 196 |
if isTerminated = false then |
2947 | 197 |
begin |
3063 | 198 |
CurrTime:= SDL_GetTicks; |
3976 | 199 |
if PrevTime + longword(cTimerInterval) <= CurrTime then |
3063 | 200 |
begin |
201 |
DoTimer(CurrTime - PrevTime); |
|
202 |
PrevTime:= CurrTime |
|
3697 | 203 |
end |
3063 | 204 |
else SDL_Delay(1); |
205 |
IPCCheckSock(); |
|
206 |
end; |
|
207 |
end; |
|
2698 | 208 |
end; |
209 |
||
210 |
/////////////// |
|
2803
1f446fc5c8ec
allow to compile engine as library with HWLIBRARY symbol
koda
parents:
2800
diff
changeset
|
211 |
{$IFDEF HWLIBRARY} |
5339 | 212 |
procedure Game(gameArgs: PPChar); cdecl; export; |
2702
48fc46a922fd
rewrite gamesetup to use less memory, rename effects to sound plus some nice actions, settings work in game again
koda
parents:
2699
diff
changeset
|
213 |
{$ELSE} |
3064 | 214 |
procedure Game; |
2702
48fc46a922fd
rewrite gamesetup to use less memory, rename effects to sound plus some nice actions, settings work in game again
koda
parents:
2699
diff
changeset
|
215 |
{$ENDIF} |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2947
diff
changeset
|
216 |
var p: TPathType; |
2947 | 217 |
s: shortstring; |
3611 | 218 |
i: LongInt; |
2698 | 219 |
begin |
2803
1f446fc5c8ec
allow to compile engine as library with HWLIBRARY symbol
koda
parents:
2800
diff
changeset
|
220 |
{$IFDEF HWLIBRARY} |
2947 | 221 |
cBits:= 32; |
5365
326c7db9e410
Added an argument to Game(PChar) which provides a path to the data folder. This allows the user/java side to change from internal sdcard to sdcard
Xeli
parents:
5359
diff
changeset
|
222 |
cTimerInterval:= 8; |
326c7db9e410
Added an argument to Game(PChar) which provides a path to the data folder. This allows the user/java side to change from internal sdcard to sdcard
Xeli
parents:
5359
diff
changeset
|
223 |
{$IFDEF ANDROID} |
326c7db9e410
Added an argument to Game(PChar) which provides a path to the data folder. This allows the user/java side to change from internal sdcard to sdcard
Xeli
parents:
5359
diff
changeset
|
224 |
PathPrefix:= gameArgs[11]; |
326c7db9e410
Added an argument to Game(PChar) which provides a path to the data folder. This allows the user/java side to change from internal sdcard to sdcard
Xeli
parents:
5359
diff
changeset
|
225 |
cFullScreen:= true; |
326c7db9e410
Added an argument to Game(PChar) which provides a path to the data folder. This allows the user/java side to change from internal sdcard to sdcard
Xeli
parents:
5359
diff
changeset
|
226 |
{$ELSE} |
326c7db9e410
Added an argument to Game(PChar) which provides a path to the data folder. This allows the user/java side to change from internal sdcard to sdcard
Xeli
parents:
5359
diff
changeset
|
227 |
PathPrefix:= 'Data'; |
2947 | 228 |
cFullScreen:= false; |
5365
326c7db9e410
Added an argument to Game(PChar) which provides a path to the data folder. This allows the user/java side to change from internal sdcard to sdcard
Xeli
parents:
5359
diff
changeset
|
229 |
{$ENDIF} |
5339 | 230 |
UserPathPrefix:= '.'; |
5109
6d2e8a24277e
strangely enough, the new sdl rotation code is incompatible with our system... this is a workaround that should hold up until their code becomes more stable
koda
parents:
5066
diff
changeset
|
231 |
cShowFPS:= {$IFDEF DEBUGFILE}true{$ELSE}false{$ENDIF}; |
5339 | 232 |
val(gameArgs[0], ipcPort); |
233 |
val(gameArgs[1], cScreenWidth); |
|
234 |
val(gameArgs[2], cScreenHeight); |
|
235 |
val(gameArgs[3], cReducedQuality); |
|
236 |
cLocaleFName:= gameArgs[4]; |
|
237 |
UserNick:= gameArgs[5]; |
|
238 |
isSoundEnabled:= gameArgs[6] = '1'; |
|
239 |
isMusicEnabled:= gameArgs[7] = '1'; |
|
240 |
cAltDamage:= gameArgs[8] = '1'; |
|
241 |
val(gameArgs[9], rotationQt); |
|
242 |
recordFileName:= gameArgs[10]; |
|
4814
e19791f08443
smaller rearrangement of (non stereo related) variables
koda
parents:
4812
diff
changeset
|
243 |
cStereoMode:= smNone; |
3624 | 244 |
{$ENDIF} |
3613 | 245 |
|
3611 | 246 |
initEverything(true); |
247 |
WriteLnToConsole('Hedgewars ' + cVersionString + ' engine (network protocol: ' + inttostr(cNetProtoVersion) + ')'); |
|
248 |
AddFileLog('Prefix: "' + PathPrefix +'"'); |
|
5339 | 249 |
AddFileLog('UserPrefix: "' + UserPathPrefix +'"'); |
3611 | 250 |
for i:= 0 to ParamCount do |
251 |
AddFileLog(inttostr(i) + ': ' + ParamStr(i)); |
|
2698 | 252 |
|
2947 | 253 |
for p:= Succ(Low(TPathType)) to High(TPathType) do |
5339 | 254 |
if (p <> ptMapCurrent) and (p <> ptData) then UserPathz[p]:= UserPathPrefix + '/Data/' + Pathz[p]; |
255 |
||
256 |
UserPathz[ptData]:= UserPathPrefix + '/Data'; |
|
257 |
||
258 |
for p:= Succ(Low(TPathType)) to High(TPathType) do |
|
2947 | 259 |
if p <> ptMapCurrent then Pathz[p]:= PathPrefix + '/' + Pathz[p]; |
3697 | 260 |
|
2947 | 261 |
WriteToConsole('Init SDL... '); |
4773
69f8431a5d20
yay, sdl resumed development and accepted some of our patches in mainstream
koda
parents:
4744
diff
changeset
|
262 |
SDLTry(SDL_Init(SDL_INIT_VIDEO or SDL_INIT_NOPARACHUTE) >= 0, true); |
2947 | 263 |
WriteLnToConsole(msgOK); |
2698 | 264 |
|
2947 | 265 |
SDL_EnableUNICODE(1); |
5565 | 266 |
SDL_ShowCursor(0); |
2698 | 267 |
|
2947 | 268 |
WriteToConsole('Init SDL_ttf... '); |
269 |
SDLTry(TTF_Init() <> -1, true); |
|
270 |
WriteLnToConsole(msgOK); |
|
2698 | 271 |
|
5565 | 272 |
// show main window |
273 |
if cFullScreen then ParseCommand('fullscr 1', true) |
|
274 |
else ParseCommand('fullscr 0', true); |
|
2698 | 275 |
|
2947 | 276 |
ControllerInit(); // has to happen before InitKbdKeyTable to map keys |
277 |
InitKbdKeyTable(); |
|
5174
f5294509783e
initial refactoring of ObjcExports and OverlayViewController
koda
parents:
5167
diff
changeset
|
278 |
AddProgress(); |
2698 | 279 |
|
5339 | 280 |
LoadLocale(UserPathz[ptLocale] + '/en.txt'); // Do an initial load with english |
2947 | 281 |
LoadLocale(Pathz[ptLocale] + '/en.txt'); // Do an initial load with english |
5110 | 282 |
if (Length(cLocaleFName) > 6) then cLocale := Copy(cLocaleFName,1,5) |
283 |
else cLocale := Copy(cLocaleFName,1,2); |
|
2947 | 284 |
if cLocaleFName <> 'en.txt' then |
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3976
diff
changeset
|
285 |
begin |
2719 | 286 |
// Try two letter locale first before trying specific locale overrides |
5110 | 287 |
if (Length(cLocale) > 2) and (Copy(cLocale,1,2) <> 'en') then |
5339 | 288 |
begin |
289 |
LoadLocale(UserPathz[ptLocale] + '/' + Copy(cLocale,1,2)+'.txt'); |
|
290 |
LoadLocale(Pathz[ptLocale] + '/' + Copy(cLocale,1,2)+'.txt') |
|
291 |
end; |
|
292 |
LoadLocale(UserPathz[ptLocale] + '/' + cLocaleFName); |
|
293 |
LoadLocale(Pathz[ptLocale] + '/' + cLocaleFName) |
|
5107
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5066
diff
changeset
|
294 |
end |
d7fc678d78f4
Allow override of voicepack with a locale voicepack. Untested, but should mean that a Default voice should use the Ukranian version if that is their locale.
nemo
parents:
5066
diff
changeset
|
295 |
else cLocale := 'en'; |
2698 | 296 |
|
3904
22e4d74240e5
finishing touches to save games handling (help label, dim on overlay, edit text only when table is editable)
koda
parents:
3843
diff
changeset
|
297 |
WriteLnToConsole(msgGettingConfig); |
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3976
diff
changeset
|
298 |
|
2947 | 299 |
if recordFileName = '' then |
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3976
diff
changeset
|
300 |
begin |
3904
22e4d74240e5
finishing touches to save games handling (help label, dim on overlay, edit text only when table is editable)
koda
parents:
3843
diff
changeset
|
301 |
InitIPC; |
22e4d74240e5
finishing touches to save games handling (help label, dim on overlay, edit text only when table is editable)
koda
parents:
3843
diff
changeset
|
302 |
SendIPCAndWaitReply('C'); // ask for game config |
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3976
diff
changeset
|
303 |
end |
2947 | 304 |
else |
305 |
LoadRecordFromFile(recordFileName); |
|
2698 | 306 |
|
2947 | 307 |
ScriptOnGameInit; |
2786 | 308 |
|
2947 | 309 |
s:= 'eproto ' + inttostr(cNetProtoVersion); |
310 |
SendIPCRaw(@s[0], Length(s) + 1); // send proto version |
|
311 |
||
312 |
InitTeams(); |
|
313 |
AssignStores(); |
|
2698 | 314 |
|
2947 | 315 |
if isSoundEnabled then |
316 |
InitSound(); |
|
2590 | 317 |
|
2947 | 318 |
isDeveloperMode:= false; |
2698 | 319 |
|
2947 | 320 |
TryDo(InitStepsFlags = cifAllInited, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); |
2698 | 321 |
|
2947 | 322 |
ParseCommand('rotmask', true); |
2698 | 323 |
|
2947 | 324 |
MainLoop(); |
3615 | 325 |
// clean up SDL and GL context |
2947 | 326 |
OnDestroy(); |
3615 | 327 |
// clean up all the other memory allocated |
3611 | 328 |
freeEverything(true); |
3165
3ec07a7d8456
just some very sane stuff for the iphone port (plus some macro on pascal files)
koda
parents:
3162
diff
changeset
|
329 |
if alsoShutdownFrontend then halt; |
2698 | 330 |
end; |
2590 | 331 |
|
3525 | 332 |
procedure initEverything (complete:boolean); |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
333 |
begin |
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3312
diff
changeset
|
334 |
Randomize(); |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3312
diff
changeset
|
335 |
|
5565 | 336 |
if complete then cLogfileBase:= 'game' |
337 |
else cLogfileBase:= 'preview'; |
|
338 |
||
3709 | 339 |
// uConsts does not need initialization as they are all consts |
4374 | 340 |
uUtils.initModule; |
3038 | 341 |
uMisc.initModule; |
4359 | 342 |
uVariables.initModule; |
3038 | 343 |
uConsole.initModule; // MUST happen after uMisc |
4373 | 344 |
uCommands.initModule; |
4413 | 345 |
uCommandHandlers.initModule; |
3525 | 346 |
|
3038 | 347 |
uLand.initModule; |
4490 | 348 |
uLandPainted.initModule; |
349 |
||
3525 | 350 |
uIO.initModule; |
3697 | 351 |
|
3525 | 352 |
if complete then |
353 |
begin |
|
5359
86b76c93a612
put back GLUnit in the uses clause, indentation fix, path fix
Xeli
parents:
5339
diff
changeset
|
354 |
{$IFDEF ANDROID} |
5286 | 355 |
GLUnit.init; |
5359
86b76c93a612
put back GLUnit in the uses clause, indentation fix, path fix
Xeli
parents:
5339
diff
changeset
|
356 |
{$ENDIF} |
5550
50650032c251
Zoom and moving the camera now works with SDL_FINGER* events
Xeli
parents:
5540
diff
changeset
|
357 |
uTouch.initModule; |
5286 | 358 |
uAI.initModule; |
3525 | 359 |
//uAIActions does not need initialization |
360 |
//uAIAmmoTests does not need initialization |
|
361 |
uAIMisc.initModule; |
|
362 |
uAmmos.initModule; |
|
363 |
uChat.initModule; |
|
364 |
uCollisions.initModule; |
|
365 |
//uFloat does not need initialization |
|
366 |
//uGame does not need initialization |
|
367 |
uGears.initModule; |
|
368 |
uKeys.initModule; |
|
369 |
//uLandGraphics does not need initialization |
|
370 |
//uLandObjects does not need initialization |
|
371 |
//uLandTemplates does not need initialization |
|
3612
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3611
diff
changeset
|
372 |
uLandTexture.initModule; |
3525 | 373 |
//uLocale does not need initialization |
3697 | 374 |
uRandom.initModule; |
3525 | 375 |
uScript.initModule; |
376 |
uSound.initModule; |
|
377 |
uStats.initModule; |
|
378 |
uStore.initModule; |
|
379 |
uTeams.initModule; |
|
380 |
uVisualGears.initModule; |
|
381 |
uWorld.initModule; |
|
4393 | 382 |
uCaptions.initModule; |
3525 | 383 |
end; |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
384 |
end; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
385 |
|
3525 | 386 |
procedure freeEverything (complete:boolean); |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
387 |
begin |
3525 | 388 |
if complete then |
389 |
begin |
|
4393 | 390 |
uCaptions.freeModule; |
3525 | 391 |
uWorld.freeModule; |
3615 | 392 |
uVisualGears.freeModule; |
3525 | 393 |
uTeams.freeModule; |
394 |
uStore.freeModule; //stub |
|
395 |
uStats.freeModule; //stub |
|
3615 | 396 |
uSound.freeModule; |
3525 | 397 |
uScript.freeModule; |
398 |
uRandom.freeModule; //stub |
|
399 |
//uLocale does not need to be freed |
|
400 |
//uLandTemplates does not need to be freed |
|
3612
b50215a8a43d
land arrays are allocated dynamically, so DOWNSCALE and LOWRES macros are now removed and replaced by run time flags rqBlurryLand and rqLowRes
koda
parents:
3611
diff
changeset
|
401 |
uLandTexture.freeModule; |
3525 | 402 |
//uLandObjects does not need to be freed |
403 |
//uLandGraphics does not need to be freed |
|
404 |
uKeys.freeModule; //stub |
|
405 |
uGears.freeModule; |
|
406 |
//uGame does not need to be freed |
|
407 |
//uFloat does not need to be freed |
|
408 |
uCollisions.freeModule; //stub |
|
4901 | 409 |
uChat.freeModule; |
3525 | 410 |
uAmmos.freeModule; |
411 |
uAIMisc.freeModule; //stub |
|
412 |
//uAIAmmoTests does not need to be freed |
|
413 |
//uAIActions does not need to be freed |
|
3617 | 414 |
uAI.freeModule; //stub |
3525 | 415 |
end; |
3697 | 416 |
|
3525 | 417 |
uIO.freeModule; //stub |
3038 | 418 |
uLand.freeModule; |
5066 | 419 |
uLandPainted.freeModule; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2715
diff
changeset
|
420 |
|
4413 | 421 |
uCommandHandlers.freeModule; |
4373 | 422 |
uCommands.freeModule; |
3038 | 423 |
uConsole.freeModule; |
4359 | 424 |
uVariables.freeModule; |
4374 | 425 |
uUtils.freeModule; |
3525 | 426 |
uMisc.freeModule; // uMisc closes the debug log. |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
427 |
end; |
2803
1f446fc5c8ec
allow to compile engine as library with HWLIBRARY symbol
koda
parents:
2800
diff
changeset
|
428 |
|
2698 | 429 |
///////////////////////// |
3610 | 430 |
procedure GenLandPreview{$IFDEF HWLIBRARY}(port: LongInt); cdecl; export{$ENDIF}; |
2698 | 431 |
var Preview: TPreview; |
432 |
begin |
|
3611 | 433 |
initEverything(false); |
3610 | 434 |
{$IFDEF HWLIBRARY} |
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3312
diff
changeset
|
435 |
WriteLnToConsole('Preview connecting on port ' + inttostr(port)); |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3312
diff
changeset
|
436 |
ipcPort:= port; |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3312
diff
changeset
|
437 |
{$ENDIF} |
2947 | 438 |
InitIPC; |
439 |
IPCWaitPongEvent; |
|
440 |
TryDo(InitStepsFlags = cifRandomize, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); |
|
2698 | 441 |
|
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3312
diff
changeset
|
442 |
Preview:= GenPreview(); |
2947 | 443 |
WriteLnToConsole('Sending preview...'); |
444 |
SendIPCRaw(@Preview, sizeof(Preview)); |
|
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3312
diff
changeset
|
445 |
SendIPCRaw(@MaxHedgehogs, sizeof(byte)); |
2947 | 446 |
WriteLnToConsole('Preview sent, disconnect'); |
447 |
CloseIPC(); |
|
3525 | 448 |
freeEverything(false); |
2698 | 449 |
end; |
450 |
||
3021 | 451 |
{$IFNDEF HWLIBRARY} |
2008 | 452 |
///////////////////// |
453 |
procedure DisplayUsage; |
|
2691 | 454 |
var i: LongInt; |
2008 | 455 |
begin |
2947 | 456 |
WriteLn('Wrong argument format: correct configurations is'); |
457 |
WriteLn(); |
|
5339 | 458 |
WriteLn(' hwengine <path to user hedgewars folder> <path to global data folder> <path to replay file> [options]'); |
2947 | 459 |
WriteLn(); |
3678
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
460 |
WriteLn('where [options] must be specified either as:'); |
2947 | 461 |
WriteLn(' --set-video [screen width] [screen height] [color dept]'); |
462 |
WriteLn(' --set-audio [volume] [enable music] [enable sounds]'); |
|
463 |
WriteLn(' --set-other [language file] [full screen] [show FPS]'); |
|
3678
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
464 |
WriteLn(' --set-multimedia [screen width] [screen height] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen]'); |
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
465 |
WriteLn(' --set-everything [screen width] [screen height] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen] [show FPS] [alternate damage] [timer value] [reduced quality]'); |
5130
3602ede67ec5
Add a parameter for game simulation with no gui/sound enabled, just to get statistics
unc0rr
parents:
5111
diff
changeset
|
466 |
WriteLn(' --stats-only'); |
2947 | 467 |
WriteLn(); |
3678
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
468 |
WriteLn('Read documentation online at http://code.google.com/p/hedgewars/wiki/CommandLineOptions for more information'); |
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
469 |
WriteLn(); |
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
470 |
Write('PARSED COMMAND: '); |
2947 | 471 |
for i:=0 to ParamCount do |
472 |
Write(ParamStr(i) + ' '); |
|
473 |
WriteLn(); |
|
2008 | 474 |
end; |
475 |
||
51 | 476 |
//////////////////// |
3678
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
477 |
{$INCLUDE "ArgParsers.inc"} |
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
478 |
|
51 | 479 |
procedure GetParams; |
97
e7c1df9cce2c
- make the game be run from ${PREFIX}/bin with data in ${PREFIX}/share/hedgewars/Data
unc0rr
parents:
81
diff
changeset
|
480 |
begin |
5339 | 481 |
if (ParamCount < 3) then |
3678
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
482 |
GameType:= gmtSyntax |
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
483 |
else |
5339 | 484 |
if (ParamCount = 3) and ((ParamStr(3) = '--stats-only') or (ParamStr(3) = 'landpreview')) then |
3678
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
485 |
internalSetGameTypeLandPreviewFromParameters() |
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
486 |
else |
3709 | 487 |
if (ParamCount = cDefaultParamNum) then |
3678
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
488 |
internalStartGameWithParameters() |
2947 | 489 |
else |
3678
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
490 |
playReplayFileWithParameters(); |
51 | 491 |
end; |
3021 | 492 |
|
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
493 |
//////////////////////////////////////////////////////////////////////////////// |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
494 |
/////////////////////////////// m a i n //////////////////////////////////////// |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
495 |
//////////////////////////////////////////////////////////////////////////////// |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
496 |
begin |
2947 | 497 |
GetParams(); |
2008 | 498 |
|
3078 | 499 |
if GameType = gmtLandPreview then GenLandPreview() |
2947 | 500 |
else if GameType = gmtSyntax then DisplayUsage() |
501 |
else Game(); |
|
3697 | 502 |
|
5565 | 503 |
// return 1 when engine is not called correctly |
504 |
ExitCode:= LongInt(GameType = gmtSyntax); |
|
2698 | 505 |
{$ENDIF} |
51 | 506 |
end. |