replace initialization/finalization statements with custom init functions
authorkoda
Mon, 18 Jan 2010 05:36:08 +0000
changeset 2699 249adefa9c1c
parent 2698 90585aba87ad
child 2700 726e4a230b48
replace initialization/finalization statements with custom init functions
cocoaTouch/GameSetup.m
cocoaTouch/SDLOverrides/SDL_uikitappdelegate.m
hedgewars/SDLh.pas
hedgewars/hwengine.pas
hedgewars/uChat.pas
hedgewars/uConsole.pas
hedgewars/uConsts.pas
hedgewars/uGears.pas
hedgewars/uIO.pas
hedgewars/uKeys.pas
hedgewars/uLand.pas
hedgewars/uLandObjects.pas
hedgewars/uLandTexture.pas
hedgewars/uMisc.pas
hedgewars/uRandom.pas
hedgewars/uStore.pas
hedgewars/uTeams.pas
hedgewars/uTriggers.pas
hedgewars/uVisualGears.pas
hedgewars/uWorld.pas
--- a/cocoaTouch/GameSetup.m	Sat Jan 16 17:30:37 2010 +0000
+++ b/cocoaTouch/GameSetup.m	Mon Jan 18 05:36:08 2010 +0000
@@ -146,7 +146,7 @@
 				[self sendToEngine:@"egrave star"];
 				
 				// team 1 fort info
-				[self sendToEngine:@"efort  Earth"];
+				[self sendToEngine:@"efort Earth"];
 								
 				// team 1 voicepack info
 				[self sendToEngine:@"evoicepack Classic"];
@@ -236,7 +236,7 @@
 			}
 			NSLog(@"Client Exited");
 			// wait a little to let the client close cleanly
-			sleep(5);
+			sleep(2);
 			// Close the client socket
 			SDLNet_TCP_Close(csd);
 		}
@@ -257,7 +257,8 @@
 	
 	if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {	
 		NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath];
-		[self setValue:dict forKey:objName];
+		systemSettings = dict;
+		//[self setValue:dict forKey:objName];
 		[dict release];
 	} else {
 		//TODO create it
@@ -267,7 +268,7 @@
 }
 
 -(void) unloadSettings {
-	[systemSettings release];
+	systemSettings = nil;
 }
 
 
--- a/cocoaTouch/SDLOverrides/SDL_uikitappdelegate.m	Sat Jan 16 17:30:37 2010 +0000
+++ b/cocoaTouch/SDLOverrides/SDL_uikitappdelegate.m	Mon Jan 18 05:36:08 2010 +0000
@@ -91,7 +91,7 @@
 	[UIView beginAnimations:@"inserting main controller" context:NULL];
 	[UIView setAnimationDuration:1];
 	controller.view.alpha = 1;
-	[UIView commitAnimations];	
+	[UIView commitAnimations];
 }
 
 // override the direct execution of SDL_main to allow us to implement the frontend (even using a nib)
--- a/hedgewars/SDLh.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/SDLh.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -634,6 +634,7 @@
 function  SDL_RenderClear: LongInt; cdecl; external SDLLibName;
 procedure SDL_RenderPresent; cdecl; external SDLLibName;
 function  SDL_RenderCopy(textureID: TSDL_TextureID; srcrect, dstrect: PSDL_Rect): LongInt; cdecl; external SDLLibName;
+procedure SDL_VideoQuit; cdecl; external SDLLibName;
 
 function  SDL_CreateTextureFromSurface(format: LongInt; surface: PSDL_Surface): TSDL_TextureID; cdecl; external SDLLibName;
 procedure SDL_DestroyTexture(textureID: TSDL_TextureID); cdecl; external SDLLibName;
--- a/hedgewars/hwengine.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/hwengine.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -53,6 +53,7 @@
 	uFloat in 'uFloat.pas',
 	uStats in 'uStats.pas',
 	uChat in 'uChat.pas',
+	uTriggers in 'uTriggers.pas',
 	uLandTexture in 'uLandTexture.pas'
 	{$IFDEF IPHONEOS}
 	, PascalExports in 'PascalExports.pas'
@@ -71,11 +72,14 @@
 procedure MainLoop;
 procedure ShowMainWindow;
 procedure Game; cdecl; export;
+procedure initEverything;
+procedure freeEverything;
 
 implementation
 
 {$ELSE}
 procedure OnDestroy; forward;
+procedure freeEverything; forward;
 {$ENDIF}
 
 ////////////////////////////////
@@ -151,7 +155,9 @@
 	ControllerClose();
 	SendKB();
 	CloseIPC();
+	freeEverything();
 	TTF_Quit();
+	{$IFDEF SDL13}SDL_VideoQuit();{$ENDIF}
 	SDL_Quit();
 	exit();
 end;
@@ -215,7 +221,8 @@
 	s: shortstring;
 begin
 {$IFDEF IPHONEOS}
-	Randomize;
+	initEverything();
+	Randomize();
 
 	val('320', cScreenWidth);
 	val('480', cScreenHeight);
@@ -289,11 +296,40 @@
 	exit();
 end;
 
+procedure initEverything;
+begin
+	init_uConsts();
+	init_uMisc();
+	init_uConsole();	// MUST happen after uMisc
+	init_uStore();
+	init_uTeams();
+	init_uGears();
+	init_uVisualGears();
+	init_uLand();
+	init_uIO();
+	init_uWorld();
+	init_uRandom;
+	init_uTriggers;
+
+end;
+
+procedure freeEverything;
+begin
+	//free_uConts(); not necessary
+	free_uConsole();
+	free_uMisc();
+	free_uTeams();
+	free_uGears();
+	//free_uVisualGears(); not necessary
+	free_uLand();
+	//free_uWorld(); not necessary
+
+end;
 {$IFNDEF IPHONEOS}
 /////////////////////////
 procedure GenLandPreview;
 var Preview: TPreview;
-	h: byte;
+    h: byte;
 begin
 	InitIPC;
 	IPCWaitPongEvent;
@@ -344,11 +380,9 @@
 
 ////////////////////
 procedure GetParams;
-var
 {$IFDEF DEBUGFILE}
-    i: LongInt;
+var i: LongInt;
 {$ENDIF}
-    p: TPathType;
 begin
 
 	case ParamCount of
@@ -476,15 +510,14 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 begin
+	initEverything();
 	WriteLnToConsole('Hedgewars ' + cVersionString + ' engine (network protocol: ' + inttostr(cNetProtoVersion) + ')');
-	GetParams;
-
-	Randomize;
+	
+	GetParams();
+	Randomize();
 
-	if GameType = gmtLandPreview	then GenLandPreview
-					else Game;
-//	ExitCode := 100;
+	if GameType = gmtLandPreview then GenLandPreview()
+	else Game();
+	ExitCode := 0;
 {$ENDIF}
-
 end.
-
--- a/hedgewars/uChat.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uChat.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -27,7 +27,7 @@
 procedure KeyPressChat(Key: Longword);
 
 var UserNick: shortstring = '';
-	showAll: boolean = false;
+    showAll: boolean = false;
 
 implementation
 uses uMisc, uStore, uConsts, SDLh, uConsole, uKeys, uTeams;
--- a/hedgewars/uConsole.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uConsole.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -22,10 +22,12 @@
 interface
 uses uFloat;
 
-const isDeveloperMode: boolean = true;
+var isDeveloperMode: boolean;
 type TVariableType = (vtCommand, vtLongInt, vthwFloat, vtBoolean);
      TCommandHandler = procedure (var params: shortstring);
 
+procedure init_uConsole;
+procedure free_uConsole;
 procedure WriteToConsole(s: shortstring);
 procedure WriteLnToConsole(s: shortstring);
 procedure ParseCommand(CmdStr: shortstring; TrustedSource: boolean);
@@ -55,8 +57,8 @@
                   end;
 
 var   ConsoleLines: array[byte] of TTextLine;
-      CurrLine: LongInt = 0;
-      Variables: PVariable = nil;
+      CurrLine: LongInt;
+      Variables: PVariable;
 
 procedure SetLine(var tl: TTextLine; str: shortstring);
 begin
@@ -112,37 +114,35 @@
 
 procedure WriteToConsole(s: shortstring);
 var Len: LongInt;
+    done: boolean;
 begin
-{$IFDEF DEBUGFILE}AddFileLog('Console write: ' + s);{$ENDIF}
-Write(s);
-repeat
-Len:= cLineWidth - Length(ConsoleLines[CurrLine].s);
-SetLine(ConsoleLines[CurrLine], ConsoleLines[CurrLine].s + copy(s, 1, Len));
-Delete(s, 1, Len);
-if byte(ConsoleLines[CurrLine].s[0]) = cLineWidth then
-   begin
-   inc(CurrLine);
-   if CurrLine = cLinesCount then CurrLine:= 0;
-   PByte(@ConsoleLines[CurrLine].s)^:= 0
-   end;
-until Length(s) = 0
+	{$IFDEF DEBUGFILE}AddFileLog('Console write: ' + s);{$ENDIF}
+	Write(s);
+	done:= false;
+	
+	while not done do
+	begin
+		Len:= cLineWidth - Length(ConsoleLines[CurrLine].s);
+		SetLine(ConsoleLines[CurrLine], ConsoleLines[CurrLine].s + copy(s, 1, Len));
+		Delete(s, 1, Len);
+		if byte(ConsoleLines[CurrLine].s[0]) = cLineWidth then
+		begin
+			inc(CurrLine);
+			if CurrLine = cLinesCount then CurrLine:= 0;
+			PByte(@ConsoleLines[CurrLine].s)^:= 0
+		end;
+		done:= (Length(s) = 0);
+	end;
 end;
 
 procedure WriteLnToConsole(s: shortstring);
 begin
