author | sheepluva |
Sun, 18 Sep 2011 16:46:26 +0200 | |
branch | 0.9.16 |
changeset 5958 | f9e3033d929f |
parent 5912 | d31eba29e706 |
child 5932 | 5164d17b6374 |
child 5968 | 4e8bb227be9a |
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, |
4490 | 34 |
sysutils, uTypes, uVariables, uCommands, uUtils, uCaptions, uDebug, uCommandHandlers, uLandPainted; |
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); |
|
4929
3dca560e6510
I need this export in order to not have the wrapper.c fail to find Game() on linux
sheepluva
parents:
4901
diff
changeset
|
39 |
procedure Game(gameArgs: PPChar); cdecl; export; |
51 | 40 |
|
2698 | 41 |
implementation |
42 |
{$ELSE} |
|
51 | 43 |
procedure OnDestroy; forward; |
3611 | 44 |
procedure initEverything(complete:boolean); forward; |
3525 | 45 |
procedure freeEverything(complete:boolean); forward; |
2698 | 46 |
{$ENDIF} |
51 | 47 |
|
48 |
//////////////////////////////// |
|
371 | 49 |
procedure DoTimer(Lag: LongInt); |
2905 | 50 |
var s: shortstring; |
51 | 51 |
begin |
4454 | 52 |
if isPaused = false then |
53 |
inc(RealTicks, Lag); |
|
564 | 54 |
|
2947 | 55 |
case GameState of |
56 |
gsLandGen: begin |
|
57 |
GenMap; |
|
4389 | 58 |
ParseCommand('sendlanddigest', true); |
2947 | 59 |
GameState:= gsStart; |
60 |
end; |
|
61 |
gsStart: begin |
|
62 |
if HasBorder then DisableSomeWeapons; |
|
63 |
AddClouds; |
|
4806
48c1a395f0a7
added flake configuration also in sudden death and SDClouds for underwater
Henek
parents:
4490
diff
changeset
|
64 |
AddFlakes; |
2947 | 65 |
AssignHHCoords; |
66 |
AddMiscGears; |
|
67 |
StoreLoad; |
|
68 |
InitWorld; |
|
69 |
ResetKbd; |
|
70 |
SoundLoad; |
|
71 |
if GameType = gmtSave then |
|
72 |
begin |
|
73 |
isSEBackup:= isSoundEnabled; |
|
74 |
isSoundEnabled:= false |
|
75 |
end; |
|
76 |
FinishProgress; |
|
77 |
PlayMusic; |
|
78 |
SetScale(zoom); |
|
79 |
ScriptCall('onGameStart'); |
|
80 |
GameState:= gsGame; |
|
81 |
end; |
|
82 |
gsConfirm, |
|
83 |
gsGame: begin |
|
84 |
DrawWorld(Lag); // never place between ProcessKbd and DoGameTick - bugs due to /put cmd and isCursorVisible |
|
85 |
ProcessKbd; |
|
3449
033e4a8a9c74
wait for AI thread to finish before freeing ressources (to avoid segfaults on game exit)
sheepluva
parents:
3444
diff
changeset
|
86 |
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
|
87 |
begin |
3799 | 88 |
DoGameTick(Lag); |
3449
033e4a8a9c74
wait for AI thread to finish before freeing ressources (to avoid segfaults on game exit)
sheepluva
parents:
3444
diff
changeset
|
89 |
ProcessVisualGears(Lag); |
033e4a8a9c74
wait for AI thread to finish before freeing ressources (to avoid segfaults on game exit)
sheepluva
parents:
3444
diff
changeset
|
90 |
end; |
2947 | 91 |
end; |
92 |
gsChat: begin |
|
93 |
DrawWorld(Lag); |
|
3449
033e4a8a9c74
wait for AI thread to finish before freeing ressources (to avoid segfaults on game exit)
sheepluva
parents:
3444
diff
changeset
|
94 |
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
|
95 |
begin |
3843 | 96 |
DoGameTick(Lag); |
3449
033e4a8a9c74
wait for AI thread to finish before freeing ressources (to avoid segfaults on game exit)
sheepluva
parents:
3444
diff
changeset
|
97 |
ProcessVisualGears(Lag); |
033e4a8a9c74
wait for AI thread to finish before freeing ressources (to avoid segfaults on game exit)
sheepluva
parents:
3444
diff
changeset
|
98 |
end; |
2947 | 99 |
end; |
100 |
gsExit: begin |
|
101 |
isTerminated:= true; |
|
102 |
end; |
|
103 |
end; |
|
564 | 104 |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2715
diff
changeset
|
105 |
{$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
|
106 |
SDL_GL_SwapWindow(SDLwindow); |
3523 | 107 |
{$ELSE} |
108 |
SDL_GL_SwapBuffers(); |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2715
diff
changeset
|
109 |
{$ENDIF} |
4454 | 110 |
|
2947 | 111 |
if flagMakeCapture then |
112 |
begin |
|
113 |
flagMakeCapture:= false; |
|
5912
d31eba29e706
screenshots: display a msg on failure and log causative error
sheepluva
parents:
5825
diff
changeset
|
114 |
{$IFNDEF IPHONEOS} |
2947 | 115 |
s:= 'hw_' + FormatDateTime('YYYY-MM-DD_HH-mm-ss', Now()) + inttostr(GameTicks); |
5912
d31eba29e706
screenshots: display a msg on failure and log causative error
sheepluva
parents:
5825
diff
changeset
|
116 |
|
4359 | 117 |
playSound(sndShutter); |
5912
d31eba29e706
screenshots: display a msg on failure and log causative error
sheepluva
parents:
5825
diff
changeset
|
118 |
if not MakeScreenshot(s) then |
d31eba29e706
screenshots: display a msg on failure and log causative error
sheepluva
parents:
5825
diff
changeset
|
119 |
begin |
d31eba29e706
screenshots: display a msg on failure and log causative error
sheepluva
parents:
5825
diff
changeset
|
120 |
WriteLnToConsole('Screenshot failed.'); |
d31eba29e706
screenshots: display a msg on failure and log causative error
sheepluva
parents:
5825
diff
changeset
|
121 |
AddChatString(#5 + 'screen capture failed (lack of memory or write permissions)'); |
d31eba29e706
screenshots: display a msg on failure and log causative error
sheepluva
parents:
5825
diff
changeset
|
122 |
end |
d31eba29e706
screenshots: display a msg on failure and log causative error
sheepluva
parents:
5825
diff
changeset
|
123 |
else |
d31eba29e706
screenshots: display a msg on failure and log causative error
sheepluva
parents:
5825
diff
changeset
|
124 |
WriteLnToConsole('Screenshot saved: ' + s); |
d31eba29e706
screenshots: display a msg on failure and log causative error
sheepluva
parents:
5825
diff
changeset
|
125 |
{$ENDIF} |
2947 | 126 |
end; |
51 | 127 |
end; |
128 |
||
129 |
//////////////////// |
|
79 | 130 |
procedure OnDestroy; |
51 | 131 |
begin |
2947 | 132 |
WriteLnToConsole('Freeing resources...'); |
3617 | 133 |
FreeActionsList(); |
2947 | 134 |
StoreRelease(); |
135 |
ControllerClose(); |
|
136 |
CloseIPC(); |
|
137 |
TTF_Quit(); |
|
3598 | 138 |
{$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
|
139 |
SDL_GL_DeleteContext(SDLGLcontext); |
3598 | 140 |
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
|
141 |
SDLGLcontext:= nil; |
5166
d1eb1560b4d5
and now for something completely different, overlay refactoring!
koda
parents:
5130
diff
changeset
|
142 |
SDLwindow:= nil; |
3598 | 143 |
{$ENDIF} |
2947 | 144 |
SDL_Quit(); |
3063 | 145 |
isTerminated:= false; |
51 | 146 |
end; |
147 |
||
148 |
/////////////////// |
|
3697 | 149 |
procedure MainLoop; |
5217 | 150 |
{$WARNINGS OFF} |
151 |
// disable "Some fields weren't initialized" warning |
|
152 |
const event: TSDL_Event = (); |
|
153 |
{$WARNINGS ON} |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2715
diff
changeset
|
154 |
var PrevTime, CurrTime: Longword; |
5521 | 155 |
prevFocusState: boolean; |
2698 | 156 |
begin |
2947 | 157 |
PrevTime:= SDL_GetTicks; |
3063 | 158 |
while isTerminated = false do |
159 |
begin |
|
5724 | 160 |
SDL_PumpEvents(); |
161 |
{$IFDEF SDL13} |
|
162 |
while SDL_PeepEvents(@event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT) > 0 do |
|
163 |
{$ELSE} |
|
164 |
while SDL_PeepEvents(@event, 1, SDL_GETEVENT, SDL_ALLEVENTS) > 0 do |
|
165 |
{$ENDIF} |
|
2947 | 166 |
begin |
167 |
case event.type_ of |
|
3647
0d0df215fb52
making chat work... (keyboard support is heavily broken in sdl upstream)
koda
parents:
3634
diff
changeset
|
168 |
SDL_KEYDOWN: if GameState = gsChat then |
4454 | 169 |
{$IFDEF SDL13} |
3647
0d0df215fb52
making chat work... (keyboard support is heavily broken in sdl upstream)
koda
parents:
3634
diff
changeset
|
170 |
// 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
|
171 |
KeyPressChat(event.key.keysym.sym); |
4454 | 172 |
SDL_WINDOWEVENT: |
5052 | 173 |
if event.window.event = SDL_WINDOWEVENT_SHOWN then |
5521 | 174 |
begin |
4454 | 175 |
cHasFocus:= true; |
5521 | 176 |
onFocusStateChanged() |
177 |
end; |
|
3647
0d0df215fb52
making chat work... (keyboard support is heavily broken in sdl upstream)
koda
parents:
3634
diff
changeset
|
178 |
{$ELSE} |
0d0df215fb52
making chat work... (keyboard support is heavily broken in sdl upstream)
koda
parents:
3634
diff
changeset
|
179 |
KeyPressChat(event.key.keysym.unicode); |
4744
ecc2c757d0df
general uKey refactor in preparaiton of two new shortcuts
koda
parents:
4490
diff
changeset
|
180 |
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
|
181 |
SDL_MOUSEBUTTONUP: if event.button.button = SDL_BUTTON_WHEELUP then wheelUp:= true; |
2947 | 182 |
SDL_ACTIVEEVENT: |
183 |
if (event.active.state and SDL_APPINPUTFOCUS) <> 0 then |
|
5521 | 184 |
begin |
185 |
prevFocusState:= cHasFocus; |
|
2947 | 186 |
cHasFocus:= event.active.gain = 1; |
5521 | 187 |
if prevFocusState xor cHasFocus then |
188 |
onFocusStateChanged() |
|
189 |
end; |
|
5670
e01f0b6f1969
enable window resizing (tested only on linux) - fix issue 103
koda
parents:
5662
diff
changeset
|
190 |
SDL_VIDEORESIZE: begin |
5816
ceb522b0f7d5
"fix" for a screen scaling problem I had after resizing to odd width number values
sheepluva
parents:
5815
diff
changeset
|
191 |
// using lower values than cMinScreenWidth or cMinScreenHeight causes widget overlap and off-screen widget parts |
ceb522b0f7d5
"fix" for a screen scaling problem I had after resizing to odd width number values
sheepluva
parents:
5815
diff
changeset
|
192 |
// Change by sheepluva: |
ceb522b0f7d5
"fix" for a screen scaling problem I had after resizing to odd width number values
sheepluva
parents:
5815
diff
changeset
|
193 |
// Let's only use even numbers for custom width/height since I ran into scaling issues with odd width values. |
ceb522b0f7d5
"fix" for a screen scaling problem I had after resizing to odd width number values
sheepluva
parents:
5815
diff
changeset
|
194 |
// Maybe just fixes the symptom not the actual cause(?), I'm too tired to find out :P |
ceb522b0f7d5
"fix" for a screen scaling problem I had after resizing to odd width number values
sheepluva
parents:
5815
diff
changeset
|
195 |
cNewScreenWidth:= max(2 * (event.resize.w div 2), cMinScreenWidth); |
ceb522b0f7d5
"fix" for a screen scaling problem I had after resizing to odd width number values
sheepluva
parents:
5815
diff
changeset
|
196 |
cNewScreenHeight:= max(2 * (event.resize.h div 2), cMinScreenHeight); |
5732
f3f381011728
Add a delay before applying screen resize to cut down on resize events (especially bad on OSes that need texture recreation)
nemo
parents:
5730
diff
changeset
|
197 |
cScreenResizeDelay:= RealTicks+500; |
5670
e01f0b6f1969
enable window resizing (tested only on linux) - fix issue 103
koda
parents:
5662
diff
changeset
|
198 |
end; |
3463 | 199 |
{$ENDIF} |
2947 | 200 |
SDL_JOYAXISMOTION: ControllerAxisEvent(event.jaxis.which, event.jaxis.axis, event.jaxis.value); |
201 |
SDL_JOYHATMOTION: ControllerHatEvent(event.jhat.which, event.jhat.hat, event.jhat.value); |
|
202 |
SDL_JOYBUTTONDOWN: ControllerButtonEvent(event.jbutton.which, event.jbutton.button, true); |
|
203 |
SDL_JOYBUTTONUP: ControllerButtonEvent(event.jbutton.which, event.jbutton.button, false); |
|
204 |
SDL_QUITEV: isTerminated:= true |
|
4454 | 205 |
end; //end case event.type_ of |
206 |
end; //end while SDL_PollEvent(@event) <> 0 do |
|
5732
f3f381011728
Add a delay before applying screen resize to cut down on resize events (especially bad on OSes that need texture recreation)
nemo
parents:
5730
diff
changeset
|
207 |
if (cScreenResizeDelay <> 0) and (cScreenResizeDelay < RealTicks) and ((cNewScreenWidth <> cScreenWidth) or (cNewScreenHeight <> cScreenHeight)) then |
f3f381011728
Add a delay before applying screen resize to cut down on resize events (especially bad on OSes that need texture recreation)
nemo
parents:
5730
diff
changeset
|
208 |
begin |
f3f381011728
Add a delay before applying screen resize to cut down on resize events (especially bad on OSes that need texture recreation)
nemo
parents:
5730
diff
changeset
|
209 |
cScreenResizeDelay:= 0; |
f3f381011728
Add a delay before applying screen resize to cut down on resize events (especially bad on OSes that need texture recreation)
nemo
parents:
5730
diff
changeset
|
210 |
cScreenWidth:= cNewScreenWidth; |
f3f381011728
Add a delay before applying screen resize to cut down on resize events (especially bad on OSes that need texture recreation)
nemo
parents:
5730
diff
changeset
|
211 |
cScreenHeight:= cNewScreenHeight; |
f3f381011728
Add a delay before applying screen resize to cut down on resize events (especially bad on OSes that need texture recreation)
nemo
parents:
5730
diff
changeset
|
212 |
|
f3f381011728
Add a delay before applying screen resize to cut down on resize events (especially bad on OSes that need texture recreation)
nemo
parents:
5730
diff
changeset
|
213 |
ParseCommand('fullscr '+intToStr(LongInt(cFullScreen)), true); |
5815
d9b50fef5164
* ShoppaKing/TrophyRace maps updated by wolfmarc
sheepluva
parents:
5814
diff
changeset
|
214 |
WriteLnToConsole('window resize: ' + IntToStr(cScreenWidth) + ' x ' + IntToStr(cScreenHeight)); |
5825
a6eab1b7c00d
Scripting: Update screen dimensions on screen resize and introduce onScreenResize() event.
sheepluva
parents:
5816
diff
changeset
|
215 |
ScriptOnScreenResize(); |
5732
f3f381011728
Add a delay before applying screen resize to cut down on resize events (especially bad on OSes that need texture recreation)
nemo
parents:
5730
diff
changeset
|
216 |
InitCameraBorders() |
f3f381011728
Add a delay before applying screen resize to cut down on resize events (especially bad on OSes that need texture recreation)
nemo
parents:
5730
diff
changeset
|
217 |
end; |
3463 | 218 |
|
3063 | 219 |
if isTerminated = false then |
2947 | 220 |
begin |
3063 | 221 |
CurrTime:= SDL_GetTicks; |
3976 | 222 |
if PrevTime + longword(cTimerInterval) <= CurrTime then |
3063 | 223 |
begin |
224 |
DoTimer(CurrTime - PrevTime); |
|
225 |
PrevTime:= CurrTime |
|
3697 | 226 |
end |
3063 | 227 |
else SDL_Delay(1); |
228 |
IPCCheckSock(); |
|
229 |
end; |
|
230 |
end; |
|
2698 | 231 |
end; |
232 |
||
233 |
/////////////// |
|
2803
1f446fc5c8ec
allow to compile engine as library with HWLIBRARY symbol
koda
parents:
2800
diff
changeset
|
234 |
{$IFDEF HWLIBRARY} |
3971 | 235 |
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
|
236 |
{$ELSE} |
3064 | 237 |
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
|
238 |
{$ENDIF} |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2947
diff
changeset
|
239 |
var p: TPathType; |
2947 | 240 |
s: shortstring; |
3611 | 241 |
i: LongInt; |
2698 | 242 |
begin |
2803
1f446fc5c8ec
allow to compile engine as library with HWLIBRARY symbol
koda
parents:
2800
diff
changeset
|
243 |
{$IFDEF HWLIBRARY} |
2947 | 244 |
cBits:= 32; |
245 |
cFullScreen:= false; |
|
246 |
cTimerInterval:= 8; |
|
247 |
PathPrefix:= 'Data'; |
|
5239 | 248 |
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
|
249 |
cShowFPS:= {$IFDEF DEBUGFILE}true{$ELSE}false{$ENDIF}; |
3779
3351a017d4ad
tap to dismiss 'get ready', add a toggle to enable/disable it
koda
parents:
3774
diff
changeset
|
250 |
val(gameArgs[0], ipcPort); |
3922
44804043b691
iPad Video Out support (+less warnings +code update for latest SDL)
koda
parents:
3914
diff
changeset
|
251 |
val(gameArgs[1], cScreenWidth); |
44804043b691
iPad Video Out support (+less warnings +code update for latest SDL)
koda
parents:
3914
diff
changeset
|
252 |
val(gameArgs[2], cScreenHeight); |
3779
3351a017d4ad
tap to dismiss 'get ready', add a toggle to enable/disable it
koda
parents:
3774
diff
changeset
|
253 |
val(gameArgs[3], cReducedQuality); |
2947 | 254 |
cLocaleFName:= gameArgs[4]; |
5616 | 255 |
if (Length(cLocaleFName) > 6) then cLocale := Copy(cLocaleFName,1,5) |
256 |
else cLocale := Copy(cLocaleFName,1,2); |
|
3779
3351a017d4ad
tap to dismiss 'get ready', add a toggle to enable/disable it
koda
parents:
3774
diff
changeset
|
257 |
UserNick:= gameArgs[5]; |
3351a017d4ad
tap to dismiss 'get ready', add a toggle to enable/disable it
koda
parents:
3774
diff
changeset
|
258 |
isSoundEnabled:= gameArgs[6] = '1'; |
3351a017d4ad
tap to dismiss 'get ready', add a toggle to enable/disable it
koda
parents:
3774
diff
changeset
|
259 |
isMusicEnabled:= gameArgs[7] = '1'; |
3351a017d4ad
tap to dismiss 'get ready', add a toggle to enable/disable it
koda
parents:
3774
diff
changeset
|
260 |
cAltDamage:= gameArgs[8] = '1'; |
3922
44804043b691
iPad Video Out support (+less warnings +code update for latest SDL)
koda
parents:
3914
diff
changeset
|
261 |
val(gameArgs[9], rotationQt); |
3779
3351a017d4ad
tap to dismiss 'get ready', add a toggle to enable/disable it
koda
parents:
3774
diff
changeset
|
262 |
recordFileName:= gameArgs[10]; |
4814
e19791f08443
smaller rearrangement of (non stereo related) variables
koda
parents:
4812
diff
changeset
|
263 |
cStereoMode:= smNone; |
3624 | 264 |
{$ENDIF} |
5814
9ac119696510
change minimum resolution back to 640x480 (full weapon menu too big for smaller screens)
sheepluva
parents:
5732
diff
changeset
|
265 |
cMinScreenWidth:= min(cScreenWidth, cMinScreenWidth); |
9ac119696510
change minimum resolution back to 640x480 (full weapon menu too big for smaller screens)
sheepluva
parents:
5732
diff
changeset
|
266 |
cMinScreenHeight:= min(cScreenHeight, cMinScreenHeight); |
5686 | 267 |
cOrigScreenWidth:= cScreenWidth; |
268 |
cOrigScreenHeight:= cScreenHeight; |
|
3613 | 269 |
|
3611 | 270 |
initEverything(true); |
3691 | 271 |
|
3611 | 272 |
WriteLnToConsole('Hedgewars ' + cVersionString + ' engine (network protocol: ' + inttostr(cNetProtoVersion) + ')'); |
273 |
AddFileLog('Prefix: "' + PathPrefix +'"'); |
|
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5217
diff
changeset
|
274 |
AddFileLog('UserPrefix: "' + UserPathPrefix +'"'); |
3611 | 275 |
for i:= 0 to ParamCount do |
276 |
AddFileLog(inttostr(i) + ': ' + ParamStr(i)); |
|
2698 | 277 |
|
2947 | 278 |
for p:= Succ(Low(TPathType)) to High(TPathType) do |
5242 | 279 |
if (p <> ptMapCurrent) and (p <> ptData) then UserPathz[p]:= UserPathPrefix + '/Data/' + Pathz[p]; |
280 |
||
281 |
UserPathz[ptData]:= UserPathPrefix + '/Data'; |
|
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5217
diff
changeset
|
282 |
|
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5217
diff
changeset
|
283 |
for p:= Succ(Low(TPathType)) to High(TPathType) do |
2947 | 284 |
if p <> ptMapCurrent then Pathz[p]:= PathPrefix + '/' + Pathz[p]; |
3697 | 285 |
|
2947 | 286 |
WriteToConsole('Init SDL... '); |
4773
69f8431a5d20
yay, sdl resumed development and accepted some of our patches in mainstream
koda
parents:
4744
diff
changeset
|
287 |
SDLTry(SDL_Init(SDL_INIT_VIDEO or SDL_INIT_NOPARACHUTE) >= 0, true); |
2947 | 288 |
WriteLnToConsole(msgOK); |
2698 | 289 |
|
2947 | 290 |
SDL_EnableUNICODE(1); |
5565 | 291 |
SDL_ShowCursor(0); |
2698 | 292 |
|
2947 | 293 |
WriteToConsole('Init SDL_ttf... '); |
294 |
SDLTry(TTF_Init() <> -1, true); |
|
295 |
WriteLnToConsole(msgOK); |
|
2698 | 296 |
|
5565 | 297 |
// show main window |
298 |
if cFullScreen then ParseCommand('fullscr 1', true) |
|
299 |
else ParseCommand('fullscr 0', true); |
|
2698 | 300 |
|
2947 | 301 |
ControllerInit(); // has to happen before InitKbdKeyTable to map keys |
302 |
InitKbdKeyTable(); |
|
5174
f5294509783e
initial refactoring of ObjcExports and OverlayViewController
koda
parents:
5167
diff
changeset
|
303 |
AddProgress(); |
2698 | 304 |
|
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5217
diff
changeset
|
305 |
LoadLocale(UserPathz[ptLocale] + '/en.txt'); // Do an initial load with english |
2947 | 306 |
LoadLocale(Pathz[ptLocale] + '/en.txt'); // Do an initial load with english |
307 |
if cLocaleFName <> 'en.txt' then |
|
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3976
diff
changeset
|
308 |
begin |
2719 | 309 |
// Try two letter locale first before trying specific locale overrides |
5110 | 310 |
if (Length(cLocale) > 2) and (Copy(cLocale,1,2) <> 'en') then |
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5217
diff
changeset
|
311 |
begin |
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5217
diff
changeset
|
312 |
LoadLocale(UserPathz[ptLocale] + '/' + Copy(cLocale,1,2)+'.txt'); |
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5217
diff
changeset
|
313 |
LoadLocale(Pathz[ptLocale] + '/' + Copy(cLocale,1,2)+'.txt') |
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5217
diff
changeset
|
314 |
end; |
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5217
diff
changeset
|
315 |
LoadLocale(UserPathz[ptLocale] + '/' + cLocaleFName); |
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5217
diff
changeset
|
316 |
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
|
317 |
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
|
318 |
else cLocale := 'en'; |
2698 | 319 |
|
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
|
320 |
WriteLnToConsole(msgGettingConfig); |
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3976
diff
changeset
|
321 |
|
2947 | 322 |
if recordFileName = '' then |
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3976
diff
changeset
|
323 |
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
|
324 |
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
|
325 |
SendIPCAndWaitReply('C'); // ask for game config |
4046
cfdbddc4b385
making indentation consistent (noticed while debugging)
nemo
parents:
3976
diff
changeset
|
326 |
end |
2947 | 327 |
else |
328 |
LoadRecordFromFile(recordFileName); |
|
2698 | 329 |
|
2947 | 330 |
ScriptOnGameInit; |
2786 | 331 |
|
2947 | 332 |
s:= 'eproto ' + inttostr(cNetProtoVersion); |
333 |
SendIPCRaw(@s[0], Length(s) + 1); // send proto version |
|
334 |
||
335 |
InitTeams(); |
|
336 |
AssignStores(); |
|
2698 | 337 |
|
2947 | 338 |
if isSoundEnabled then |
339 |
InitSound(); |
|
2590 | 340 |
|
2947 | 341 |
isDeveloperMode:= false; |
2698 | 342 |
|
2947 | 343 |
TryDo(InitStepsFlags = cifAllInited, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); |
2698 | 344 |
|
2947 | 345 |
ParseCommand('rotmask', true); |
2698 | 346 |
|
2947 | 347 |
MainLoop(); |
3615 | 348 |
// clean up SDL and GL context |
2947 | 349 |
OnDestroy(); |
3615 | 350 |
// clean up all the other memory allocated |
3611 | 351 |
freeEverything(true); |
3165
3ec07a7d8456
just some very sane stuff for the iphone port (plus some macro on pascal files)
koda
parents:
3162
diff
changeset
|
352 |
if alsoShutdownFrontend then halt; |
2698 | 353 |
end; |
2590 | 354 |
|
3525 | 355 |
procedure initEverything (complete:boolean); |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
356 |
begin |
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3312
diff
changeset
|
357 |
Randomize(); |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3312
diff
changeset
|
358 |
|
5565 | 359 |
if complete then cLogfileBase:= 'game' |
360 |
else cLogfileBase:= 'preview'; |
|
361 |
||
3709 | 362 |
// uConsts does not need initialization as they are all consts |
4374 | 363 |
uUtils.initModule; |
3038 | 364 |
uMisc.initModule; |
4359 | 365 |
uVariables.initModule; |
3038 | 366 |
uConsole.initModule; // MUST happen after uMisc |
4373 | 367 |
uCommands.initModule; |
4413 | 368 |
uCommandHandlers.initModule; |
3525 | 369 |
|
3038 | 370 |
uLand.initModule; |
4490 | 371 |
uLandPainted.initModule; |
372 |
||
3525 | 373 |
uIO.initModule; |
3697 | 374 |
|
3525 | 375 |
if complete then |
376 |
begin |
|
377 |
uAI.initModule; |
|
378 |
//uAIActions does not need initialization |
|
379 |
//uAIAmmoTests does not need initialization |
|
380 |
uAIMisc.initModule; |
|
381 |
uAmmos.initModule; |
|
382 |
uChat.initModule; |
|
383 |
uCollisions.initModule; |
|
384 |
//uFloat does not need initialization |
|
385 |
//uGame does not need initialization |
|
386 |
uGears.initModule; |
|
387 |
uKeys.initModule; |
|
388 |
//uLandGraphics does not need initialization |
|
389 |
//uLandObjects does not need initialization |
|
390 |
//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
|
391 |
uLandTexture.initModule; |
3525 | 392 |
//uLocale does not need initialization |
3697 | 393 |
uRandom.initModule; |
3525 | 394 |
uScript.initModule; |
395 |
uSound.initModule; |
|
396 |
uStats.initModule; |
|
397 |
uStore.initModule; |
|
398 |
uTeams.initModule; |
|
399 |
uVisualGears.initModule; |
|
400 |
uWorld.initModule; |
|
4393 | 401 |
uCaptions.initModule; |
3525 | 402 |
end; |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
403 |
end; |
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
404 |
|
3525 | 405 |
procedure freeEverything (complete:boolean); |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
406 |
begin |
3525 | 407 |
if complete then |
408 |
begin |
|
4393 | 409 |
uCaptions.freeModule; |
3525 | 410 |
uWorld.freeModule; |
3615 | 411 |
uVisualGears.freeModule; |
3525 | 412 |
uTeams.freeModule; |
413 |
uStore.freeModule; //stub |
|
414 |
uStats.freeModule; //stub |
|
3615 | 415 |
uSound.freeModule; |
3525 | 416 |
uScript.freeModule; |
417 |
uRandom.freeModule; //stub |
|
418 |
//uLocale does not need to be freed |
|
419 |
//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
|
420 |
uLandTexture.freeModule; |
3525 | 421 |
//uLandObjects does not need to be freed |
422 |
//uLandGraphics does not need to be freed |
|
423 |
uKeys.freeModule; //stub |
|
424 |
uGears.freeModule; |
|
425 |
//uGame does not need to be freed |
|
426 |
//uFloat does not need to be freed |
|
427 |
uCollisions.freeModule; //stub |
|
4901 | 428 |
uChat.freeModule; |
3525 | 429 |
uAmmos.freeModule; |
430 |
uAIMisc.freeModule; //stub |
|
431 |
//uAIAmmoTests does not need to be freed |
|
432 |
//uAIActions does not need to be freed |
|
3617 | 433 |
uAI.freeModule; //stub |
3525 | 434 |
end; |
3697 | 435 |
|
3525 | 436 |
uIO.freeModule; //stub |
3038 | 437 |
uLand.freeModule; |
5066 | 438 |
uLandPainted.freeModule; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2715
diff
changeset
|
439 |
|
4413 | 440 |
uCommandHandlers.freeModule; |
4373 | 441 |
uCommands.freeModule; |
3038 | 442 |
uConsole.freeModule; |
4359 | 443 |
uVariables.freeModule; |
4374 | 444 |
uUtils.freeModule; |
3525 | 445 |
uMisc.freeModule; // uMisc closes the debug log. |
2699
249adefa9c1c
replace initialization/finalization statements with custom init functions
koda
parents:
2698
diff
changeset
|
446 |
end; |
2803
1f446fc5c8ec
allow to compile engine as library with HWLIBRARY symbol
koda
parents:
2800
diff
changeset
|
447 |
|
2698 | 448 |
///////////////////////// |
3610 | 449 |
procedure GenLandPreview{$IFDEF HWLIBRARY}(port: LongInt); cdecl; export{$ENDIF}; |
2698 | 450 |
var Preview: TPreview; |
451 |
begin |
|
3611 | 452 |
initEverything(false); |
3610 | 453 |
{$IFDEF HWLIBRARY} |
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3312
diff
changeset
|
454 |
WriteLnToConsole('Preview connecting on port ' + inttostr(port)); |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3312
diff
changeset
|
455 |
ipcPort:= port; |
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3312
diff
changeset
|
456 |
{$ENDIF} |
2947 | 457 |
InitIPC; |
458 |
IPCWaitPongEvent; |
|
459 |
TryDo(InitStepsFlags = cifRandomize, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); |
|
2698 | 460 |
|
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3312
diff
changeset
|
461 |
Preview:= GenPreview(); |
2947 | 462 |
WriteLnToConsole('Sending preview...'); |
463 |
SendIPCRaw(@Preview, sizeof(Preview)); |
|
3365
37ac593e9027
wow all these files only for land preview and seed generation
koda
parents:
3312
diff
changeset
|
464 |
SendIPCRaw(@MaxHedgehogs, sizeof(byte)); |
2947 | 465 |
WriteLnToConsole('Preview sent, disconnect'); |
466 |
CloseIPC(); |
|
3525 | 467 |
freeEverything(false); |
2698 | 468 |
end; |
469 |
||
3021 | 470 |
{$IFNDEF HWLIBRARY} |
2008 | 471 |
///////////////////// |
472 |
procedure DisplayUsage; |
|
2691 | 473 |
var i: LongInt; |
2008 | 474 |
begin |
2947 | 475 |
WriteLn('Wrong argument format: correct configurations is'); |
476 |
WriteLn(); |
|
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5217
diff
changeset
|
477 |
WriteLn(' hwengine <path to user hedgewars folder> <path to global data folder> <path to replay file> [options]'); |
2947 | 478 |
WriteLn(); |
3678
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
479 |
WriteLn('where [options] must be specified either as:'); |
2947 | 480 |
WriteLn(' --set-video [screen width] [screen height] [color dept]'); |
481 |
WriteLn(' --set-audio [volume] [enable music] [enable sounds]'); |
|
482 |
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
|
483 |
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
|
484 |
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
|
485 |
WriteLn(' --stats-only'); |
2947 | 486 |
WriteLn(); |
3678
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
487 |
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
|
488 |
WriteLn(); |
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
489 |
Write('PARSED COMMAND: '); |
2947 | 490 |
for i:=0 to ParamCount do |
491 |
Write(ParamStr(i) + ' '); |
|
492 |
WriteLn(); |
|
2008 | 493 |
end; |
494 |
||
51 | 495 |
//////////////////// |
3678
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
496 |
{$INCLUDE "ArgParsers.inc"} |
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
497 |
|
51 | 498 |
procedure GetParams; |
97
e7c1df9cce2c
- make the game be run from ${PREFIX}/bin with data in ${PREFIX}/share/hedgewars/Data
unc0rr
parents:
81
diff
changeset
|
499 |
begin |
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5217
diff
changeset
|
500 |
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
|
501 |
GameType:= gmtSyntax |
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
502 |
else |
5238
46ddaf14509d
Enable ~/.hedgewars/Data (or platform equivalent) to override/extend pretty much everything in system Data dir. Obviously desyncing can occur, so this is at user's own risk. Should simplify map etc install. Needs testing.
nemo
parents:
5217
diff
changeset
|
503 |
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
|
504 |
internalSetGameTypeLandPreviewFromParameters() |
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
505 |
else |
3709 | 506 |
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
|
507 |
internalStartGameWithParameters() |
2947 | 508 |
else |
3678
00428183300f
patch by lucass (polished by me) - command line parsing is now much more flexible
koda
parents:
3670
diff
changeset
|
509 |
playReplayFileWithParameters(); |
51 | 510 |
end; |
3021 | 511 |
|
155
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
512 |
//////////////////////////////////////////////////////////////////////////////// |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
513 |
/////////////////////////////// m a i n //////////////////////////////////////// |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
514 |
//////////////////////////////////////////////////////////////////////////////// |
401f4ea24715
Engine can generate land preview and send it via IPC
unc0rr
parents:
109
diff
changeset
|
515 |
begin |
2947 | 516 |
GetParams(); |
5616 | 517 |
if (Length(cLocaleFName) > 6) then cLocale := Copy(cLocaleFName,1,5) |
518 |
else cLocale := Copy(cLocaleFName,1,2); |
|
2008 | 519 |
|
3078 | 520 |
if GameType = gmtLandPreview then GenLandPreview() |
2947 | 521 |
else if GameType = gmtSyntax then DisplayUsage() |
522 |
else Game(); |
|
3697 | 523 |
|
5565 | 524 |
// return 1 when engine is not called correctly |
525 |
ExitCode:= LongInt(GameType = gmtSyntax); |
|
2698 | 526 |
{$ENDIF} |
51 | 527 |
end. |