-WriteToConsole(s);
-WriteLn;
-inc(CurrLine);
-if CurrLine = cLinesCount then CurrLine:= 0;
-PByte(@ConsoleLines[CurrLine].s)^:= 0
-end;
-
-procedure InitConsole;
-var i: LongInt;
-begin
-cLineWidth:= cScreenWidth div 10;
-if cLineWidth > 255 then cLineWidth:= 255;
-for i:= 0 to Pred(cLinesCount) do PByte(@ConsoleLines[i])^:= 0
+	WriteToConsole(s);
+	WriteLn;
+	inc(CurrLine);
+	if CurrLine = cLinesCount then
+		CurrLine:= 0;
+	PByte(@ConsoleLines[CurrLine].s)^:= 0
 end;
 
 procedure ParseCommand(CmdStr: shortstring; TrustedSource: boolean);
@@ -225,90 +225,104 @@
 end;
 
 {$INCLUDE "CCHandlers.inc"}
+procedure init_uConsole;
+var i: LongInt;
+begin
+	CurrLine:= 0;
+	Variables:= nil;
+	isDeveloperMode:= true;
+	
+	// initConsole
+	cLineWidth:= cScreenWidth div 10;
+	if cLineWidth > 255 then
+		cLineWidth:= 255;
+	for i:= 0 to Pred(cLinesCount) do 
+		PByte(@ConsoleLines[i])^:= 0;
+	
+	RegisterVariable('proto'   , vtCommand, @chCheckProto   , true );
+	RegisterVariable('spectate', vtBoolean, @fastUntilLag   , false);
+	RegisterVariable('capture' , vtCommand, @chCapture      , true );
+	RegisterVariable('rotmask' , vtCommand, @chRotateMask   , true );
+	RegisterVariable('addteam' , vtCommand, @chAddTeam      , false);
+	RegisterVariable('addtrig' , vtCommand, @chAddTrigger   , false);
+	RegisterVariable('rdriven' , vtCommand, @chTeamLocal    , false);
+	RegisterVariable('map'     , vtCommand, @chSetMap       , false);
+	RegisterVariable('theme'   , vtCommand, @chSetTheme     , false);
+	RegisterVariable('seed'    , vtCommand, @chSetSeed      , false);
+	RegisterVariable('template_filter', vtLongInt, @cTemplateFilter, false);
+	RegisterVariable('delay'   , vtLongInt, @cInactDelay    , false);
+	RegisterVariable('casefreq', vtLongInt, @cCaseFactor    , false);
+	RegisterVariable('sd_turns', vtLongInt, @cSuddenDTurns  , false);
+	RegisterVariable('damagepct',vtLongInt, @cDamagePercent , false);
+	RegisterVariable('landadds', vtLongInt, @cLandAdditions , false);
+	RegisterVariable('gmflags' , vtLongInt, @GameFlags      , false);
+	RegisterVariable('trflags' , vtLongInt, @TrainingFlags  , false);
+	RegisterVariable('turntime', vtLongInt, @cHedgehogTurnTime, false);
+	RegisterVariable('minestime',vtLongInt, @cMinesTime     , false);
+	RegisterVariable('fort'    , vtCommand, @chFort         , false);
+	RegisterVariable('voicepack',vtCommand, @chVoicepack    , false);
+	RegisterVariable('grave'   , vtCommand, @chGrave        , false);
+	RegisterVariable('bind'    , vtCommand, @chBind         , true );
+	RegisterVariable('addhh'   , vtCommand, @chAddHH        , false);
+	RegisterVariable('hat'     , vtCommand, @chSetHat       , false);
+	RegisterVariable('hhcoords', vtCommand, @chSetHHCoords  , false);
+	RegisterVariable('ammstore', vtCommand, @chAddAmmoStore , false);
+	RegisterVariable('quit'    , vtCommand, @chQuit         , true );
+	RegisterVariable('confirm' , vtCommand, @chConfirm      , true );
+	RegisterVariable('+speedup', vtCommand, @chSpeedup_p    , true );
+	RegisterVariable('-speedup', vtCommand, @chSpeedup_m    , true );
+	RegisterVariable('zoomin'  , vtCommand, @chZoomIn       , true );
+	RegisterVariable('zoomout' , vtCommand, @chZoomOut      , true );
+	RegisterVariable('zoomreset',vtCommand, @chZoomReset    , true );
+	RegisterVariable('skip'    , vtCommand, @chSkip         , false);
+	RegisterVariable('history' , vtCommand, @chHistory      , true );
+	RegisterVariable('chat'    , vtCommand, @chChat         , true );
+	RegisterVariable('newgrave', vtCommand, @chNewGrave     , false);
+	RegisterVariable('say'     , vtCommand, @chSay          , true );
+	RegisterVariable('hogsay'  , vtCommand, @chHogSay       , true );
+	RegisterVariable('team'    , vtCommand, @chTeamSay      , true );
+	RegisterVariable('ammomenu', vtCommand, @chAmmoMenu     , false);
+	RegisterVariable('+precise', vtCommand, @chPrecise_p    , false);
+	RegisterVariable('-precise', vtCommand, @chPrecise_m    , false);
+	RegisterVariable('+left'   , vtCommand, @chLeft_p       , false);
+	RegisterVariable('-left'   , vtCommand, @chLeft_m       , false);
+	RegisterVariable('+right'  , vtCommand, @chRight_p      , false);
+	RegisterVariable('-right'  , vtCommand, @chRight_m      , false);
+	RegisterVariable('+up'     , vtCommand, @chUp_p         , false);
+	RegisterVariable('-up'     , vtCommand, @chUp_m         , false);
+	RegisterVariable('+down'   , vtCommand, @chDown_p       , false);
+	RegisterVariable('-down'   , vtCommand, @chDown_m       , false);
+	RegisterVariable('+attack' , vtCommand, @chAttack_p     , false);
+	RegisterVariable('-attack' , vtCommand, @chAttack_m     , false);
+	RegisterVariable('switch'  , vtCommand, @chSwitch       , false);
+	RegisterVariable('nextturn', vtCommand, @chNextTurn     , false);
+	RegisterVariable('timer'   , vtCommand, @chTimer        , false);
+	RegisterVariable('taunt'   , vtCommand, @chTaunt        , false);
+	RegisterVariable('setweap' , vtCommand, @chSetWeapon    , false);
+	RegisterVariable('slot'    , vtCommand, @chSlot         , false);
+	RegisterVariable('put'     , vtCommand, @chPut          , false);
+	RegisterVariable('ljump'   , vtCommand, @chLJump        , false);
+	RegisterVariable('hjump'   , vtCommand, @chHJump        , false);
+	RegisterVariable('fullscr' , vtCommand, @chFullScr      , true );
+	RegisterVariable('+volup'  , vtCommand, @chVol_p        , true );
+	RegisterVariable('-volup'  , vtCommand, @chVol_m        , true );
+	RegisterVariable('+voldown', vtCommand, @chVol_m        , true );
+	RegisterVariable('-voldown', vtCommand, @chVol_p        , true );
+	RegisterVariable('findhh'  , vtCommand, @chFindhh       , true );
+	RegisterVariable('pause'   , vtCommand, @chPause        , true );
+	RegisterVariable('+cur_u'  , vtCommand, @chCurU_p       , true );
+	RegisterVariable('-cur_u'  , vtCommand, @chCurU_m       , true );
+	RegisterVariable('+cur_d'  , vtCommand, @chCurD_p       , true );
+	RegisterVariable('-cur_d'  , vtCommand, @chCurD_m       , true );
+	RegisterVariable('+cur_l'  , vtCommand, @chCurL_p       , true );
+	RegisterVariable('-cur_l'  , vtCommand, @chCurL_m       , true );
+	RegisterVariable('+cur_r'  , vtCommand, @chCurR_p       , true );
+	RegisterVariable('-cur_r'  , vtCommand, @chCurR_m       , true );
+end;
 
-initialization
-InitConsole;
-RegisterVariable('proto'   , vtCommand, @chCheckProto   , true );
-RegisterVariable('spectate', vtBoolean, @fastUntilLag   , false);
-RegisterVariable('capture' , vtCommand, @chCapture      , true );
-RegisterVariable('rotmask' , vtCommand, @chRotateMask   , true );
-RegisterVariable('addteam' , vtCommand, @chAddTeam      , false);
-RegisterVariable('addtrig' , vtCommand, @chAddTrigger   , false);
-RegisterVariable('rdriven' , vtCommand, @chTeamLocal    , false);
-RegisterVariable('map'     , vtCommand, @chSetMap       , false);
-RegisterVariable('theme'   , vtCommand, @chSetTheme     , false);
-RegisterVariable('seed'    , vtCommand, @chSetSeed      , false);
-RegisterVariable('template_filter', vtLongInt, @cTemplateFilter, false);
-RegisterVariable('delay'   , vtLongInt, @cInactDelay    , false);
-RegisterVariable('casefreq', vtLongInt, @cCaseFactor    , false);
-RegisterVariable('sd_turns', vtLongInt, @cSuddenDTurns  , false);
-RegisterVariable('damagepct',vtLongInt, @cDamagePercent , false);
-RegisterVariable('landadds', vtLongInt, @cLandAdditions , false);
-RegisterVariable('gmflags' , vtLongInt, @GameFlags      , false);
-RegisterVariable('trflags' , vtLongInt, @TrainingFlags  , false);
-RegisterVariable('turntime', vtLongInt, @cHedgehogTurnTime, false);
-RegisterVariable('minestime',vtLongInt, @cMinesTime     , false);
-RegisterVariable('fort'    , vtCommand, @chFort         , false);
-RegisterVariable('voicepack',vtCommand, @chVoicepack    , false);
-RegisterVariable('grave'   , vtCommand, @chGrave        , false);
-RegisterVariable('bind'    , vtCommand, @chBind         , true );
-RegisterVariable('addhh'   , vtCommand, @chAddHH        , false);
-RegisterVariable('hat'     , vtCommand, @chSetHat       , false);
-RegisterVariable('hhcoords', vtCommand, @chSetHHCoords  , false);
-RegisterVariable('ammstore', vtCommand, @chAddAmmoStore , false);
-RegisterVariable('quit'    , vtCommand, @chQuit         , true );
-RegisterVariable('confirm' , vtCommand, @chConfirm      , true );
-RegisterVariable('+speedup', vtCommand, @chSpeedup_p    , true );
-RegisterVariable('-speedup', vtCommand, @chSpeedup_m    , true );
-RegisterVariable('zoomin'  , vtCommand, @chZoomIn       , true );
-RegisterVariable('zoomout' , vtCommand, @chZoomOut      , true );
-RegisterVariable('zoomreset',vtCommand, @chZoomReset    , true );
-RegisterVariable('skip'    , vtCommand, @chSkip         , false);
-RegisterVariable('history' , vtCommand, @chHistory      , true );
-RegisterVariable('chat'    , vtCommand, @chChat         , true );
-RegisterVariable('newgrave', vtCommand, @chNewGrave     , false);
-RegisterVariable('say'     , vtCommand, @chSay          , true );
-RegisterVariable('hogsay'  , vtCommand, @chHogSay       , true );
-RegisterVariable('team'    , vtCommand, @chTeamSay      , true );
-RegisterVariable('ammomenu', vtCommand, @chAmmoMenu     , false);
-RegisterVariable('+precise', vtCommand, @chPrecise_p    , false);
-RegisterVariable('-precise', vtCommand, @chPrecise_m    , false);
-RegisterVariable('+left'   , vtCommand, @chLeft_p       , false);
-RegisterVariable('-left'   , vtCommand, @chLeft_m       , false);
-RegisterVariable('+right'  , vtCommand, @chRight_p      , false);
-RegisterVariable('-right'  , vtCommand, @chRight_m      , false);
-RegisterVariable('+up'     , vtCommand, @chUp_p         , false);
-RegisterVariable('-up'     , vtCommand, @chUp_m         , false);
-RegisterVariable('+down'   , vtCommand, @chDown_p       , false);
-RegisterVariable('-down'   , vtCommand, @chDown_m       , false);
-RegisterVariable('+attack' , vtCommand, @chAttack_p     , false);
-RegisterVariable('-attack' , vtCommand, @chAttack_m     , false);
-RegisterVariable('switch'  , vtCommand, @chSwitch       , false);
-RegisterVariable('nextturn', vtCommand, @chNextTurn     , false);
-RegisterVariable('timer'   , vtCommand, @chTimer        , false);
-RegisterVariable('taunt'   , vtCommand, @chTaunt        , false);
-RegisterVariable('setweap' , vtCommand, @chSetWeapon    , false);
-RegisterVariable('slot'    , vtCommand, @chSlot         , false);
-RegisterVariable('put'     , vtCommand, @chPut          , false);
-RegisterVariable('ljump'   , vtCommand, @chLJump        , false);
-RegisterVariable('hjump'   , vtCommand, @chHJump        , false);
-RegisterVariable('fullscr' , vtCommand, @chFullScr      , true );
-RegisterVariable('+volup'  , vtCommand, @chVol_p        , true );
-RegisterVariable('-volup'  , vtCommand, @chVol_m        , true );
-RegisterVariable('+voldown', vtCommand, @chVol_m        , true );
-RegisterVariable('-voldown', vtCommand, @chVol_p        , true );
-RegisterVariable('findhh'  , vtCommand, @chFindhh       , true );
-RegisterVariable('pause'   , vtCommand, @chPause        , true );
-RegisterVariable('+cur_u'  , vtCommand, @chCurU_p       , true );
-RegisterVariable('-cur_u'  , vtCommand, @chCurU_m       , true );
-RegisterVariable('+cur_d'  , vtCommand, @chCurD_p       , true );
-RegisterVariable('-cur_d'  , vtCommand, @chCurD_m       , true );
-RegisterVariable('+cur_l'  , vtCommand, @chCurL_p       , true );
-RegisterVariable('-cur_l'  , vtCommand, @chCurL_m       , true );
-RegisterVariable('+cur_r'  , vtCommand, @chCurR_p       , true );
-RegisterVariable('-cur_r'  , vtCommand, @chCurR_m       , true );
-
-finalization
-FreeVariablesList
+procedure free_uConsole;
+begin
+	FreeVariablesList();
+end;
 
 end.
--- a/hedgewars/uConsts.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uConsts.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -21,14 +21,13 @@
 unit uConsts;
 interface
 
-uses
-	SDLh,
+uses	SDLh, uFloat, uLocale,
 {$IFDEF GLES11}
-	gles11,
+	gles11;
 {$ELSE}
-	GL,
+	GL;
 {$ENDIF}
-	uLocale;
+
 
 {$INCLUDE "proto.inc"}
 
@@ -36,7 +35,10 @@
 // in freepascal you may actually use var for the same purpose
 
 type
-
+	HwColor4f = record
+		r, g, b, a: byte
+		end;
+		
 	TGameState = (gsLandGen, gsStart, gsGame, gsChat, gsConfirm, gsExit);
 
 	TGameType = (gmtLocal, gmtDemo, gmtNet, gmtSave, gmtLandPreview);
@@ -158,6 +160,7 @@
 	PTexture = ^TTexture;
 
 const
+	// message constants
 	errmsgCreateSurface   = 'Error creating SDL surface';
 	errmsgTransparentSet  = 'Error setting transparent color';
 	errmsgUnknownCommand  = 'Unknown command';
@@ -173,20 +176,26 @@
 	msgFailedSize        = 'failed due to size';
 	msgGettingConfig     = 'Getting game config...';
 
-const // image flags (for LoadImage())
-    ifNone        = $00000000; // nothing special
-    ifAlpha       = $00000001; // use alpha channel (unused right now?)
-    ifCritical    = $00000002; // image is critical for gameplay (exit game if unable to load)
-    ifTransparent = $00000004; // image uses transparent pixels (color keying)
-    ifIgnoreCaps  = $00000008; // ignore hardware capabilities when loading (i.e. image will not be drawn using OpenGL)
-    ifLowRes      = $00000010; // try loading a low resolution image when it is critical
+	// color constants
+	cWhiteColorChannels	: TSDL_Color = (r:$FF; g:$FF; b:$FF; unused:$FF);
+	cNearBlackColorChannels	: TSDL_Color = (r:$00; g:$00; b:$10; unused:$FF);
+
+	cWhiteColor		: Longword = $FFFFFFFF;
+	cYellowColor		: Longword = $FFFFFF00;
+	cExplosionBorderColor	: LongWord = $FF808080;
 
-const
-	cMaxPower     = 1500;
-	cMaxAngle     = 2048;
-	cPowerDivisor = 1500;
+{$WARNINGS OFF}
+	cAirPlaneSpeed: hwFloat = (isNegative: false; QWordValue:   3006477107); // 1.4
+	cBombsSpeed   : hwFloat = (isNegative: false; QWordValue:    429496729);
+{$WARNINGS ON}
 
-	MAXNAMELEN = 192;
+	// image flags (for LoadImage())
+	ifNone        = $00000000;	// nothing special
+	ifAlpha       = $00000001;	// use alpha channel (unused right now?)
+	ifCritical    = $00000002;	// image is critical for gameplay (exit game if unable to load)
+	ifTransparent = $00000004;	// image uses transparent pixels (color keying)
+	ifIgnoreCaps  = $00000008;	// ignore hardware capabilities when loading (i.e. image will not be drawn using OpenGL)
+	ifLowRes      = $00000010;	// try loading a low resolution image when it is critical
 
 	{*  REFERENCE
       4096 -> $FFFFF000
@@ -211,18 +220,29 @@
 	COLOR_INDESTRUCTIBLE = $88FF;  // red
 	COLOR_OBJECT         = $44FF;  // no idea
 
+	cMaxPower     = 1500;
+	cMaxAngle     = 2048;
+	cPowerDivisor = 1500;
+
+	MAXNAMELEN = 192;
+	
 	// some opengl headers do not have these macros
-	GL_BGR  = $80E0;
-	GL_BGRA = $80E1;
+	GL_BGR		 = $80E0;
+	GL_BGRA		 = $80E1;
 	GL_CLAMP_TO_EDGE = $812F;
 
+	cSendCursorPosTime	: LongWord = 50;
+	cVisibleWater		: LongInt = 128;
+	cCursorEdgesDist	: LongInt = 100;
+	cTeamHealthWidth	: LongInt = 128;
+	cWaterOpacity		: byte = $80;
 
 	cifRandomize = $00000001;
 	cifTheme     = $00000002;
 	cifMap       = $00000002; // either theme or map (or map+theme)
 	cifAllInited = cifRandomize or cifTheme or cifMap;
 
-	cTransparentColor: Longword = $000000;
+	cTransparentColor: Longword = $00000000;
 
 	cMaxTeams        = 6;
 	cMaxHHIndex      = 7;
@@ -338,6 +358,7 @@
 	posCaseUtility = $00000004;
 
 	NoPointX = Low(LongInt);
+	cTargetPointRef	: TPoint = (X: NoPointX; Y: 0);
 
 	// hog tag mask
 	htNone        = $00;
@@ -346,7 +367,14 @@
 	htHealth      = $04;
 	htTransparent = $80;
 	
-	cTagsMasks : array[0..7] of byte = (
+	cHHFileName = 'Hedgehog';
+	cCHFileName = 'Crosshair';
+	cThemeCFGFilename = 'theme.cfg';
+	
+	FontBorder = 2;
+var	PathPrefix: string;
+
+const	cTagsMasks : array[0..7] of byte = (
 				htTeamName or htName or htHealth,
 				htName or htHealth,
 				htHealth,
@@ -357,10 +385,6 @@
 				htNone
 				);
 
-	cHHFileName = 'Hedgehog';
-	cCHFileName = 'Crosshair';
-	cThemeCFGFilename = 'theme.cfg';
-
 	Fontz: array[THWFont] of THHFont = (
 			(Handle: nil;
 			Height: 12;
@@ -388,52 +412,9 @@
 			Name: 'DroidSansFallback.ttf')
 			);
 
-	FontBorder = 2;
-
-	PathPrefix: string = './';
-	Pathz: array[TPathType] of String = (
-			'',                              // ptNone
-			'',                              // ptData
-			'Graphics',                      // ptGraphics
-			'Themes',                        // ptThemes
-			'Themes/avematan',               // ptCurrTheme
-			'Teams',                         // ptTeams
-			'Maps',                          // ptMaps
-			'',                              // ptMapCurrent
-			'Demos',                         // ptDemos
-			'Sounds',                        // ptSounds
-			'Graphics/Graves',               // ptGraves
-			'Fonts',                         // ptFonts
-			'Forts',                         // ptForts
-			'Locale',                        // ptLocale
-			'Graphics/AmmoMenu',             // ptAmmoMenu
-			'Graphics/Hedgehog',             // ptHedgehog
-			'Sounds/voices',                 // ptVoices
-			'Graphics/Hats'                  // ptHats
-			);
-		(*
-	PathzBackup: array[TPathType] of String = (
-			'',                              // ptNone
-			'',                              // ptData
-			'Graphics',                      // ptGraphics
-			'Themes',                        // ptThemes
-			'Themes/avematan',               // ptCurrTheme
-			'Teams',                         // ptTeams
-			'Maps',                          // ptMaps
-			'',                              // ptMapCurrent
-			'Demos',                         // ptDemos
-			'Sounds',                        // ptSounds
-			'Graphics/Graves',               // ptGraves
-			'Fonts',                         // ptFonts
-			'Forts',                         // ptForts
-			'Locale',                        // ptLocale
-			'Graphics/AmmoMenu',             // ptAmmoMenu
-			'Graphics/Hedgehog',             // ptHedgehog
-			'Sounds/voices',                 // ptVoices
-			'Graphics/Hats'                  // ptHats
-			);
-		*)	
-	SpritesData: array[TSprite] of record
+var	Pathz: array[TPathType] of String;
+	
+const	SpritesData: array[TSprite] of record
 			FileName: String[14];
 			Path, AltPath: TPathType;
 			Texture: PTexture;
@@ -1634,36 +1615,64 @@
 			);
 
 
-const conversionFormat: TSDL_PixelFormat = (
-	palette: nil;
-	BitsPerPixel : 32;
-	BytesPerPixel: 4;
-	Rloss : 0;
-	Gloss : 0;
-	Bloss : 0;
-	Aloss : 0;
+	conversionFormat: TSDL_PixelFormat = (
+		palette: nil;
+		BitsPerPixel : 32;
+		BytesPerPixel: 4;
+		Rloss : 0;
+		Gloss : 0;
+		Bloss : 0;
+		Aloss : 0;
 {$IFDEF ENDIAN_LITTLE}
-	Rshift: 0;
-        Gshift: 8;
-        Bshift: 16;
-        Ashift: 24;
+		Rshift: 0;
+		Gshift: 8;
+		Bshift: 16;
+		Ashift: 24;
 {$ELSE}
-	Rshift: 24;
-	Gshift: 16;
-	Bshift: 8;
-	Ashift: 0;
+		Rshift: 24;
+		Gshift: 16;
+		Bshift: 8;
+		Ashift: 0;
 {$ENDIF}
-	RMask : RMask;
-	GMask : GMask;
-	BMask : BMask;
-	AMask : AMask;
-	colorkey: 0;
-	alpha : 255
-);
+		RMask : RMask;
+		GMask : GMask;
+		BMask : BMask;
+		AMask : AMask;
+		colorkey: 0;
+		alpha : 255
+	);
 			
 
 var CountTexz: array[1..Pred(AMMO_INFINITE)] of PTexture;
 
+procedure init_uConsts;
+
 implementation
 
+procedure init_uConsts;
+var cPathz: array[TPathType] of String = (
+		'',                              // ptNone
+		'',                              // ptData
+		'Graphics',                      // ptGraphics
+		'Themes',                        // ptThemes
+		'Themes/avematan',               // ptCurrTheme
+		'Teams',                         // ptTeams
+		'Maps',                          // ptMaps
+		'',                              // ptMapCurrent
+		'Demos',                         // ptDemos
+		'Sounds',                        // ptSounds
+		'Graphics/Graves',               // ptGraves
+		'Fonts',                         // ptFonts
+		'Forts',                         // ptForts
+		'Locale',                        // ptLocale
+		'Graphics/AmmoMenu',             // ptAmmoMenu
+		'Graphics/Hedgehog',             // ptHedgehog
+		'Sounds/voices',                 // ptVoices
+		'Graphics/Hats'                  // ptHats
+	);
+begin
+	PathPrefix := './';
+	Pathz:= cPathz;
+end;
+
 end.
--- a/hedgewars/uGears.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uGears.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -59,6 +59,8 @@
 			uid: Longword
 			end;
 
+procedure init_uGears;
+procedure free_uGears;
 function  AddGear(X, Y: LongInt; Kind: TGearType; State: Longword; dX, dY: hwFloat; Timer: LongWord): PGear;
 procedure ProcessGears;
 procedure ResetUtilities;
@@ -72,24 +74,23 @@
 procedure InsertGearToList(Gear: PGear);
 procedure RemoveGearFromList(Gear: PGear);
 
-var CurAmmoGear: PGear = nil;
-    GearsList: PGear = nil;
-    KilledHHs: Longword = 0;
-    SuddenDeathDmg: Boolean = false;
-    SpeechType: Longword = 1;
+var CurAmmoGear: PGear;
+    GearsList: PGear;
+    KilledHHs: Longword;
+    SuddenDeathDmg: Boolean;
+    SpeechType: Longword;
     SpeechText: shortstring;
-	TrainingTargetGear: PGear = nil;
-	skipFlag: boolean = false;
+    TrainingTargetGear: PGear;
+    skipFlag: boolean;
 
 implementation
-uses uWorld, uMisc, uStore, uConsole, uSound, uTeams, uRandom, uCollisions,
-	uLand, uIO, uLandGraphics, uAIMisc, uLocale, uAI, uAmmos, uTriggers,
+uses uWorld, uMisc, uStore, uConsole, uSound, uTeams, uRandom, uCollisions, uLand, uIO, uLandGraphics,
+	uAIMisc, uLocale, uAI, uAmmos, uTriggers, uStats, uVisualGears,
 {$IFDEF GLES11}
-	gles11,
+	gles11;
 {$ELSE}
-	GL,
+	GL;
 {$ENDIF}
-	uStats, uVisualGears;
 
 const MAXROPEPOINTS = 384;
 var RopePoints: record
@@ -2041,9 +2042,20 @@
 	end
 end;
 
-initialization
+procedure init_uGears;
+begin
+	CurAmmoGear:= nil;
+	GearsList:= nil;
+	KilledHHs:= 0;
+	SuddenDeathDmg:= false;
+	SpeechType:= 1;
+	TrainingTargetGear:= nil;
+	skipFlag:= false;
+end;
 
-finalization
-FreeGearsList;
+procedure free_uGears;
+begin
+	FreeGearsList();
+end;
 
 end.
--- a/hedgewars/uIO.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uIO.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -23,7 +23,9 @@
 uses SDLh;
 
 const ipcPort: Word = 0;
+var hiTicks: Word;
 
+procedure init_uIO;
 procedure SendIPC(s: shortstring);
 procedure SendIPCXY(cmd: char; X, Y: SmallInt);
 procedure SendIPCRaw(p: pointer; len: Longword);
@@ -37,11 +39,8 @@
 procedure CloseIPC;
 procedure NetGetNextCmd;
 
-var hiTicks: Word = 0;
-
 implementation
 uses uConsole, uConsts, uWorld, uMisc, uLand, uChat, uTeams;
-const isPonged: boolean = false;
 
 type PCmd = ^TCmd;
      TCmd = packed record
@@ -54,14 +53,14 @@
             2: (str: shortstring);
             end;
 
-var
-	IPCSock: PTCPSocket = nil;
+var	IPCSock: PTCPSocket;
 	fds: PSDLNet_SocketSet;
+	isPonged: boolean;
 
-	headcmd: PCmd = nil;
-	lastcmd: PCmd = nil;
+	headcmd: PCmd;
+	lastcmd: PCmd;
 
-	SendEmptyPacketTicks: LongWord = 0;
+	SendEmptyPacketTicks: LongWord;
 
 
 function AddCmd(Time: Word; str: shortstring): PCmd;
@@ -111,9 +110,9 @@
 
 procedure CloseIPC;
 begin
-SDLNet_FreeSocketSet(fds);
-SDLNet_TCP_Close(IPCSock);
-SDLNet_Quit
+	SDLNet_FreeSocketSet(fds);
+	SDLNet_TCP_Close(IPCSock);
+	SDLNet_Quit();
 end;
 
 procedure ParseIPCCommand(s: shortstring);
@@ -343,4 +342,16 @@
 if isInLag then fastUntilLag:= false
 end;
 
+procedure init_uIO;
+begin
+	IPCSock:= nil;
+
+	headcmd:= nil;
+	lastcmd:= nil;
+	isPonged:= false;	// was const
+
+	hiTicks:= 0;
+	SendEmptyPacketTicks:= 0;
+end;
+
 end.
--- a/hedgewars/uKeys.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uKeys.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -483,6 +483,5 @@
 	if pressed then ControllerButtons[joy][button]:= 1 else ControllerButtons[joy][button]:= 0;
 end;
 
-initialization
 
 end.
--- a/hedgewars/uLand.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uLand.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -20,26 +20,28 @@
 
 unit uLand;
 interface
-uses SDLh, uLandTemplates, uFloat,
+uses SDLh, uLandTemplates, uFloat, uConsts,
 {$IFDEF GLES11}
-	gles11,
+	gles11;
 {$ELSE}
-	GL,
+	GL;
 {$ENDIF}
-	uConsts;
+
 type TLandArray = packed array[0 .. LAND_HEIGHT - 1, 0 .. LAND_WIDTH - 1] of LongWord;
 	TCollisionArray = packed array[0 .. LAND_HEIGHT - 1, 0 .. LAND_WIDTH - 1] of Word;
 	TPreview  = packed array[0..127, 0..31] of byte;
 	TDirtyTag = packed array[0 .. LAND_HEIGHT div 32 - 1, 0 .. LAND_WIDTH div 32 - 1] of byte;
 
-var  Land: TCollisionArray;
-     LandPixels: TLandArray;
-     LandDirty: TDirtyTag;
-     hasBorder: boolean; 
-     hasGirders: boolean;  
-     playHeight, playWidth, leftX, rightX, topY, MaxHedgehogs: Longword;  // idea is that a template can specify height/width.  Or, a map, a height/width by the dimensions of the image.  If the map has pixels near top of image, it triggers border.
-	 LandBackSurface: PSDL_Surface = nil;
+var Land: TCollisionArray;
+    LandPixels: TLandArray;
+    LandDirty: TDirtyTag;
+    hasBorder: boolean; 
+    hasGirders: boolean;  
+    playHeight, playWidth, leftX, rightX, topY, MaxHedgehogs: Longword;  // idea is that a template can specify height/width.  Or, a map, a height/width by the dimensions of the image.  If the map has pixels near top of image, it triggers border.
+    LandBackSurface: PSDL_Surface;
 
+procedure init_uLand;
+procedure free_uLand;
 procedure GenMap;
 function  GenPreview: TPreview;
 procedure CheckLandDigest(s: shortstring);
@@ -315,10 +317,10 @@
 	if LandBackSurface = nil then
 		LandBackPixel:= 0
 	else
-		begin
+	begin
 		p:= LandBackSurface^.pixels;
 		LandBackPixel:= p^[LandBackSurface^.w * (y mod LandBackSurface^.h) + (x mod LandBackSurface^.w)];// or $FF000000;
-		end
+	end
 end;
 
 procedure ColorizeLand(Surface: PSDL_Surface);
@@ -849,9 +851,15 @@
 GenPreview:= Preview
 end;
 
-initialization
+procedure init_uLand;
+begin
+	LandBackSurface:= nil;
+end;
 
-finalization
-if LandBackSurface <> nil then
-	SDL_FreeSurface(LandBackSurface);
+procedure free_uLand;
+begin
+	if LandBackSurface <> nil then
+		SDL_FreeSurface(LandBackSurface);
+end;
+
 end.
--- a/hedgewars/uLandObjects.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uLandObjects.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -28,13 +28,13 @@
 procedure AddOnLandObjects(Surface: PSDL_Surface);
 
 implementation
-uses uLand, uStore, uConsts, uMisc, uConsole, uRandom, uVisualGears, uFloat,
+uses uLand, uStore, uConsts, uMisc, uConsole, uRandom, uVisualGears, uFloat, uSound, uWorld,
 {$IFDEF GLES11}
-	gles11,
+	gles11;
 {$ELSE}
-	GL,
+	GL;
 {$ENDIF}
-	uSound, uWorld;
+
 const MaxRects = 512;
       MAXOBJECTRECTS = 16;
       MAXTHEMEOBJECTS = 32;
--- a/hedgewars/uLandTexture.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uLandTexture.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -27,13 +27,13 @@
 procedure FreeLand;
 
 implementation
-uses uMisc, uLand, uStore,
+uses uMisc, uLand, uStore, uConsts,
 {$IFDEF GLES11}
-	gles11,
+	gles11;
 {$ELSE}
-	GL,
+	GL;
 {$ENDIF}
-	uConsts;
+
 
 const TEXSIZE = 256;
 	LANDTEXARW = LAND_WIDTH div TEXSIZE;
--- a/hedgewars/uMisc.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uMisc.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -21,175 +21,148 @@
 unit uMisc;
 interface
 
-uses uConsts, SDLh,
+uses	SDLh, uConsts, uFloat,
 {$IFDEF GLES11}
-	gles11,
+	gles11;
 {$ELSE}
-	GL,
+	GL;
 {$ENDIF}
-	uFloat
-{$IFDEF IPHONEOS}
-	, PascalExports
-{$ENDIF}
-	;
-
-type HwColor4f = record
-	r, g, b, a: byte
-	end;
 
 var
-	isCursorVisible : boolean = false;
-	isTerminated    : boolean = false;
-	isInLag         : boolean = false;
-	isPaused        : boolean = false;
-	isSoundEnabled  : boolean = true;
-	isMusicEnabled  : boolean = false;
-	isSEBackup      : boolean = true;
-	isInMultiShoot  : boolean = false;
-	isSpeed         : boolean = false;
-
-	fastUntilLag    : boolean = false;
+	isCursorVisible : boolean;
+	isTerminated    : boolean;
+	isInLag         : boolean;
+	isPaused        : boolean;
+	isSoundEnabled  : boolean;
+	isMusicEnabled  : boolean;
+	isSEBackup      : boolean;
+	isInMultiShoot  : boolean;
+	isSpeed         : boolean;
 
-	GameState     : TGameState = Low(TGameState);
-	GameType      : TGameType = gmtLocal;
-	GameFlags     : Longword = 0;
-	TrainingFlags : Longword = 0;
-	TurnTimeLeft  : Longword = 0;
-	cSuddenDTurns : LongInt = 15;
-	cDamagePercent  : LongInt = 100;
-	cTemplateFilter : LongInt = 0;
+	fastUntilLag    : boolean;
 
-	cHedgehogTurnTime: Longword = 45000;
-	cMinesTime       : LongInt = 3000;
-	cMaxAIThinkTime  : Longword = 9000;
+	GameState	: TGameState;
+	GameType	: TGameType;
+	GameFlags	: Longword;
+	TrainingFlags	: Longword;
+	TurnTimeLeft	: Longword;
+	cSuddenDTurns	: LongInt;
+	cDamagePercent	: LongInt;
+	cTemplateFilter	: LongInt;
 
-	cCloudsNumber    : LongInt = 9;
-	cScreenWidth     : LongInt = 1024;
-	cScreenHeight    : LongInt = 768;
-	cInitWidth       : LongInt = 1024;
-	cInitHeight      : LongInt = 768;
-	cVSyncInUse		 : boolean = true;	
-	cBits            : LongInt = 32;
-	cBitsStr         : string[2] = '32';
-	cTagsMaskIndex   : byte = Low(cTagsMasks);
-	zoom             : GLfloat = 2.0;
-	ZoomValue        : GLfloat = 2.0;
+	cHedgehogTurnTime: Longword;
+	cMinesTime       : LongInt;
+	cMaxAIThinkTime  : Longword;
 
-	cWaterLine       : LongInt = LAND_HEIGHT;
-	cVisibleWater    : LongInt = 128;
-	cGearScrEdgesDist: LongInt = 240;
-	cCursorEdgesDist : LongInt = 100;
-	cTeamHealthWidth : LongInt = 128;
-	cAltDamage       : boolean = true;
+	cCloudsNumber    : LongInt;
+	cScreenWidth     : LongInt;
+	cScreenHeight    : LongInt;
+	cInitWidth       : LongInt;
+	cInitHeight      : LongInt;
+	cVSyncInUse	 : boolean;	
+	cBits            : LongInt;
+	cBitsStr         : string[2];
+	cTagsMaskIndex   : byte;
+	zoom             : GLfloat;
+	ZoomValue        : GLfloat;
 
-	GameTicks      : LongWord = 0;
-	TrainingTimeInc: Longword = 10000;
-	TrainingTimeInD: Longword = 500;
-	TrainingTimeInM: Longword = 5000;
-	TrainingTimeMax: Longword = 60000;
+	cWaterLine       : LongInt;
+	cGearScrEdgesDist: LongInt;
+	cAltDamage       : boolean;
 
-	TimeTrialStartTime: Longword = 0;
-	TimeTrialStopTime : Longword = 0;
-	
-	cWhiteColorChannels	: TSDL_Color = (r:$FF; g:$FF; b:$FF; unused:$FF);
-	cNearBlackColorChannels	: TSDL_Color = (r:$00; g:$00; b:$10; unused:$FF);
+	GameTicks	: LongWord;
+	TrainingTimeInc	: Longword;
+	TrainingTimeInD	: Longword;
+	TrainingTimeInM	: Longword;
+	TrainingTimeMax	: Longword;
 
-	cWhiteColor		: Longword = $FFFFFFFF;
-	cYellowColor		: Longword = $FFFFFF00;
-	cExplosionBorderColor	: LongWord = $FF808080;
+	TimeTrialStartTime: Longword;
+	TimeTrialStopTime : Longword;
+	
+	recordFileName	: shortstring;
+	cShowFPS	: boolean;
+	cCaseFactor	: Longword;
+	cLandAdditions	: Longword;
+	cFullScreen	: boolean;
+	cReducedQuality	: boolean;
+	cLocaleFName	: shortstring;
+	cSeed		: shortstring;
+	cInitVolume	: LongInt;
+	cVolumeDelta	: LongInt;
+	cTimerInterval	: Longword;
+	cHasFocus	: boolean;
+	cInactDelay	: Longword;
 
-var recordFileName : shortstring = '';
-	cShowFPS      : boolean = false;
-	cCaseFactor   : Longword = 5;  {0..9}
-	cLandAdditions: Longword = 4;
-	cFullScreen   : boolean = false;
-	cReducedQuality : boolean = false;
-	cLocaleFName  : shortstring = 'en.txt';
-	cSeed         : shortstring = '';
-	cInitVolume   : LongInt = 50;
-	cVolumeDelta  : LongInt = 0;
-	cTimerInterval: Longword = 8;
-	cHasFocus     : boolean = true;
-	cInactDelay   : Longword = 1250;
-
-	bBetweenTurns: boolean = false;
-	cHealthDecrease: LongWord = 0;
-	bWaterRising   : Boolean = false;
-
-{$WARNINGS OFF}
-	cAirPlaneSpeed: hwFloat = (isNegative: false; QWordValue:   3006477107); // 1.4
-	cBombsSpeed   : hwFloat = (isNegative: false; QWordValue:    429496729);
-{$WARNINGS ON}
+	bBetweenTurns	: boolean;
+	cHealthDecrease	: LongWord;
+	bWaterRising	: Boolean;
 
-	cSendCursorPosTime   : LongWord = 50;
-	ShowCrosshair : boolean;
-	CursorMovementX : Integer = 0;
-	CursorMovementY : Integer = 0;
-	cDrownSpeed,
-	cMaxWindSpeed,
-	cWindSpeed,
-	cGravity: hwFloat;
-	cDamageModifier: hwFloat;
-	cLaserSighting: boolean;
-	cVampiric: boolean;
-	cArtillery: boolean;
+	ShowCrosshair	: boolean;
+	CursorMovementX : Integer;
+	CursorMovementY : Integer;
+	cDrownSpeed	: hwFloat;
+	cMaxWindSpeed	: hwFloat;
+	cWindSpeed	: hwFloat;
+	cGravity	: hwFloat;
+	cDamageModifier	: hwFloat;
+	cLaserSighting	: boolean;
+	cVampiric	: boolean;
+	cArtillery	: boolean;
 
-	flagMakeCapture: boolean = false;
-
-	InitStepsFlags: Longword = 0;
+	flagMakeCapture	: boolean;
 
-	RealTicks: Longword = 0;
+	InitStepsFlags	: Longword;
+	RealTicks	: Longword;
+	AttackBar	: LongInt;
 
-	AttackBar: LongInt = 0; // 0 - none, 1 - just bar at the right-down corner, 2 - like in WWP
+	WaterColorArray	: array[0..3] of HwColor4f;
 
-	i: LongInt;
-	
-	cWaterOpacity: byte = $80;
-	WaterColorArray: array[0..3] of HwColor4f;
+	CursorPoint	: TPoint;
+	TargetPoint	: TPoint;
+
 
-	CursorPoint: TPoint;
-    TargetPoint: TPoint = (X: NoPointX; Y: 0);
-
+procedure init_uMisc;
+procedure free_uMisc;
 procedure movecursor(dx, dy: Integer);
-function hwSign(r: hwFloat): LongInt;
-function Min(a, b: LongInt): LongInt;
-function Max(a, b: LongInt): LongInt;
+function  hwSign(r: hwFloat): LongInt;
+function  Min(a, b: LongInt): LongInt;
+function  Max(a, b: LongInt): LongInt;
 procedure OutError(Msg: String; isFatalError: boolean);
 procedure TryDo(Assert: boolean; Msg: string; isFatal: boolean);
 procedure SDLTry(Assert: boolean; isFatal: boolean);
-function IntToStr(n: LongInt): shortstring;
-function FloatToStr(n: hwFloat): shortstring;
-function DxDy2Angle(const _dY, _dX: hwFloat): GLfloat;
-function DxDy2Angle32(const _dY, _dX: hwFloat): LongInt;
-function DxDy2AttackAngle(const _dY, _dX: hwFloat): LongInt;
+function  IntToStr(n: LongInt): shortstring;
+function  FloatToStr(n: hwFloat): shortstring;
+function  DxDy2Angle(const _dY, _dX: hwFloat): GLfloat;
+function  DxDy2Angle32(const _dY, _dX: hwFloat): LongInt;
+function  DxDy2AttackAngle(const _dY, _dX: hwFloat): LongInt;
 procedure AdjustColor(var Color: Longword);
-{$IFDEF DEBUGFILE}
-procedure AddFileLog(s: shortstring);
-function RectToStr(Rect: TSDL_Rect): shortstring;
-{$ENDIF}
 procedure SetKB(n: Longword);
 procedure SendKB;
 procedure SetLittle(var r: hwFloat);
 procedure SendStat(sit: TStatInfoType; s: shortstring);
 function  Str2PChar(const s: shortstring): PChar;
-function NewTexture(width, height: Longword; buf: Pointer): PTexture;
+function  NewTexture(width, height: Longword; buf: Pointer): PTexture;
 function  Surface2Tex(surf: PSDL_Surface; enableClamp: boolean): PTexture;
 procedure FreeTexture(tex: PTexture);
 function  toPowerOf2(i: Longword): Longword;
 function  DecodeBase64(s: shortstring): shortstring;
 function  doSurfaceConversion(tmpsurf: PSDL_Surface): PSDL_Surface;
 function  endian(independent: LongWord): LongWord;
+function  modifyDamage(dmg: Longword): Longword;
+{$IFDEF DEBUGFILE}
+procedure AddFileLog(s: shortstring);
+function  RectToStr(Rect: TSDL_Rect): shortstring;
+{$ENDIF}
 {$IFNDEF IPHONEOS}
 procedure MakeScreenshot(s: shortstring);
 {$ENDIF}
-function modifyDamage(dmg: Longword): Longword;
-
 
 implementation
-uses uConsole, uStore, uIO, Math, uRandom, uSound;
-var KBnum: Longword = 0;
+uses Math, uConsole, uStore, uIO, uRandom, uSound;
+
+var KBnum: Longword;
 {$IFDEF DEBUGFILE}
-var f: textfile;
+    f: textfile;
 {$ENDIF}
 
 procedure movecursor(dx, dy: Integer);
@@ -574,50 +547,130 @@
 {$ENDIF}
 end;
 
-initialization
-cDrownSpeed.QWordValue:= 257698038;// 0.06
-cMaxWindSpeed.QWordValue:= 2147484;// 0.0005
-cWindSpeed.QWordValue:= 429496;// 0.0001
-cGravity:= cMaxWindSpeed;
-cDamageModifier:= _1;
-cLaserSighting:= false;
-cVampiric:= false;
-cArtillery:= false;
+
+procedure init_uMisc;
+var i: LongInt;
+begin
+	cDrownSpeed.QWordValue	:= 257698038;		// 0.06
+	cMaxWindSpeed.QWordValue:= 2147484;		// 0.0005
+	cWindSpeed.QWordValue	:= 429496;		// 0.0001
+	cGravity		:= cMaxWindSpeed;
+	cDamageModifier		:= _1;
+	TargetPoint		:= cTargetPointRef;
+	
+	// int, longint longword and byte
+	CursorMovementX		:= 0;
+	CursorMovementY		:= 0;
+	GameTicks		:= 0;
+	TrainingTimeInc		:= 10000;
+	TrainingTimeInD		:= 500;
+	TrainingTimeInM		:= 5000;
+	TrainingTimeMax		:= 60000;
+	TimeTrialStartTime	:= 0;
+	TimeTrialStopTime	:= 0;
+	cWaterLine		:= LAND_HEIGHT;
+	cGearScrEdgesDist	:= 240;
+	cHealthDecrease		:= 0;
+
+	GameFlags		:= 0;
+	TrainingFlags		:= 0;
+	TurnTimeLeft		:= 0;
+	cSuddenDTurns		:= 15;
+	cDamagePercent		:= 100;
+	cTemplateFilter		:= 0;
+
+	cHedgehogTurnTime	:= 45000;
+	cMinesTime		:= 3000;
+	cMaxAIThinkTime		:= 9000;
+
+	cCloudsNumber		:= 9;
+	cScreenWidth		:= 1024;
+	cScreenHeight		:= 768;
+	cInitWidth		:= cScreenWidth;
+	cInitHeight		:= cScreenHeight;
+	cBits			:= 32;
+	cTagsMaskIndex		:= Low(cTagsMasks);
+	KBnum			:= 0;
+	InitStepsFlags		:= 0;
+	RealTicks		:= 0;
+	AttackBar		:= 0; // 0 - none, 1 - just bar at the right-down corner, 2 - like in WWP
+	
+	// tgametype and glfloat and string
+	GameState		:= Low(TGameState);
+	GameType		:= gmtLocal;
+	zoom			:= 2.0;
+	ZoomValue		:= 2.0;
+	cBitsStr		:= '32';
+
+	// booleans
+	cLaserSighting		:= false;
+	cVampiric		:= false;
+	cArtillery		:= false;
+	flagMakeCapture		:= false;
+	bBetweenTurns		:= false;
+	bWaterRising		:= false;
+	isCursorVisible		:= false;
+	isTerminated		:= false;
+	isInLag			:= false;
+	isPaused		:= false;
+	isMusicEnabled		:= false;
+	isInMultiShoot		:= false;
+	isSpeed			:= false;
+	fastUntilLag		:= false;
+	cVSyncInUse		:= true;	
+	isSoundEnabled		:= true;
+	isSEBackup		:= true;
+	
+	// init flags
+	recordFileName		:= '';
+	cShowFPS		:= false;
+	cCaseFactor		:= 5;  {0..9}
+	cLandAdditions		:= 4;
+	cFullScreen		:= false;
+	cReducedQuality		:= false;
+	cLocaleFName		:= 'en.txt';
+	cSeed			:= '';
+	cInitVolume		:= 50;
+	cVolumeDelta		:= 0;
+	cTimerInterval		:= 8;
+	cHasFocus		:= true;
+	cInactDelay		:= 1250;
+	cAltDamage		:= true;
 
 {$IFDEF DEBUGFILE}
 {$I-}
-for i:= 0 to 7 do
-begin
-{$IFDEF IPHONEDBG}
+{$IFDEF IPHONEOS}
 	f:= stderr;
 {$ELSE}
-	assign(f, 
-  {$IFDEF IPHONEOS}
-	  string(IPH_getDocumentsPath())
-  {$ELSE}
-	  ParamStr(1)
-  {$ENDIF}
-	  + '/debug' + inttostr(i) + '.txt');
-{$ENDIF}
-	rewrite(f);
-	if IOResult = 5 then
+	for i:= 0 to 7 do
 	begin
-		// prevent writing on a directory you do not have permissions on
-		// should be safe to assume the current directory is writable
-		assign(f, './debug' + inttostr(i) + '.txt');
+		assign(f, ParamStr(1) + '/debug' + inttostr(i) + '.txt');
 		rewrite(f);
+		if IOResult = 5 then
+		begin
+			// prevent writing on a directory you do not have permissions on
+			// should be safe to assume the current directory is writable
+			assign(f, './debug' + inttostr(i) + '.txt');
+			rewrite(f);
+		end;
+		if IOResult = 0 then break;
 	end;
-	if IOResult = 0 then break
-end;
+{$ENDIF}
+
 {$I+}
+{$ENDIF}
 
-finalization
+end;
+
+procedure free_uMisc;
+begin
 //uRandom.DumpBuffer;
 
+{$IFDEF DEBUGFILE}
 writeln(f, 'halt at ', GameTicks, ' ticks. TurnTimeLeft = ', TurnTimeLeft);
 flush(f);
-close(f)
-
+close(f);
 {$ENDIF}
+end;
 
 end.
--- a/hedgewars/uRandom.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uRandom.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -23,6 +23,7 @@
 uses uFloat;
 {$INCLUDE "proto.inc"}
 
+procedure init_uRandom;
 procedure SetRandomSeed(Seed: shortstring);
 function  GetRandom: hwFloat; overload;
 function  GetRandom(m: LongWord): LongWord; overload;
@@ -36,7 +37,7 @@
 uses uMisc;
 {$ENDIF}
 var cirbuf: array[0..63] of Longword;
-    n: byte = 54;
+    n: byte;
 
 function GetNext: Longword;
 begin
@@ -93,4 +94,9 @@
 end;
 {$ENDIF}
 
+procedure init_uRandom;
+begin
+	n:= 54;
+end;
+
 end.
--- a/hedgewars/uStore.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uStore.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -20,14 +20,31 @@
 
 unit uStore;
 interface
-uses sysutils, uConsts, uTeams, SDLh,
+uses sysutils, uConsts, uTeams, SDLh, uFloat,
 {$IFDEF GLES11}
-	gles11,
+	gles11;
 {$ELSE}
-	GL, GLext,
+	GL, GLext;
 {$ENDIF}
-uFloat;
+
 
+var PixelFormat: PSDL_PixelFormat;
+    SDLPrimSurface: PSDL_Surface;
+    PauseTexture,
+    SyncTexture,
+    ConfirmTexture: PTexture;
+    cScaleFactor: GLfloat;
+    SupportNPOTT: Boolean;
+    Step: LongInt;
+    squaresize : LongInt;
+    numsquares : LongInt;
+{$IFDEF SDL13notworking}
+    ProgrTex: TSDL_TextureID;
+{$ELSE}
+    ProgrTex: PTexture;
+{$ENDIF}
+
+procedure init_uStore;
 procedure StoreLoad;
 procedure StoreRelease;
 procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt);
@@ -60,26 +77,14 @@
 procedure SetScale(f: GLfloat);
 
 
-var PixelFormat: PSDL_PixelFormat = nil;
-   SDLPrimSurface: PSDL_Surface = nil;
-   PauseTexture,
-   SyncTexture,
-   ConfirmTexture: PTexture;
-   cScaleFactor: GLfloat = 2.0;
-   SupportNPOTT: Boolean = false;
-
 implementation
-uses uMisc, uConsole, uLand, uLocale, uWorld
-	{$IFDEF IPHONEOS}
-	, PascalExports
-	{$ENDIF}
-	;
+uses uMisc, uConsole, uLand, uLocale, uWorld{$IFDEF IPHONEOS}, PascalExports{$ENDIF};
 
 type TGPUVendor = (gvUnknown, gvNVIDIA, gvATI, gvIntel);
 
-var	HHTexture: PTexture;
-	MaxTextureSize: Integer;
-	{$IFNDEF IPHONEOS}cGPUVendor: TGPUVendor = gvUnknown;{$ENDIF}
+var HHTexture: PTexture;
+    MaxTextureSize: Integer;
+    {$IFNDEF IPHONEOS}cGPUVendor: TGPUVendor;{$ENDIF}
 
 procedure DrawRoundRect(rect: PSDL_Rect; BorderColor, FillColor: Longword; Surface: PSDL_Surface; Clear: boolean);
 var r: TSDL_Rect;
@@ -1165,15 +1170,6 @@
 end;
 
 ////////////////////////////////////////////////////////////////////////////////
-var	Step: LongInt = 0;
-	squaresize : LongInt;
-	numsquares : LongInt;
-{$IFDEF SDL13notworking}
-	ProgrTex: TSDL_TextureID = 0;
-{$ELSE}
-	ProgrTex: PTexture = nil;
-{$ENDIF}
-
 procedure AddProgress;
 var r: TSDL_Rect;
     texsurf: PSDL_Surface;
@@ -1306,4 +1302,20 @@
         end;
 end;
 
+procedure init_uStore;
+begin
+	PixelFormat:= nil;
+	SDLPrimSurface:= nil;
+	{$IFNDEF IPHONEOS}cGPUVendor:= gvUnknown;{$ENDIF}
+
+	cScaleFactor:= 2.0;
+	SupportNPOTT:= false;
+	Step:= 0;
+{$IFDEF SDL13notworking}
+	ProgrTex:= 0;
+{$ELSE}
+	ProgrTex:= nil;
+{$ENDIF}
+end;
+
 end.
--- a/hedgewars/uTeams.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uTeams.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -87,16 +87,18 @@
 			TurnNumber: LongWord;
 			end;
 
-var CurrentTeam: PTeam = nil;
-	PreviousTeam: PTeam = nil;
-	CurrentHedgehog: PHedgehog = nil;
-	TeamsArray: array[0..Pred(cMaxTeams)] of PTeam;
-	TeamsCount: Longword = 0;
-	ClansArray: array[0..Pred(cMaxTeams)] of PClan;
-	ClansCount: Longword = 0;
-	LocalClan: Longword = 0;  // first non-bot, non-extdriven clan
-	CurMinAngle, CurMaxAngle: Longword;
+var CurrentTeam: PTeam;
+    PreviousTeam: PTeam;
+    CurrentHedgehog: PHedgehog;
+    TeamsArray: array[0..Pred(cMaxTeams)] of PTeam;
+    TeamsCount: Longword;
+    ClansArray: array[0..Pred(cMaxTeams)] of PClan;
+    ClansCount: Longword;
+    LocalClan: Longword;  // first non-bot, non-extdriven clan
+    CurMinAngle, CurMaxAngle: Longword;
 
+procedure init_uTeams;
+procedure free_uTeams;
 function  AddTeam(TeamColor: Longword): PTeam;
 procedure SwitchHedgehog;
 procedure AfterSwitchHedgehog;
@@ -402,10 +404,19 @@
 				Gear^.Damage:= Gear^.Health
 end;
 
-initialization
+procedure init_uTeams;
+begin
+	CurrentTeam:= nil;
+	PreviousTeam:= nil;
+	CurrentHedgehog:= nil;
+	TeamsCount:= 0;
+	ClansCount:= 0;
+	LocalClan:= 0;  // first non-bot, non-extdriven clan
+end;
 
-finalization
-
-FreeTeamsList
+procedure free_uTeams;
+begin
+	FreeTeamsList()
+end;
 
 end.
--- a/hedgewars/uTriggers.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uTriggers.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -25,6 +25,7 @@
 
 type TTrigAction = (taSpawnGear, taSuccessFinish, taFailFinish);
 
+procedure init_uTriggers;
 procedure AddTriggerSpawner(id, Ticks, Lives: Longword; GearType: TGearType; X, Y: LongInt; GearTriggerId: Longword);
 procedure AddTriggerSuccess(id, Ticks, Lives: Longword);
 procedure AddTriggerFail(id, Ticks, Lives: Longword);
@@ -44,7 +45,7 @@
                 SpawnGearTriggerId: Longword;
                 Next: PTrigger;
                 end;
-var TriggerList: PTrigger = nil;
+var TriggerList: PTrigger;
 
 function AddTrigger(id, Ticks, Lives: Longword): PTrigger;
 var tmp: PTrigger;
@@ -143,4 +144,9 @@
   end
 end;
 
+procedure init_uTriggers;
+begin
+	TriggerList:= nil;
+end;
+
 end.
--- a/hedgewars/uVisualGears.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uVisualGears.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -20,13 +20,12 @@
 
 unit uVisualGears;
 interface
-uses SDLh, uConsts,
+uses SDLh, uConsts, uFloat,
 {$IFDEF GLES11}
-	gles11,
+	gles11;
 {$ELSE}
-	GL,
+	GL;
 {$ENDIF}
-	uFloat;
 
 type PVisualGear = ^TVisualGear;
 	TVGearStepProcedure = procedure (Gear: PVisualGear; Steps: Longword);
@@ -48,6 +47,7 @@
         Text: shortstring
 		end;
 
+procedure init_uVisualGears;
 function  AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear;
 procedure ProcessVisualGears(Steps: Longword);
 procedure DrawVisualGears(Layer: LongWord);
@@ -55,9 +55,9 @@
 procedure AddClouds;
 procedure AddDamageTag(X, Y, Damage, Color: LongWord);
 
-var VisualGearsList: PVisualGear = nil;
-	vobFrameTicks, vobFramesCount: Longword;
-	vobVelocity, vobFallSpeed: LongInt;
+var VisualGearsList: PVisualGear;
+    vobFrameTicks, vobFramesCount: Longword;
+    vobVelocity, vobFallSpeed: LongInt;
 
 implementation
 uses uWorld, uMisc, uStore, uTeams, uSound;
@@ -518,8 +518,10 @@
     AddVisualGear( - cScreenWidth + i * ((cScreenWidth * 2 + (LAND_WIDTH+256)) div (cCloudsNumber + 1)), LAND_HEIGHT-1184, vgtCloud)
 end;
 
-initialization
+procedure init_uVisualGears;
+begin
+	VisualGearsList:= nil;
+end;
 
-finalization
 
 end.
--- a/hedgewars/uWorld.pas	Sat Jan 16 17:30:37 2010 +0000
+++ b/hedgewars/uWorld.pas	Mon Jan 18 05:36:08 2010 +0000
@@ -25,6 +25,7 @@
 const WorldDx: LongInt = -512;
       WorldDy: LongInt = -256;
 
+procedure init_uWorld;
 procedure InitWorld;
 procedure DrawWorld(Lag: LongInt);
 procedure AddCaption(s: string; Color: Longword; Group: TCapGroup);
@@ -32,22 +33,21 @@
 {$IFDEF COUNTTICKS}
 var cntTicks: LongWord;
 {$ENDIF}
-var FollowGear: PGear = nil;
-	WindBarWidth: LongInt = 0;
-       	bShowAmmoMenu: boolean = false;
-	bSelected: boolean = false;
-	bShowFinger: boolean = false;
-	Frames: Longword = 0;
-	WaterColor, DeepWaterColor: TSDL_Color;
+var FollowGear: PGear;
+    WindBarWidth: LongInt;
+    bShowAmmoMenu: boolean;
+    bSelected: boolean;
+    bShowFinger: boolean;
+    Frames: Longword;
+    WaterColor, DeepWaterColor: TSDL_Color;
 
 implementation
-uses uStore, uMisc, uTeams, uIO, uConsole, uKeys, uLocale, uSound,
+uses	uStore, uMisc, uTeams, uIO, uConsole, uKeys, uLocale, uSound, uAmmos, uVisualGears, uChat, uLandTexture, uLand,
 {$IFDEF GLES11}
-	gles11,
+	gles11;
 {$ELSE}
-	GL,
+	GL;
 {$ENDIF}
-     uAmmos, uVisualGears, uChat, uLandTexture, uLand;
 
 const FPS: Longword = 0;
       CountTicks: Longword = 0;
@@ -60,10 +60,10 @@
                    end;
 
 var cWaveWidth, cWaveHeight: LongInt;
-	Captions: array[TCapGroup] of TCaptionStr;
-	AMxShift, SlotsNum: LongInt;
-	tmpSurface: PSDL_Surface;
-	fpsTexture: PTexture = nil;
+    Captions: array[TCapGroup] of TCaptionStr;
+    AMxShift, SlotsNum: LongInt;
+    tmpSurface: PSDL_Surface;
+    fpsTexture: PTexture;
 
 procedure InitWorld;
 begin
@@ -723,7 +723,17 @@
 if WorldDx > 1024 then WorldDx:= 1024;
 end;
 
-initialization
-FillChar(Captions, sizeof(Captions), 0)
+procedure init_uWorld;
+begin
+	fpsTexture:= nil;
+	FollowGear:= nil;
+	WindBarWidth:= 0;
+	bShowAmmoMenu:= false;
+	bSelected:= false;
+	bShowFinger:= false;
+	Frames:= 0;
+	
+	FillChar(Captions, sizeof(Captions), 0)
+end;
 
 end.