# HG changeset patch # User unc0rr # Date 1267872864 0 # Node ID 803b277e48942559e6211b6d5ec490271a27dbaa # Parent 1d9e0a541c6240d16a91c93cb852020f9c88f166 hate Smaxx (tested) diff -r 1d9e0a541c62 -r 803b277e4894 hedgewars/CCHandlers.inc --- a/hedgewars/CCHandlers.inc Sat Mar 06 01:26:12 2010 +0000 +++ b/hedgewars/CCHandlers.inc Sat Mar 06 10:54:24 2010 +0000 @@ -1,20 +1,20 @@ (* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2004-2009 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - *) +* Hedgewars, a free turn based strategy game +* Copyright (c) 2004-2009 Andrey Korotaev +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; version 2 of the License +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +*) function CheckNoTeamOrHH: boolean; var bRes: boolean; @@ -22,7 +22,7 @@ bRes:= (CurrentTeam = nil) or (CurrentHedgehog^.Gear = nil); {$IFDEF DEBUGFILE} if bRes then - if CurrentTeam = nil then AddFileLog('CONSOLE: CurTeam = nil') +if CurrentTeam = nil then AddFileLog('CONSOLE: CurTeam = nil') else AddFileLog('CONSOLE: CurTeam <> nil, Gear = nil'); {$ENDIF} CheckNoTeamOrHH:= bRes; @@ -42,10 +42,10 @@ procedure chConfirm(var s: shortstring); begin if GameState = gsConfirm then - begin - SendIPC('Q'); - GameState:= gsExit - end + begin + SendIPC('Q'); + GameState:= gsExit + end else begin GameState:= gsChat; @@ -63,12 +63,12 @@ var i, c: LongInt; begin if isDeveloperMode then - begin - val(s, i, c); - if (c <> 0) or (i = 0) then exit; - TryDo(i <= cNetProtoVersion, 'Protocol version mismatch: engine is too old', true); - TryDo(i >= cNetProtoVersion, 'Protocol version mismatch: engine is too new', true) - end +begin +val(s, i, c); +if (c <> 0) or (i = 0) then exit; +TryDo(i <= cNetProtoVersion, 'Protocol version mismatch: engine is too old', true); +TryDo(i >= cNetProtoVersion, 'Protocol version mismatch: engine is too new', true) +end end; procedure chAddTeam(var s: shortstring); @@ -76,22 +76,22 @@ ts, cs: shortstring; begin if isDeveloperMode then - begin - SplitBySpace(s, cs); - SplitBySpace(cs, ts); - val(cs, Color); - TryDo(Color <> 0, 'Error: black team color', true); +begin +SplitBySpace(s, cs); +SplitBySpace(cs, ts); +val(cs, Color); +TryDo(Color <> 0, 'Error: black team color', true); - // color is always little endian so the mask must be constant also in big endian archs - Color:= Color or $FF000000; - - AddTeam(Color); - CurrentTeam^.TeamName:= ts; - CurrentTeam^.PlayerHash:= s; - if GameType in [gmtDemo, gmtSave] then CurrentTeam^.ExtDriven:= true; +// color is always little endian so the mask must be constant also in big endian archs +Color:= Color or $FF000000; + +AddTeam(Color); +CurrentTeam^.TeamName:= ts; +CurrentTeam^.PlayerHash:= s; +if GameType in [gmtDemo, gmtSave] then CurrentTeam^.ExtDriven:= true; - CurrentTeam^.voicepack:= AskForVoicepack('Default') - end +CurrentTeam^.voicepack:= AskForVoicepack('Default') +end end; procedure chTeamLocal(var s: shortstring); @@ -146,22 +146,22 @@ begin if (not isDeveloperMode) or (CurrentTeam = nil) then exit; with CurrentTeam^ do - begin - SplitBySpace(id, s); - CurrentHedgehog:= @Hedgehogs[HedgehogsNumber]; - val(id, CurrentHedgehog^.BotLevel); - Gear:= AddGear(0, 0, gtHedgehog, 0, _0, _0, 0); - SplitBySpace(s, id); - val(s, Gear^.Health); - TryDo(Gear^.Health > 0, 'Invalid hedgehog health', true); - PHedgehog(Gear^.Hedgehog)^.Team:= CurrentTeam; + begin + SplitBySpace(id, s); + CurrentHedgehog:= @Hedgehogs[HedgehogsNumber]; + val(id, CurrentHedgehog^.BotLevel); + Gear:= AddGear(0, 0, gtHedgehog, 0, _0, _0, 0); + SplitBySpace(s, id); + val(s, Gear^.Health); + TryDo(Gear^.Health > 0, 'Invalid hedgehog health', true); + PHedgehog(Gear^.Hedgehog)^.Team:= CurrentTeam; if (GameFlags and gfSharedAmmo) <> 0 then CurrentHedgehog^.AmmoStore:= Clan^.ClanIndex else CurrentHedgehog^.AmmoStore:= TeamsCount - 1; - CurrentHedgehog^.Gear:= Gear; - CurrentHedgehog^.Name:= id; + CurrentHedgehog^.Gear:= Gear; + CurrentHedgehog^.Name:= id; CurrHedgehog:= HedgehogsNumber; - inc(HedgehogsNumber) - end + inc(HedgehogsNumber) + end end; procedure chSetHat(var s: shortstring); @@ -170,12 +170,12 @@ with CurrentTeam^ do begin if not CurrentHedgehog^.King then - if (s = '') or - (((GameFlags and gfKing) <> 0) and (s = 'crown')) or - ((Length(s) > 39) and (Copy(s,1,8) = 'Reserved') and (Copy(s,9,32) <> PlayerHash)) then - CurrentHedgehog^.Hat:= 'NoHat' - else - CurrentHedgehog^.Hat:= s + if (s = '') or + (((GameFlags and gfKing) <> 0) and (s = 'crown')) or + ((Length(s) > 39) and (Copy(s,1,8) = 'Reserved') and (Copy(s,9,32) <> PlayerHash)) then + CurrentHedgehog^.Hat:= 'NoHat' + else + CurrentHedgehog^.Hat:= s end; end; @@ -206,7 +206,7 @@ if s[byte(s[0])]='"' then Delete(s, byte(s[0]), 1); b:= KeyNameToCode(id); if b = 0 then OutError(errmsgUnknownVariable + ' "' + id + '"', false) - else CurrentTeam^.Binds[b]:= s + else CurrentTeam^.Binds[b]:= s end; procedure chCurU_p(var s: shortstring); @@ -263,7 +263,7 @@ if CheckNoTeamOrHH then exit; if not CurrentTeam^.ExtDriven then SendIPC('l'); with CurrentHedgehog^.Gear^ do - Message:= Message and not gm_Left + Message:= Message and not gm_Left end; procedure chRight_p(var s: shortstring); @@ -280,7 +280,7 @@ if CheckNoTeamOrHH then exit; if not CurrentTeam^.ExtDriven then SendIPC('r'); with CurrentHedgehog^.Gear^ do - Message:= Message and not gm_Right + Message:= Message and not gm_Right end; procedure chUp_p(var s: shortstring); @@ -297,7 +297,7 @@ if CheckNoTeamOrHH then exit; if not CurrentTeam^.ExtDriven then SendIPC('u'); with CurrentHedgehog^.Gear^ do - Message:= Message and not gm_Up + Message:= Message and not gm_Up end; procedure chDown_p(var s: shortstring); @@ -314,7 +314,7 @@ if CheckNoTeamOrHH then exit; if not CurrentTeam^.ExtDriven then SendIPC('d'); with CurrentHedgehog^.Gear^ do - Message:= Message and not gm_Down + Message:= Message and not gm_Down end; procedure chPrecise_p(var s: shortstring); @@ -331,7 +331,7 @@ if CheckNoTeamOrHH then exit; if not CurrentTeam^.ExtDriven then SendIPC('z'); with CurrentHedgehog^.Gear^ do - Message:= Message and not gm_Precise + Message:= Message and not gm_Precise end; procedure chLJump(var s: shortstring); @@ -357,26 +357,26 @@ if CheckNoTeamOrHH then exit; bShowFinger:= false; with CurrentHedgehog^.Gear^ do - begin - {$IFDEF DEBUGFILE}AddFileLog('/+attack: hedgehog''s Gear^.State = '+inttostr(State));{$ENDIF} - if ((State and gstHHDriven) <> 0) then + begin + {$IFDEF DEBUGFILE}AddFileLog('/+attack: hedgehog''s Gear^.State = '+inttostr(State));{$ENDIF} + if ((State and gstHHDriven) <> 0) then begin FollowGear:= CurrentHedgehog^.Gear; if not CurrentTeam^.ExtDriven then SendIPC('A'); Message:= Message or gm_Attack end - end + end end; procedure chAttack_m(var s: shortstring); begin if CheckNoTeamOrHH then exit; with CurrentHedgehog^.Gear^ do - begin - if not CurrentTeam^.ExtDriven and + begin + if not CurrentTeam^.ExtDriven and ((Message and gm_Attack) <> 0) then SendIPC('a'); - Message:= Message and not gm_Attack - end + Message:= Message and not gm_Attack + end end; procedure chSwitch(var s: shortstring); @@ -384,7 +384,7 @@ if CheckNoTeamOrHH then exit; if not CurrentTeam^.ExtDriven then SendIPC('S'); with CurrentHedgehog^.Gear^ do - Message:= Message or gm_Switch + Message:= Message or gm_Switch end; procedure chNextTurn(var s: shortstring); @@ -401,9 +401,9 @@ SendIPC('s' + s); if copy(s, 1, 4) = '/me ' then - s:= #2'* ' + UserNick + ' ' + copy(s, 5, Length(s) - 4) + s:= #2'* ' + UserNick + ' ' + copy(s, 5, Length(s) - 4) else - s:= #1 + UserNick + ': ' + s; + s:= #1 + UserNick + ': ' + s; AddChatString(s) end; @@ -424,10 +424,10 @@ if not CurrentTeam^.ExtDriven then SendIPC(s); with CurrentHedgehog^.Gear^ do - begin - Message:= Message or gm_Timer; - MsgParam:= byte(s[1]) - ord('0') - end + begin + Message:= Message or gm_Timer; + MsgParam:= byte(s[1]) - ord('0') + end end; procedure chSlot(var s: shortstring); @@ -439,10 +439,10 @@ if slot > cMaxSlotIndex then exit; if not CurrentTeam^.ExtDriven then SendIPC(char(byte(s[1]) + 79)); with CurrentHedgehog^.Gear^ do - begin - Message:= Message or gm_Slot; - MsgParam:= slot - end + begin + Message:= Message or gm_Slot; + MsgParam:= slot + end end; procedure chSetWeapon(var s: shortstring); @@ -454,10 +454,10 @@ if not CurrentTeam^.ExtDriven then SendIPC('w' + s); with CurrentHedgehog^.Gear^ do - begin - Message:= Message or gm_Weapon; - MsgParam:= byte(s[1]) - end + begin + Message:= Message or gm_Weapon; + MsgParam:= byte(s[1]) + end end; procedure chTaunt(var s: shortstring); @@ -469,10 +469,10 @@ if not CurrentTeam^.ExtDriven then SendIPC('t' + s); with CurrentHedgehog^.Gear^ do - begin - Message:= Message or gm_Animate; - MsgParam:= byte(s[1]) - end + begin + Message:= Message or gm_Animate; + MsgParam:= byte(s[1]) + end end; procedure chHogSay(var s: shortstring); @@ -481,7 +481,7 @@ begin text:= copy(s, 2, Length(s)-1); if CheckNoTeamOrHH - or ((CurrentHedgehog^.Gear^.State and gstHHDriven) = 0) then +or ((CurrentHedgehog^.Gear^.State and gstHHDriven) = 0) then begin chSay(text); exit @@ -493,11 +493,11 @@ begin Gear:= AddVisualGear(0, 0, vgtSpeechBubble); if Gear <> nil then - begin - Gear^.Hedgehog:= CurrentHedgehog; - Gear^.Text:= text; - Gear^.FrameTicks:= byte(s[1]) - end + begin + Gear^.Hedgehog:= CurrentHedgehog; + Gear^.Text:= text; + Gear^.FrameTicks:= byte(s[1]) + end end else begin @@ -520,42 +520,42 @@ begin if CheckNoTeamOrHH then exit; if bShowAmmoMenu then - begin - bSelected:= true; - exit - end; + begin + bSelected:= true; + exit + end; with CurrentHedgehog^.Gear^, - CurrentHedgehog^ do - if (State and gstHHChooseTarget) <> 0 then - begin - isCursorVisible:= false; - if not CurrentTeam^.ExtDriven then - begin - if fromAI then - begin - TargetPoint.X:= putX; - TargetPoint.Y:= putY - end else - begin - TargetPoint.X:= CursorPoint.X - WorldDx; - TargetPoint.Y:= cScreenHeight - CursorPoint.Y - WorldDy; - end; - SendIPCXY('p', TargetPoint.X, TargetPoint.Y); - end - else - begin - TargetPoint.X:= putX; - TargetPoint.Y:= putY - end; - {$IFDEF DEBUGFILE}AddFilelog('put: ' + inttostr(TargetPoint.X) + ', ' + inttostr(TargetPoint.Y));{$ENDIF} - State:= State and not gstHHChooseTarget; - if (Ammo^[CurSlot, CurAmmo].Propz and ammoprop_AttackingPut) <> 0 then - Message:= Message or gm_Attack; - end - else - if CurrentTeam^.ExtDriven then - OutError('got /put while not being in choose target mode', false) + CurrentHedgehog^ do + if (State and gstHHChooseTarget) <> 0 then + begin + isCursorVisible:= false; + if not CurrentTeam^.ExtDriven then + begin + if fromAI then + begin + TargetPoint.X:= putX; + TargetPoint.Y:= putY + end else + begin + TargetPoint.X:= CursorPoint.X - WorldDx; + TargetPoint.Y:= cScreenHeight - CursorPoint.Y - WorldDy; + end; + SendIPCXY('p', TargetPoint.X, TargetPoint.Y); + end + else + begin + TargetPoint.X:= putX; + TargetPoint.Y:= putY + end; + {$IFDEF DEBUGFILE}AddFilelog('put: ' + inttostr(TargetPoint.X) + ', ' + inttostr(TargetPoint.Y));{$ENDIF} + State:= State and not gstHHChooseTarget; + if (Ammo^[CurSlot, CurAmmo].Propz and ammoprop_AttackingPut) <> 0 then + Message:= Message or gm_Attack; + end + else + if CurrentTeam^.ExtDriven then + OutError('got /put while not being in choose target mode', false) end; procedure chPut(var s: shortstring); @@ -578,50 +578,50 @@ procedure chSetMap(var s: shortstring); begin if isDeveloperMode then - begin - Pathz[ptMapCurrent]:= Pathz[ptMaps] + '/' + s; - InitStepsFlags:= InitStepsFlags or cifMap - end +begin +Pathz[ptMapCurrent]:= Pathz[ptMaps] + '/' + s; +InitStepsFlags:= InitStepsFlags or cifMap +end end; procedure chSetTheme(var s: shortstring); begin if isDeveloperMode then - begin - Pathz[ptCurrTheme]:= Pathz[ptThemes] + '/' + s; - InitStepsFlags:= InitStepsFlags or cifTheme - end +begin +Pathz[ptCurrTheme]:= Pathz[ptThemes] + '/' + s; +InitStepsFlags:= InitStepsFlags or cifTheme +end end; procedure chSetSeed(var s: shortstring); begin if isDeveloperMode then - begin - SetRandomSeed(s); - cSeed:= s; - InitStepsFlags:= InitStepsFlags or cifRandomize - end +begin +SetRandomSeed(s); +cSeed:= s; +InitStepsFlags:= InitStepsFlags or cifRandomize +end end; procedure chAmmoMenu(var s: shortstring); begin if CheckNoTeamOrHH then - bShowAmmoMenu:= true +bShowAmmoMenu:= true else - with CurrentTeam^ do +with CurrentTeam^ do with Hedgehogs[CurrHedgehog] do - begin - bSelected:= false; + begin + bSelected:= false; - if bShowAmmoMenu then bShowAmmoMenu:= false - else if ((Gear^.State and (gstAttacking or gstAttacked)) <> 0) or (MultiShootAttacks > 0) - or ((Gear^.State and gstHHDriven) = 0) then else bShowAmmoMenu:= true - end + if bShowAmmoMenu then bShowAmmoMenu:= false + else if ((Gear^.State and (gstAttacking or gstAttacked)) <> 0) or (MultiShootAttacks > 0) + or ((Gear^.State and gstHHDriven) = 0) then else bShowAmmoMenu:= true + end end; procedure chFullScr(var s: shortstring); var flags: Longword = 0; - ico: PSDL_Surface; + ico: PSDL_Surface; {$IFDEF DEBUGFILE} buf: array[byte] of char; {$ENDIF} @@ -629,66 +629,66 @@ window: PSDL_Window; {$ENDIF} begin - if Length(s) = 0 then cFullScreen:= not cFullScreen - else cFullScreen:= s = '1'; + if Length(s) = 0 then cFullScreen:= not cFullScreen + else cFullScreen:= s = '1'; {$IFDEF DEBUGFILE} - AddFileLog('Prepare to change video parameters...'); + AddFileLog('Prepare to change video parameters...'); {$ENDIF} - flags:= SDL_OPENGL;// or SDL_RESIZABLE; + flags:= SDL_OPENGL;// or SDL_RESIZABLE; - if cFullScreen then - begin - flags:= flags or SDL_FULLSCREEN; - cScreenWidth:= cInitWidth; - cScreenHeight:= cInitHeight - end; + if cFullScreen then + begin + flags:= flags or SDL_FULLSCREEN; + cScreenWidth:= cInitWidth; + cScreenHeight:= cInitHeight + end; - // load window icon - {$IFNDEF DARWIN} - ico:= LoadImage(Pathz[ptGraphics] + '/hwengine', ifIgnoreCaps); - {$ELSE} - ico:= LoadImage(Pathz[ptGraphics] + '/hwengine_mac', ifIgnoreCaps); - {$ENDIF} - if ico <> nil then - begin - SDL_WM_SetIcon(ico, 0); - SDL_FreeSurface(ico) - end; - - // set window caption - SDL_WM_SetCaption('Hedgewars', nil); - - if SDLPrimSurface <> nil then - begin + // load window icon + {$IFNDEF DARWIN} + ico:= LoadImage(Pathz[ptGraphics] + '/hwengine', ifIgnoreCaps); + {$ELSE} + ico:= LoadImage(Pathz[ptGraphics] + '/hwengine_mac', ifIgnoreCaps); + {$ENDIF} + if ico <> nil then + begin + SDL_WM_SetIcon(ico, 0); + SDL_FreeSurface(ico) + end; + + // set window caption + SDL_WM_SetCaption('Hedgewars', nil); + + if SDLPrimSurface <> nil then + begin {$IFDEF DEBUGFILE} - AddFileLog('Freeing old primary surface...'); + AddFileLog('Freeing old primary surface...'); {$ENDIF} - SDL_FreeSurface(SDLPrimSurface); - end; - + SDL_FreeSurface(SDLPrimSurface); + end; + {$IFDEF SDL13} - window:= SDL_CreateWindow('Hedgewars', 0, 0, cScreenWidth, cScreenHeight, - SDL_WINDOW_OPENGL or SDL_WINDOW_SHOWN - {$IFDEF IPHONEOS} or SDL_WINDOW_BORDERLESS{$ENDIF}); - SDL_CreateRenderer(window, -1, 0); - PixelFormat:= nil; - - SDL_SetRenderDrawColor(0, 0, 0, 255); - SDL_RenderFill(nil); - SDL_RenderPresent(); + window:= SDL_CreateWindow('Hedgewars', 0, 0, cScreenWidth, cScreenHeight, + SDL_WINDOW_OPENGL or SDL_WINDOW_SHOWN + {$IFDEF IPHONEOS} or SDL_WINDOW_BORDERLESS{$ENDIF}); + SDL_CreateRenderer(window, -1, 0); + PixelFormat:= nil; + + SDL_SetRenderDrawColor(0, 0, 0, 255); + SDL_RenderFill(nil); + SDL_RenderPresent(); {$ELSE} - SDLPrimSurface:= SDL_SetVideoMode(cScreenWidth, cScreenHeight, cBits, flags); - SDLTry(SDLPrimSurface <> nil, true); - PixelFormat:= SDLPrimSurface^.format; + SDLPrimSurface:= SDL_SetVideoMode(cScreenWidth, cScreenHeight, cBits, flags); + SDLTry(SDLPrimSurface <> nil, true); + PixelFormat:= SDLPrimSurface^.format; {$ENDIF} {$IFDEF DEBUGFILE} - AddFileLog('Setting up OpenGL...'); - AddFileLog('SDL video driver: ' + shortstring(SDL_VideoDriverName(buf, sizeof(buf)))); + AddFileLog('Setting up OpenGL...'); + AddFileLog('SDL video driver: ' + shortstring(SDL_VideoDriverName(buf, sizeof(buf)))); {$ENDIF} - SetupOpenGL(); + SetupOpenGL(); end; procedure chVol_p(var s: shortstring); @@ -711,17 +711,14 @@ procedure chPause(var s: shortstring); begin if gameType <> gmtNet then - isPaused:= not isPaused; + isPaused:= not isPaused; SDL_ShowCursor(ord(isPaused)) end; procedure chRotateMask(var s: shortstring); begin -inc(cTagsMaskIndex); -if cTagsMaskIndex > High(cTagsMasks) then cTagsMaskIndex:= Low(cTagsMasks); - -// HACK: skip "health only" if all hogs are invulnerable -if ((GameFlags and gfInvulnerable) <> 0) and ((cTagsMasks[cTagsMaskIndex] and not htTransparent) = htHealth) then chRotateMask(s); +if ((GameFlags and gfInvulnerable) = 0) then cTagsMask:= cTagsMasks[cTagsMask] else cTagsMask:= cTagsMasksNoHealth[cTagsMask]; +addfilelog('tagmask = ' + inttostr(ctagsmask)); end; procedure chAddTrigger(var s: shortstring); @@ -736,7 +733,7 @@ i:= 0; while (i < MAXPARAMS) and - (Length(s) > 0) do + (Length(s) > 0) do begin SplitBySpace(s, tmp); val(s, params[i]); @@ -745,19 +742,19 @@ end; case c of - 's': begin // sTYPE TICKS LIVES GEARTYPE X Y GEARTRIGGER - TryDo(i = 7, errmsgWrongNumber, true); - AddTriggerSpawner(params[0], params[1], params[2], TGearType(params[3]), params[4], params[5], params[6]); - end; - 'C': begin - TryDo(i = 3, errmsgWrongNumber, true); - AddTriggerSuccess(params[0], params[1], params[2]); - end; - 'F': begin - TryDo(i = 3, errmsgWrongNumber, true); - AddTriggerFail(params[0], params[1], params[2]); - end; - end +'s': begin // sTYPE TICKS LIVES GEARTYPE X Y GEARTRIGGER + TryDo(i = 7, errmsgWrongNumber, true); + AddTriggerSpawner(params[0], params[1], params[2], TGearType(params[3]), params[4], params[5], params[6]); + end; +'C': begin + TryDo(i = 3, errmsgWrongNumber, true); + AddTriggerSuccess(params[0], params[1], params[2]); + end; +'F': begin + TryDo(i = 3, errmsgWrongNumber, true); + AddTriggerFail(params[0], params[1], params[2]); + end; +end end; procedure chSpeedup_p(var s: shortstring); diff -r 1d9e0a541c62 -r 803b277e4894 hedgewars/hwengine.pas --- a/hedgewars/hwengine.pas Sat Mar 06 01:26:12 2010 +0000 +++ b/hedgewars/hwengine.pas Sat Mar 06 10:54:24 2010 +0000 @@ -1,20 +1,20 @@ - (* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2004-2007 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - *) +(* +* Hedgewars, a free turn based strategy game +* Copyright (c) 2004-2007 Andrey Korotaev +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; version 2 of the License +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +*) {$INCLUDE "options.inc"} @@ -29,39 +29,39 @@ program hwengine; {$ENDIF} uses SDLh in 'SDLh.pas', - uConsts in 'uConsts.pas', - uGame in 'uGame.pas', - uMisc in 'uMisc.pas', - uStore in 'uStore.pas', - uWorld in 'uWorld.pas', - uIO in 'uIO.pas', - uGears in 'uGears.pas', - uVisualGears in 'uVisualGears.pas', - uConsole in 'uConsole.pas', - uKeys in 'uKeys.pas', - uTeams in 'uTeams.pas', - uSound in 'uSound.pas', - uRandom in 'uRandom.pas', - uAI in 'uAI.pas', - uAIMisc in 'uAIMisc.pas', - uAIAmmoTests in 'uAIAmmoTests.pas', - uAIActions in 'uAIActions.pas', - uCollisions in 'uCollisions.pas', - uLand in 'uLand.pas', - uLandTemplates in 'uLandTemplates.pas', - uLandObjects in 'uLandObjects.pas', - uLandGraphics in 'uLandGraphics.pas', - uLocale in 'uLocale.pas', - uAmmos in 'uAmmos.pas', - uSHA in 'uSHA.pas', - uFloat in 'uFloat.pas', - uStats in 'uStats.pas', - uChat in 'uChat.pas', - uTriggers in 'uTriggers.pas', - uLandTexture in 'uLandTexture.pas', - uScript in 'uScript.pas', - {$IFDEF IPHONEOS}PascalExports in 'PascalExports.pas',{$ENDIF} - sysutils; + uConsts in 'uConsts.pas', + uGame in 'uGame.pas', + uMisc in 'uMisc.pas', + uStore in 'uStore.pas', + uWorld in 'uWorld.pas', + uIO in 'uIO.pas', + uGears in 'uGears.pas', + uVisualGears in 'uVisualGears.pas', + uConsole in 'uConsole.pas', + uKeys in 'uKeys.pas', + uTeams in 'uTeams.pas', + uSound in 'uSound.pas', + uRandom in 'uRandom.pas', + uAI in 'uAI.pas', + uAIMisc in 'uAIMisc.pas', + uAIAmmoTests in 'uAIAmmoTests.pas', + uAIActions in 'uAIActions.pas', + uCollisions in 'uCollisions.pas', + uLand in 'uLand.pas', + uLandTemplates in 'uLandTemplates.pas', + uLandObjects in 'uLandObjects.pas', + uLandGraphics in 'uLandGraphics.pas', + uLocale in 'uLocale.pas', + uAmmos in 'uAmmos.pas', + uSHA in 'uSHA.pas', + uFloat in 'uFloat.pas', + uStats in 'uStats.pas', + uChat in 'uChat.pas', + uTriggers in 'uTriggers.pas', + uLandTexture in 'uLandTexture.pas', + uScript in 'uScript.pas', + {$IFDEF IPHONEOS}PascalExports in 'PascalExports.pas',{$ENDIF} + sysutils; // also: GSHandlers.inc // CCHandlers.inc @@ -92,84 +92,84 @@ var s: shortstring; {$ENDIF} begin - inc(RealTicks, Lag); + inc(RealTicks, Lag); - case GameState of - gsLandGen: begin - GenMap; - GameState:= gsStart; - end; - gsStart: begin - if HasBorder then DisableSomeWeapons; - AddClouds; - AssignHHCoords; - AddMiscGears; - StoreLoad; - InitWorld; - ResetKbd; - SoundLoad; - if GameType = gmtSave then - begin - isSEBackup:= isSoundEnabled; - isSoundEnabled:= false - end; - FinishProgress; - PlayMusic; - SetScale(zoom); - ScriptCall('onGameStart'); - GameState:= gsGame; - end; - gsConfirm, - gsGame: begin - DrawWorld(Lag); // never place between ProcessKbd and DoGameTick - bugs due to /put cmd and isCursorVisible - ProcessKbd; - DoGameTick(Lag); - ProcessVisualGears(Lag); - end; - gsChat: begin - DrawWorld(Lag); - DoGameTick(Lag); - ProcessVisualGears(Lag); - end; - gsExit: begin - isTerminated:= true; - end; - end; + case GameState of + gsLandGen: begin + GenMap; + GameState:= gsStart; + end; + gsStart: begin + if HasBorder then DisableSomeWeapons; + AddClouds; + AssignHHCoords; + AddMiscGears; + StoreLoad; + InitWorld; + ResetKbd; + SoundLoad; + if GameType = gmtSave then + begin + isSEBackup:= isSoundEnabled; + isSoundEnabled:= false + end; + FinishProgress; + PlayMusic; + SetScale(zoom); + ScriptCall('onGameStart'); + GameState:= gsGame; + end; + gsConfirm, + gsGame: begin + DrawWorld(Lag); // never place between ProcessKbd and DoGameTick - bugs due to /put cmd and isCursorVisible + ProcessKbd; + DoGameTick(Lag); + ProcessVisualGears(Lag); + end; + gsChat: begin + DrawWorld(Lag); + DoGameTick(Lag); + ProcessVisualGears(Lag); + end; + gsExit: begin + isTerminated:= true; + end; + end; - SDL_GL_SwapBuffers(); + SDL_GL_SwapBuffers(); {$IFDEF SDL13} - SDL_RenderPresent(); + SDL_RenderPresent(); {$ENDIF} {$IFNDEF IPHONEOS} - // not going to make captures on the iPhone - if flagMakeCapture then - begin - flagMakeCapture:= false; - s:= 'hw_' + FormatDateTime('YYYY-MM-DD_HH-mm-ss', Now()) + inttostr(GameTicks); - WriteLnToConsole('Saving ' + s + '...'); - MakeScreenshot(s); - //SDL_SaveBMP_RW(SDLPrimSurface, SDL_RWFromFile(Str2PChar(s), 'wb'), 1) - end; + // not going to make captures on the iPhone + if flagMakeCapture then + begin + flagMakeCapture:= false; + s:= 'hw_' + FormatDateTime('YYYY-MM-DD_HH-mm-ss', Now()) + inttostr(GameTicks); + WriteLnToConsole('Saving ' + s + '...'); + MakeScreenshot(s); + //SDL_SaveBMP_RW(SDLPrimSurface, SDL_RWFromFile(Str2PChar(s), 'wb'), 1) + end; {$ENDIF} end; //////////////////// procedure OnDestroy; begin - WriteLnToConsole('Freeing resources...'); - if isSoundEnabled then ReleaseSound(); - StoreRelease(); - FreeLand(); - ControllerClose(); - SendKB(); - CloseIPC(); - TTF_Quit(); - {$IFDEF SDL13}SDL_VideoQuit();{$ENDIF} - SDL_Quit(); - {$IFDEF IPHONEOS} - freeEverything(); - {$ENDIF} - exit(); + WriteLnToConsole('Freeing resources...'); + if isSoundEnabled then ReleaseSound(); + StoreRelease(); + FreeLand(); + ControllerClose(); + SendKB(); + CloseIPC(); + TTF_Quit(); + {$IFDEF SDL13}SDL_VideoQuit();{$ENDIF} + SDL_Quit(); + {$IFDEF IPHONEOS} + freeEverything(); + {$ENDIF} + exit(); end; /////////////////// @@ -177,50 +177,50 @@ var PrevTime, CurrTime: Longword; {$IFNDEF IPHONEOS}event: TSDL_Event;{$ENDIF} begin - PrevTime:= SDL_GetTicks; - repeat + PrevTime:= SDL_GetTicks; + repeat {$IFNDEF IPHONEOS} // have to remove this cycle because otherwise it segfaults at exit - while SDL_PollEvent(@event) <> 0 do - begin - case event.type_ of - SDL_KEYDOWN: if GameState = gsChat then KeyPressChat(event.key.keysym.unicode); + while SDL_PollEvent(@event) <> 0 do + begin + case event.type_ of + SDL_KEYDOWN: if GameState = gsChat then KeyPressChat(event.key.keysym.unicode); {$IFDEF SDL13} - SDL_WINDOWEVENT: + SDL_WINDOWEVENT: {$ELSE} - SDL_ACTIVEEVENT: + SDL_ACTIVEEVENT: {$ENDIF} - if (event.active.state and SDL_APPINPUTFOCUS) <> 0 then - cHasFocus:= event.active.gain = 1; - //SDL_VIDEORESIZE: Resize(max(event.resize.w, 600), max(event.resize.h, 450)); - SDL_MOUSEBUTTONDOWN: if event.button.button = SDL_BUTTON_WHEELDOWN then uKeys.wheelDown:= true; - SDL_MOUSEBUTTONUP: if event.button.button = SDL_BUTTON_WHEELUP then uKeys.wheelUp:= true; - SDL_JOYAXISMOTION: ControllerAxisEvent(event.jaxis.which, event.jaxis.axis, event.jaxis.value); - SDL_JOYHATMOTION: ControllerHatEvent(event.jhat.which, event.jhat.hat, event.jhat.value); - SDL_JOYBUTTONDOWN: ControllerButtonEvent(event.jbutton.which, event.jbutton.button, true); - SDL_JOYBUTTONUP: ControllerButtonEvent(event.jbutton.which, event.jbutton.button, false); - SDL_QUITEV: isTerminated:= true - end; // end case event.type_ of - end; // end while SDL_PollEvent(@event) <> 0 do + if (event.active.state and SDL_APPINPUTFOCUS) <> 0 then + cHasFocus:= event.active.gain = 1; + //SDL_VIDEORESIZE: Resize(max(event.resize.w, 600), max(event.resize.h, 450)); + SDL_MOUSEBUTTONDOWN: if event.button.button = SDL_BUTTON_WHEELDOWN then uKeys.wheelDown:= true; + SDL_MOUSEBUTTONUP: if event.button.button = SDL_BUTTON_WHEELUP then uKeys.wheelUp:= true; + SDL_JOYAXISMOTION: ControllerAxisEvent(event.jaxis.which, event.jaxis.axis, event.jaxis.value); + SDL_JOYHATMOTION: ControllerHatEvent(event.jhat.which, event.jhat.hat, event.jhat.value); + SDL_JOYBUTTONDOWN: ControllerButtonEvent(event.jbutton.which, event.jbutton.button, true); + SDL_JOYBUTTONUP: ControllerButtonEvent(event.jbutton.which, event.jbutton.button, false); + SDL_QUITEV: isTerminated:= true + end; // end case event.type_ of + end; // end while SDL_PollEvent(@event) <> 0 do {$ENDIF} - CurrTime:= SDL_GetTicks; - if PrevTime + cTimerInterval <= CurrTime then - begin - DoTimer(CurrTime - PrevTime); - PrevTime:= CurrTime - end else SDL_Delay(1); - if isTerminated = false then IPCCheckSock(); - until isTerminated; + CurrTime:= SDL_GetTicks; + if PrevTime + cTimerInterval <= CurrTime then + begin + DoTimer(CurrTime - PrevTime); + PrevTime:= CurrTime + end else SDL_Delay(1); + if isTerminated = false then IPCCheckSock(); + until isTerminated; - exit(); + exit(); end; ///////////////////////// procedure ShowMainWindow; begin - if cFullScreen then ParseCommand('fullscr 1', true) - else ParseCommand('fullscr 0', true); - SDL_ShowCursor(0) + if cFullScreen then ParseCommand('fullscr 1', true) + else ParseCommand('fullscr 0', true); + SDL_ShowCursor(0) end; /////////////// @@ -230,161 +230,163 @@ procedure Game;cdecl; export; {$ENDIF} var p: TPathType; - s: shortstring; + s: shortstring; begin {$IFDEF HWLIBRARY} - initEverything(); - Randomize(); + initEverything(); + Randomize(); - cScreenWidth:= 480; - cScreenHeight:= 320; - cInitWidth:= cScreenWidth; - cInitHeight:= cScreenHeight; - cBits:= 32; - cFullScreen:= false; - cVSyncInUse:= true; - cTimerInterval:= 8; - PathPrefix:= 'Data'; - cReducedQuality:= false; - cShowFPS:= true; - cInitVolume:= 100; + cScreenWidth:= 480; + cScreenHeight:= 320; + cInitWidth:= cScreenWidth; + cInitHeight:= cScreenHeight; + cBits:= 32; + cFullScreen:= false; + cVSyncInUse:= true; + cTimerInterval:= 8; + PathPrefix:= 'Data'; + cReducedQuality:= false; + cShowFPS:= true; + cInitVolume:= 100; - UserNick:= gameArgs[0]; - val(gameArgs[1], ipcPort); - isSoundEnabled:= gameArgs[2] = '1'; - isMusicEnabled:= gameArgs[3] = '1'; - cLocaleFName:= gameArgs[4]; - cAltDamage:= gameArgs[5] = '1'; + UserNick:= gameArgs[0]; + val(gameArgs[1], ipcPort); + isSoundEnabled:= gameArgs[2] = '1'; + isMusicEnabled:= gameArgs[3] = '1'; + cLocaleFName:= gameArgs[4]; + cAltDamage:= gameArgs[5] = '1'; {$ENDIF} - for p:= Succ(Low(TPathType)) to High(TPathType) do - if p <> ptMapCurrent then Pathz[p]:= PathPrefix + '/' + Pathz[p]; - - WriteToConsole('Init SDL... '); - SDLTry(SDL_Init(SDL_INIT_VIDEO) >= 0, true); - WriteLnToConsole(msgOK); + for p:= Succ(Low(TPathType)) to High(TPathType) do + if p <> ptMapCurrent then Pathz[p]:= PathPrefix + '/' + Pathz[p]; + + WriteToConsole('Init SDL... '); + SDLTry(SDL_Init(SDL_INIT_VIDEO) >= 0, true); + WriteLnToConsole(msgOK); - SDL_EnableUNICODE(1); + SDL_EnableUNICODE(1); - WriteToConsole('Init SDL_ttf... '); - SDLTry(TTF_Init() <> -1, true); - WriteLnToConsole(msgOK); + WriteToConsole('Init SDL_ttf... '); + SDLTry(TTF_Init() <> -1, true); + WriteLnToConsole(msgOK); - ShowMainWindow(); + ShowMainWindow(); - AddProgress(); + AddProgress(); - ControllerInit(); // has to happen before InitKbdKeyTable to map keys - InitKbdKeyTable(); + ControllerInit(); // has to happen before InitKbdKeyTable to map keys + InitKbdKeyTable(); - if recordFileName = '' then - InitIPC; - WriteLnToConsole(msgGettingConfig); + if recordFileName = '' then + InitIPC; + WriteLnToConsole(msgGettingConfig); - LoadLocale(Pathz[ptLocale] + '/en.txt'); // Do an initial load with english - if cLocaleFName <> 'en.txt' then + LoadLocale(Pathz[ptLocale] + '/en.txt'); // Do an initial load with english + if cLocaleFName <> 'en.txt' then begin // Try two letter locale first before trying specific locale overrides if (Length(cLocaleFName) > 6) and (Copy(cLocaleFName,1,2)+'.txt' <> 'en.txt') then LoadLocale(Pathz[ptLocale] + '/' + Copy(cLocaleFName,1,2)+'.txt'); - LoadLocale(Pathz[ptLocale] + '/' + cLocaleFName); + LoadLocale(Pathz[ptLocale] + '/' + cLocaleFName); end; - if recordFileName = '' then - SendIPCAndWaitReply('C') // ask for game config - else - LoadRecordFromFile(recordFileName); + if recordFileName = '' then + SendIPCAndWaitReply('C') // ask for game config + else + LoadRecordFromFile(recordFileName); - ScriptOnGameInit; + ScriptOnGameInit; - s:= 'eproto ' + inttostr(cNetProtoVersion); - SendIPCRaw(@s[0], Length(s) + 1); // send proto version + s:= 'eproto ' + inttostr(cNetProtoVersion); + SendIPCRaw(@s[0], Length(s) + 1); // send proto version + + InitTeams(); + AssignStores(); - InitTeams(); - AssignStores(); + if isSoundEnabled then + InitSound(); - if isSoundEnabled then - InitSound(); + isDeveloperMode:= false; - isDeveloperMode:= false; + TryDo(InitStepsFlags = cifAllInited, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); - TryDo(InitStepsFlags = cifAllInited, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); + ParseCommand('rotmask', true); - MainLoop(); - OnDestroy(); - exit(); + MainLoop(); + OnDestroy(); + exit(); end; procedure initEverything; begin - init_uConsts(); - init_uMisc(); - init_uConsole(); // MUST happen after uMisc - - init_uAI(); - //uAIActions does not need initialization - //uAIAmmoTests does not need initialization - init_uAIMisc(); - init_uAmmos(); - init_uChat(); - init_uCollisions(); - //uFloat does not need initialization - //uGame does not need initialization - init_uGears(); - init_uIO(); - init_uKeys(); - init_uLand(); - //uLandGraphics does not need initialization - //uLandObjects does not need initialization - //uLandTemplates does not need initialization - //uLandTexture does not need initialization - //uLocale does not need initialization - init_uRandom(); - //uSHA does not need initialization - init_uSound(); - init_uStats(); - init_uStore(); - init_uTeams(); - init_uTriggers(); - init_uVisualGears(); - init_uWorld(); - init_uScript(); + init_uConsts(); + init_uMisc(); + init_uConsole(); // MUST happen after uMisc + + init_uAI(); + //uAIActions does not need initialization + //uAIAmmoTests does not need initialization + init_uAIMisc(); + init_uAmmos(); + init_uChat(); + init_uCollisions(); + //uFloat does not need initialization + //uGame does not need initialization + init_uGears(); + init_uIO(); + init_uKeys(); + init_uLand(); + //uLandGraphics does not need initialization + //uLandObjects does not need initialization + //uLandTemplates does not need initialization + //uLandTexture does not need initialization + //uLocale does not need initialization + init_uRandom(); + //uSHA does not need initialization + init_uSound(); + init_uStats(); + init_uStore(); + init_uTeams(); + init_uTriggers(); + init_uVisualGears(); + init_uWorld(); + init_uScript(); end; procedure freeEverything; begin - free_uWorld(); - free_uVisualGears(); //stub - free_uTriggers(); //stub - free_uTeams(); - free_uStore(); - free_uStats(); //stub - free_uSound(); //stub - //uSHA does not need to be freed - free_uRandom(); //stub - //uLocale does not need to be freed - //uLandTemplates does not need to be freed - //uLandTexture does not need to be freed - //uLandObjects does not need to be freed - //uLandGraphics does not need to be freed - free_uLand(); - free_uKeys(); //stub - free_uIO(); - free_uGears(); - //uGame does not need to be freed - //uFloat does not need to be freed - free_uCollisions(); - free_uChat(); - free_uAmmos(); - free_uAIMisc(); //stub - //uAIAmmoTests does not need to be freed - //uAIActions does not need to be freed - free_uAI(); //stub + free_uWorld(); + free_uVisualGears(); //stub + free_uTriggers(); //stub + free_uTeams(); + free_uStore(); + free_uStats(); //stub + free_uSound(); //stub + //uSHA does not need to be freed + free_uRandom(); //stub + //uLocale does not need to be freed + //uLandTemplates does not need to be freed + //uLandTexture does not need to be freed + //uLandObjects does not need to be freed + //uLandGraphics does not need to be freed + free_uLand(); + free_uKeys(); //stub + free_uIO(); + free_uGears(); + //uGame does not need to be freed + //uFloat does not need to be freed + free_uCollisions(); + free_uChat(); + free_uAmmos(); + free_uAIMisc(); //stub + //uAIAmmoTests does not need to be freed + //uAIActions does not need to be freed + free_uAI(); //stub - free_uConsole(); - free_uMisc(); - free_uConsts(); //stub - free_uScript(); + free_uConsole(); + free_uMisc(); + free_uConsts(); //stub + free_uScript(); end; {$IFNDEF HWLIBRARY} @@ -393,50 +395,50 @@ var Preview: TPreview; h: byte; begin - InitIPC; - IPCWaitPongEvent; - TryDo(InitStepsFlags = cifRandomize, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); + InitIPC; + IPCWaitPongEvent; + TryDo(InitStepsFlags = cifRandomize, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); - Preview:= GenPreview; - WriteLnToConsole('Sending preview...'); - SendIPCRaw(@Preview, sizeof(Preview)); - h:= MaxHedgehogs; - SendIPCRaw(@h, sizeof(h)); - WriteLnToConsole('Preview sent, disconnect'); - CloseIPC(); + Preview:= GenPreview; + WriteLnToConsole('Sending preview...'); + SendIPCRaw(@Preview, sizeof(Preview)); + h:= MaxHedgehogs; + SendIPCRaw(@h, sizeof(h)); + WriteLnToConsole('Preview sent, disconnect'); + CloseIPC(); end; //////////////////////////////// procedure Resize(w, h: LongInt); begin - cScreenWidth:= w; - cScreenHeight:= h; - if cFullScreen then - ParseCommand('/fullscr 1', true) - else - ParseCommand('/fullscr 0', true); + cScreenWidth:= w; + cScreenHeight:= h; + if cFullScreen then + ParseCommand('/fullscr 1', true) + else + ParseCommand('/fullscr 0', true); end; ///////////////////// procedure DisplayUsage; var i: LongInt; begin - WriteLn('Wrong argument format: correct configurations is'); - WriteLn(); - WriteLn(' hwengine [option]'); - WriteLn(); - WriteLn('where [option] must be specified either as'); - WriteLn(' --set-video [screen width] [screen height] [color dept]'); - WriteLn(' --set-audio [volume] [enable music] [enable sounds]'); - WriteLn(' --set-other [language file] [full screen] [show FPS]'); - WriteLn(' --set-multimedia [screen height] [screen width] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen]'); - WriteLn(' --set-everything [screen height] [screen width] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen] [show FPS] [alternate damage] [timer value] [reduced quality]'); - WriteLn(); - WriteLn('Read documentation online at http://www.hedgewars.org/node/1465 for more information'); - Write('parsed command: '); - for i:=0 to ParamCount do - Write(ParamStr(i) + ' '); - WriteLn(); + WriteLn('Wrong argument format: correct configurations is'); + WriteLn(); + WriteLn(' hwengine [option]'); + WriteLn(); + WriteLn('where [option] must be specified either as'); + WriteLn(' --set-video [screen width] [screen height] [color dept]'); + WriteLn(' --set-audio [volume] [enable music] [enable sounds]'); + WriteLn(' --set-other [language file] [full screen] [show FPS]'); + WriteLn(' --set-multimedia [screen height] [screen width] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen]'); + WriteLn(' --set-everything [screen height] [screen width] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen] [show FPS] [alternate damage] [timer value] [reduced quality]'); + WriteLn(); + WriteLn('Read documentation online at http://www.hedgewars.org/node/1465 for more information'); + Write('parsed command: '); + for i:=0 to ParamCount do + Write(ParamStr(i) + ' '); + WriteLn(); end; //////////////////// @@ -446,124 +448,124 @@ {$ENDIF} begin - case ParamCount of - 18: begin - val(ParamStr(2), cScreenWidth); - val(ParamStr(3), cScreenHeight); - cInitWidth:= cScreenWidth; - cInitHeight:= cScreenHeight; - cBitsStr:= ParamStr(4); - val(cBitsStr, cBits); - val(ParamStr(5), ipcPort); - cFullScreen:= ParamStr(6) = '1'; - isSoundEnabled:= ParamStr(7) = '1'; - cVSyncInUse:= ParamStr(8) = '1'; - cWeaponTooltips:= ParamStr(9) = '1'; - cLocaleFName:= ParamStr(10); - val(ParamStr(11), cInitVolume); - val(ParamStr(12), cTimerInterval); - PathPrefix:= ParamStr(13); - cShowFPS:= ParamStr(14) = '1'; - cAltDamage:= ParamStr(15) = '1'; - UserNick:= DecodeBase64(ParamStr(16)); - isMusicEnabled:= ParamStr(17) = '1'; - cReducedQuality:= ParamStr(18) = '1'; - end; - 3: begin - val(ParamStr(2), ipcPort); - GameType:= gmtLandPreview; - if ParamStr(3) <> 'landpreview' then - OutError(errmsgShouldntRun, true); - end; - 2: begin - PathPrefix:= ParamStr(1); - recordFileName:= ParamStr(2); - end; - 6: begin - PathPrefix:= ParamStr(1); - recordFileName:= ParamStr(2); + case ParamCount of + 18: begin + val(ParamStr(2), cScreenWidth); + val(ParamStr(3), cScreenHeight); + cInitWidth:= cScreenWidth; + cInitHeight:= cScreenHeight; + cBitsStr:= ParamStr(4); + val(cBitsStr, cBits); + val(ParamStr(5), ipcPort); + cFullScreen:= ParamStr(6) = '1'; + isSoundEnabled:= ParamStr(7) = '1'; + cVSyncInUse:= ParamStr(8) = '1'; + cWeaponTooltips:= ParamStr(9) = '1'; + cLocaleFName:= ParamStr(10); + val(ParamStr(11), cInitVolume); + val(ParamStr(12), cTimerInterval); + PathPrefix:= ParamStr(13); + cShowFPS:= ParamStr(14) = '1'; + cAltDamage:= ParamStr(15) = '1'; + UserNick:= DecodeBase64(ParamStr(16)); + isMusicEnabled:= ParamStr(17) = '1'; + cReducedQuality:= ParamStr(18) = '1'; + end; + 3: begin + val(ParamStr(2), ipcPort); + GameType:= gmtLandPreview; + if ParamStr(3) <> 'landpreview' then + OutError(errmsgShouldntRun, true); + end; + 2: begin + PathPrefix:= ParamStr(1); + recordFileName:= ParamStr(2); + end; + 6: begin + PathPrefix:= ParamStr(1); + recordFileName:= ParamStr(2); - if ParamStr(3) = '--set-video' then - begin - val(ParamStr(4), cScreenWidth); - val(ParamStr(5), cScreenHeight); - cInitWidth:= cScreenWidth; - cInitHeight:= cScreenHeight; - cBitsStr:= ParamStr(6); - val(cBitsStr, cBits); - end - else - begin - if ParamStr(3) = '--set-audio' then - begin - val(ParamStr(4), cInitVolume); - isMusicEnabled:= ParamStr(5) = '1'; - isSoundEnabled:= ParamStr(6) = '1'; - end - else - begin - if ParamStr(3) = '--set-other' then - begin - cLocaleFName:= ParamStr(4); - cFullScreen:= ParamStr(5) = '1'; - cShowFPS:= ParamStr(6) = '1'; - end - else GameType:= gmtSyntax; - end - end; - end; - 11: begin - PathPrefix:= ParamStr(1); - recordFileName:= ParamStr(2); + if ParamStr(3) = '--set-video' then + begin + val(ParamStr(4), cScreenWidth); + val(ParamStr(5), cScreenHeight); + cInitWidth:= cScreenWidth; + cInitHeight:= cScreenHeight; + cBitsStr:= ParamStr(6); + val(cBitsStr, cBits); + end + else + begin + if ParamStr(3) = '--set-audio' then + begin + val(ParamStr(4), cInitVolume); + isMusicEnabled:= ParamStr(5) = '1'; + isSoundEnabled:= ParamStr(6) = '1'; + end + else + begin + if ParamStr(3) = '--set-other' then + begin + cLocaleFName:= ParamStr(4); + cFullScreen:= ParamStr(5) = '1'; + cShowFPS:= ParamStr(6) = '1'; + end + else GameType:= gmtSyntax; + end + end; + end; + 11: begin + PathPrefix:= ParamStr(1); + recordFileName:= ParamStr(2); - if ParamStr(3) = '--set-multimedia' then - begin - val(ParamStr(4), cScreenWidth); - val(ParamStr(5), cScreenHeight); - cInitWidth:= cScreenWidth; - cInitHeight:= cScreenHeight; - cBitsStr:= ParamStr(6); - val(cBitsStr, cBits); - val(ParamStr(7), cInitVolume); - isMusicEnabled:= ParamStr(8) = '1'; - isSoundEnabled:= ParamStr(9) = '1'; - cLocaleFName:= ParamStr(10); - cFullScreen:= ParamStr(11) = '1'; - end - else GameType:= gmtSyntax; - end; - 15: begin - PathPrefix:= ParamStr(1); - recordFileName:= ParamStr(2); - if ParamStr(3) = '--set-everything' then - begin - val(ParamStr(4), cScreenWidth); - val(ParamStr(5), cScreenHeight); - cInitWidth:= cScreenWidth; - cInitHeight:= cScreenHeight; - cBitsStr:= ParamStr(6); - val(cBitsStr, cBits); - val(ParamStr(7), cInitVolume); - isMusicEnabled:= ParamStr(8) = '1'; - isSoundEnabled:= ParamStr(9) = '1'; - cLocaleFName:= ParamStr(10); - cFullScreen:= ParamStr(11) = '1'; - cAltDamage:= ParamStr(12) = '1'; - cShowFPS:= ParamStr(13) = '1'; - val(ParamStr(14), cTimerInterval); - cReducedQuality:= ParamStr(15) = '1'; - end - else GameType:= gmtSyntax; - end; - else GameType:= gmtSyntax; - end; + if ParamStr(3) = '--set-multimedia' then + begin + val(ParamStr(4), cScreenWidth); + val(ParamStr(5), cScreenHeight); + cInitWidth:= cScreenWidth; + cInitHeight:= cScreenHeight; + cBitsStr:= ParamStr(6); + val(cBitsStr, cBits); + val(ParamStr(7), cInitVolume); + isMusicEnabled:= ParamStr(8) = '1'; + isSoundEnabled:= ParamStr(9) = '1'; + cLocaleFName:= ParamStr(10); + cFullScreen:= ParamStr(11) = '1'; + end + else GameType:= gmtSyntax; + end; + 15: begin + PathPrefix:= ParamStr(1); + recordFileName:= ParamStr(2); + if ParamStr(3) = '--set-everything' then + begin + val(ParamStr(4), cScreenWidth); + val(ParamStr(5), cScreenHeight); + cInitWidth:= cScreenWidth; + cInitHeight:= cScreenHeight; + cBitsStr:= ParamStr(6); + val(cBitsStr, cBits); + val(ParamStr(7), cInitVolume); + isMusicEnabled:= ParamStr(8) = '1'; + isSoundEnabled:= ParamStr(9) = '1'; + cLocaleFName:= ParamStr(10); + cFullScreen:= ParamStr(11) = '1'; + cAltDamage:= ParamStr(12) = '1'; + cShowFPS:= ParamStr(13) = '1'; + val(ParamStr(14), cTimerInterval); + cReducedQuality:= ParamStr(15) = '1'; + end + else GameType:= gmtSyntax; + end; + else GameType:= gmtSyntax; + end; {$IFDEF DEBUGFILE} - AddFileLog('Prefix: "' + PathPrefix +'"'); - for i:= 0 to ParamCount do - AddFileLog(inttostr(i) + ': ' + ParamStr(i)); + AddFileLog('Prefix: "' + PathPrefix +'"'); + for i:= 0 to ParamCount do + AddFileLog(inttostr(i) + ': ' + ParamStr(i)); {$IFDEF IPHONEOS} - WriteLnToConsole('Saving debug file at: ' + IPH_getDocumentsPath()); + WriteLnToConsole('Saving debug file at: ' + IPH_getDocumentsPath()); {$ENDIF} {$ENDIF} end; @@ -572,20 +574,20 @@ //////////////////////////////////////////////////////////////////////////////// begin - initEverything(); - WriteLnToConsole('Hedgewars ' + cVersionString + ' engine (network protocol: ' + inttostr(cNetProtoVersion) + ')'); - - GetParams(); - Randomize(); + initEverything(); + WriteLnToConsole('Hedgewars ' + cVersionString + ' engine (network protocol: ' + inttostr(cNetProtoVersion) + ')'); + + GetParams(); + Randomize(); - if GameType = gmtLandPreview then GenLandPreview() - else if GameType = gmtSyntax then DisplayUsage() - else Game(); - freeEverything(); - - if GameType = gmtSyntax then - ExitCode:= 1 - else - ExitCode:= 0; + if GameType = gmtLandPreview then GenLandPreview() + else if GameType = gmtSyntax then DisplayUsage() + else Game(); + freeEverything(); + + if GameType = gmtSyntax then + ExitCode:= 1 + else + ExitCode:= 0; {$ENDIF} end. diff -r 1d9e0a541c62 -r 803b277e4894 hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Sat Mar 06 01:26:12 2010 +0000 +++ b/hedgewars/uConsts.pas Sat Mar 06 10:54:24 2010 +0000 @@ -383,31 +383,25 @@ cTargetPointRef : TPoint = (X: NoPointX; Y: 0); // hog tag mask - htNone = $00; - htTeamName = $01; - htName = $02; - htHealth = $04; - htTransparent = $80; - - cHHFileName = 'Hedgehog'; - cCHFileName = 'Crosshair'; - cThemeCFGFilename = 'theme.cfg'; - - FontBorder = 2; -var PathPrefix: shortstring; - Pathz: array[TPathType] of shortstring; - CountTexz: array[1..Pred(AMMO_INFINITE)] of PTexture; + // hog tag mask + htNone = $00; + htTeamName = $01; + htName = $02; + htHealth = $04; + htTransparent = $08; + + cHHFileName = 'Hedgehog'; + cCHFileName = 'Crosshair'; + cThemeCFGFilename = 'theme.cfg'; + + FontBorder = 2; +var PathPrefix: shortstring; + Pathz: array[TPathType] of shortstring; + CountTexz: array[1..Pred(AMMO_INFINITE)] of PTexture; -const cTagsMasks : array[0..7] of byte = ( - htTeamName or htName or htHealth, - htName or htHealth, - htHealth, - htNone, - htTeamName or htName or htHealth or htTransparent, - htName or htHealth or htTransparent, - htHealth or htTransparent, - htNone - ); +const + cTagsMasks : array[0..15] of byte = (7, 0, 0, 0, 15, 6, 4, 5, 0, 0, 0, 0, 0, 14, 12, 13); + cTagsMasksNoHealth: array[0..15] of byte = (3, 2, 11, 1, 0, 0, 0, 0, 0, 10, 0, 9, 0, 0, 0, 0); Fontz: array[THWFont] of THHFont = ( (Handle: nil; diff -r 1d9e0a541c62 -r 803b277e4894 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Sat Mar 06 01:26:12 2010 +0000 +++ b/hedgewars/uGears.pas Sat Mar 06 10:54:24 2010 +0000 @@ -1349,24 +1349,24 @@ or (bShowFinger and ((Gear^.State and gstHHDriven) <> 0)) then begin t:= hwRound(Gear^.Y) - cHHRadius - 12 + WorldDy; - if (cTagsMasks[cTagsMaskIndex] and htTransparent) <> 0 then + if (cTagsMask and htTransparent) <> 0 then glColor4f(1, 1, 1, 0.5); - if ((cTagsMasks[cTagsMaskIndex] and htHealth) <> 0) and ((GameFlags and gfInvulnerable) = 0) then + if ((cTagsMask and htHealth) <> 0) then begin dec(t, HealthTagTex^.h + 2); DrawCentered(hwRound(Gear^.X) + WorldDx, t, HealthTagTex) end; - if (cTagsMasks[cTagsMaskIndex] and htName) <> 0 then + if (cTagsMask and htName) <> 0 then begin dec(t, NameTagTex^.h + 2); DrawCentered(hwRound(Gear^.X) + WorldDx, t, NameTagTex) end; - if (cTagsMasks[cTagsMaskIndex] and htTeamName) <> 0 then + if (cTagsMask and htTeamName) <> 0 then begin dec(t, Team^.NameTagTex^.h + 2); DrawCentered(hwRound(Gear^.X) + WorldDx, t, Team^.NameTagTex) end; - if (cTagsMasks[cTagsMaskIndex] and htTransparent) <> 0 then + if (cTagsMask and htTransparent) <> 0 then glColor4f(1, 1, 1, 1) end; if (Gear^.State and gstHHDriven) <> 0 then // Current hedgehog diff -r 1d9e0a541c62 -r 803b277e4894 hedgewars/uMisc.pas --- a/hedgewars/uMisc.pas Sat Mar 06 01:26:12 2010 +0000 +++ b/hedgewars/uMisc.pas Sat Mar 06 10:54:24 2010 +0000 @@ -1,20 +1,20 @@ (* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2004-2008 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - *) +* Hedgewars, a free turn based strategy game +* Copyright (c) 2004-2008 Andrey Korotaev +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; version 2 of the License +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +*) {$INCLUDE "options.inc"} @@ -23,106 +23,106 @@ uses SDLh, uConsts, uFloat, {$IFDEF GLES11} - gles11; + gles11; {$ELSE} - GL; + GL; {$ENDIF} var - isCursorVisible : boolean; - isTerminated : boolean; - isInLag : boolean; - isPaused : boolean; - isSoundEnabled : boolean; - isMusicEnabled : boolean; - isSEBackup : boolean; - isInMultiShoot : boolean; - isSpeed : boolean; + isCursorVisible : boolean; + isTerminated : boolean; + isInLag : boolean; + isPaused : boolean; + isSoundEnabled : boolean; + isMusicEnabled : boolean; + isSEBackup : boolean; + isInMultiShoot : boolean; + isSpeed : boolean; - fastUntilLag : boolean; + fastUntilLag : boolean; - GameState : TGameState; - GameType : TGameType; - GameFlags : Longword; - TrainingFlags : Longword; - TurnTimeLeft : Longword; - cSuddenDTurns : LongInt; - cDamagePercent : LongInt; - cMineDudPercent : LongInt; - cTemplateFilter : LongInt; + GameState : TGameState; + GameType : TGameType; + GameFlags : Longword; + TrainingFlags : Longword; + TurnTimeLeft : Longword; + cSuddenDTurns : LongInt; + cDamagePercent : LongInt; + cMineDudPercent : LongWord; + cTemplateFilter : LongInt; - cHedgehogTurnTime: Longword; - cMinesTime : LongInt; - cMaxAIThinkTime : Longword; + cHedgehogTurnTime: Longword; + cMinesTime : LongInt; + cMaxAIThinkTime : Longword; - cCloudsNumber : LongInt; - cScreenWidth : LongInt; - cScreenHeight : LongInt; - cInitWidth : LongInt; - cInitHeight : LongInt; - cVSyncInUse : boolean; - cBits : LongInt; - cBitsStr : string[2]; - cTagsMaskIndex : byte; - zoom : GLfloat; - ZoomValue : GLfloat; + cCloudsNumber : LongInt; + cScreenWidth : LongInt; + cScreenHeight : LongInt; + cInitWidth : LongInt; + cInitHeight : LongInt; + cVSyncInUse : boolean; + cBits : LongInt; + cBitsStr : string[2]; + cTagsMask : byte; + zoom : GLfloat; + ZoomValue : GLfloat; - cWaterLine : LongInt; - cGearScrEdgesDist: LongInt; - cAltDamage : boolean; + cWaterLine : LongInt; + cGearScrEdgesDist: LongInt; + cAltDamage : boolean; - GameTicks : LongWord; - TrainingTimeInc : Longword; - TrainingTimeInD : Longword; - TrainingTimeInM : Longword; - TrainingTimeMax : Longword; + GameTicks : LongWord; + TrainingTimeInc : Longword; + TrainingTimeInD : Longword; + TrainingTimeInM : Longword; + TrainingTimeMax : Longword; - TimeTrialStartTime: Longword; - TimeTrialStopTime : Longword; - - recordFileName : shortstring; - cShowFPS : boolean; - cCaseFactor : Longword; - cLandAdditions : Longword; - cExplosives : Longword; - cFullScreen : boolean; - cReducedQuality : boolean; - cLocaleFName : shortstring; - cSeed : shortstring; - cInitVolume : LongInt; - cVolumeDelta : LongInt; - cTimerInterval : Longword; - cHasFocus : boolean; - cInactDelay : Longword; + TimeTrialStartTime: Longword; + TimeTrialStopTime : Longword; + + recordFileName : shortstring; + cShowFPS : boolean; + cCaseFactor : Longword; + cLandAdditions : Longword; + cExplosives : Longword; + cFullScreen : boolean; + cReducedQuality : boolean; + cLocaleFName : shortstring; + cSeed : shortstring; + cInitVolume : LongInt; + cVolumeDelta : LongInt; + cTimerInterval : Longword; + cHasFocus : boolean; + cInactDelay : Longword; - bBetweenTurns : boolean; - cHealthDecrease : LongWord; - bWaterRising : Boolean; + bBetweenTurns : boolean; + cHealthDecrease : LongWord; + bWaterRising : Boolean; - ShowCrosshair : boolean; - CursorMovementX : Integer; - CursorMovementY : Integer; - cDrownSpeed : hwFloat; - cMaxWindSpeed : hwFloat; - cWindSpeed : hwFloat; - cGravity : hwFloat; - cDamageModifier : hwFloat; - cLaserSighting : boolean; - cVampiric : boolean; - cArtillery : boolean; - WeaponTooltipTex : PTexture; - cWeaponTooltips: boolean; + ShowCrosshair : boolean; + CursorMovementX : Integer; + CursorMovementY : Integer; + cDrownSpeed : hwFloat; + cMaxWindSpeed : hwFloat; + cWindSpeed : hwFloat; + cGravity : hwFloat; + cDamageModifier : hwFloat; + cLaserSighting : boolean; + cVampiric : boolean; + cArtillery : boolean; + WeaponTooltipTex : PTexture; + cWeaponTooltips: boolean; - flagMakeCapture : boolean; + flagMakeCapture : boolean; - InitStepsFlags : Longword; - RealTicks : Longword; - AttackBar : LongInt; + InitStepsFlags : Longword; + RealTicks : Longword; + AttackBar : LongInt; - WaterColorArray : array[0..3] of HwColor4f; + WaterColorArray : array[0..3] of HwColor4f; - CursorPoint : TPoint; - TargetPoint : TPoint; + CursorPoint : TPoint; + TargetPoint : TPoint; TextureList : PTexture; @@ -178,12 +178,12 @@ begin i:= Pos(' ', a); if i > 0 then - begin - for t:= 1 to Pred(i) do - if (a[t] >= 'A')and(a[t] <= 'Z') then Inc(a[t], 32); - b:= copy(a, i + 1, Length(a) - i); - byte(a[0]):= Pred(i) - end else b:= ''; + begin + for t:= 1 to Pred(i) do + if (a[t] >= 'A')and(a[t] <= 'Z') then Inc(a[t], 32); + b:= copy(a, i + 1, Length(a) - i); + byte(a[0]):= Pred(i) + end else b:= ''; end; procedure SplitByChar(var a, b: ansistring; c: char); @@ -191,10 +191,10 @@ begin i:= Pos(c, a); if i > 0 then - begin - b:= copy(a, i + 1, Length(a) - i); - setlength(a, Pred(i)); - end else b:= ''; + begin + b:= copy(a, i + 1, Length(a) - i); + setlength(a, Pred(i)); + end else b:= ''; end; procedure movecursor(dx, dy: Integer); @@ -229,11 +229,11 @@ {$IFDEF DEBUGFILE}AddFileLog(Msg);{$ENDIF} WriteLnToConsole(Msg); if isFatalError then - begin - SendIPC('E' + GetLastConsoleLine); - SDL_Quit; - halt(1) - end +begin +SendIPC('E' + GetLastConsoleLine); +SDL_Quit; +halt(1) +end end; procedure TryDo(Assert: boolean; Msg: shortstring; isFatal: boolean); @@ -313,10 +313,10 @@ var s: shortstring; begin if KBnum <> 0 then - begin - s:= 'K' + inttostr(KBnum); - SendIPCRaw(@s, Length(s) + 1) - end +begin +s:= 'K' + inttostr(KBnum); +SendIPCRaw(@s, Length(s) + 1) +end end; procedure SetLittle(var r: hwFloat); @@ -356,25 +356,25 @@ procedure ResetVertexArrays(texture: PTexture); begin with texture^ do - begin - vb[0].X:= 0; - vb[0].Y:= 0; - vb[1].X:= w; - vb[1].Y:= 0; - vb[2].X:= w; - vb[2].Y:= h; - vb[3].X:= 0; - vb[3].Y:= h; + begin + vb[0].X:= 0; + vb[0].Y:= 0; + vb[1].X:= w; + vb[1].Y:= 0; + vb[2].X:= w; + vb[2].Y:= h; + vb[3].X:= 0; + vb[3].Y:= h; - tb[0].X:= 0; - tb[0].Y:= 0; - tb[1].X:= rx; - tb[1].Y:= 0; - tb[2].X:= rx; - tb[2].Y:= ry; - tb[3].X:= 0; - tb[3].Y:= ry - end; + tb[0].X:= 0; + tb[0].Y:= 0; + tb[1].X:= rx; + tb[1].Y:= 0; + tb[2].X:= rx; + tb[2].Y:= ry; + tb[3].X:= 0; + tb[3].Y:= ry + end; end; function NewTexture(width, height: Longword; buf: Pointer): PTexture; @@ -424,9 +424,9 @@ if (surf^.format^.BytesPerPixel <> 4) then begin - TryDo(false, 'Surface2Tex failed, expecting 32 bit surface', true); - Surface2Tex^.id:= 0; - exit + TryDo(false, 'Surface2Tex failed, expecting 32 bit surface', true); + Surface2Tex^.id:= 0; + exit end; @@ -435,50 +435,50 @@ glBindTexture(GL_TEXTURE_2D, Surface2Tex^.id); if SDL_MustLock(surf) then - SDLTry(SDL_LockSurface(surf) >= 0, true); + SDLTry(SDL_LockSurface(surf) >= 0, true); if (not SupportNPOTT) and (not (isPowerOf2(Surf^.w) and isPowerOf2(Surf^.h))) then begin - tw:= toPowerOf2(Surf^.w); - th:= toPowerOf2(Surf^.h); + tw:= toPowerOf2(Surf^.w); + th:= toPowerOf2(Surf^.h); - Surface2Tex^.rx:= Surf^.w / tw; - Surface2Tex^.ry:= Surf^.h / th; + Surface2Tex^.rx:= Surf^.w / tw; + Surface2Tex^.ry:= Surf^.h / th; - GetMem(tmpp, tw * th * surf^.format^.BytesPerPixel); + GetMem(tmpp, tw * th * surf^.format^.BytesPerPixel); - fromP4:= Surf^.pixels; - toP4:= tmpp; + fromP4:= Surf^.pixels; + toP4:= tmpp; - for y:= 0 to Pred(Surf^.h) do - begin - for x:= 0 to Pred(Surf^.w) do toP4^[x]:= fromP4^[x]; - for x:= Surf^.w to Pred(tw) do toP4^[x]:= 0; - toP4:= @(toP4^[tw]); - fromP4:= @(fromP4^[Surf^.pitch div 4]); - end; + for y:= 0 to Pred(Surf^.h) do + begin + for x:= 0 to Pred(Surf^.w) do toP4^[x]:= fromP4^[x]; + for x:= Surf^.w to Pred(tw) do toP4^[x]:= 0; + toP4:= @(toP4^[tw]); + fromP4:= @(fromP4^[Surf^.pitch div 4]); + end; - for y:= Surf^.h to Pred(th) do - begin - for x:= 0 to Pred(tw) do toP4^[x]:= 0; - toP4:= @(toP4^[tw]); - end; + for y:= Surf^.h to Pred(th) do + begin + for x:= 0 to Pred(tw) do toP4^[x]:= 0; + toP4:= @(toP4^[tw]); + end; - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tw, th, 0, GL_RGBA, GL_UNSIGNED_BYTE, tmpp); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tw, th, 0, GL_RGBA, GL_UNSIGNED_BYTE, tmpp); - FreeMem(tmpp, tw * th * surf^.format^.BytesPerPixel) + FreeMem(tmpp, tw * th * surf^.format^.BytesPerPixel) end else begin - Surface2Tex^.rx:= 1.0; - Surface2Tex^.ry:= 1.0; - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, surf^.w, surf^.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, surf^.pixels); + Surface2Tex^.rx:= 1.0; + Surface2Tex^.ry:= 1.0; + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, surf^.w, surf^.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, surf^.pixels); end; ResetVertexArrays(Surface2Tex); if SDL_MustLock(surf) then - SDL_UnlockSurface(surf); + SDL_UnlockSurface(surf); SetTextureParameters(enableClamp); end; @@ -486,13 +486,13 @@ procedure FreeTexture(tex: PTexture); begin if tex <> nil then - begin + begin if tex^.NextTexture <> nil then tex^.NextTexture^.PrevTexture:= tex^.PrevTexture; if tex^.PrevTexture <> nil then tex^.PrevTexture^.NextTexture:= tex^.NextTexture - else TextureList:= tex^.NextTexture; - glDeleteTextures(1, @tex^.id); - Dispose(tex) - end + else TextureList:= tex^.NextTexture; + glDeleteTextures(1, @tex^.id); + Dispose(tex) + end end; function DecodeBase64(s: shortstring): shortstring; @@ -501,22 +501,22 @@ begin c:= 0; for i:= 1 to Length(s) do - begin - t:= Pos(s[i], table); - if s[i] = '=' then inc(c); - if t > 0 then byte(s[i]):= t - 1 else byte(s[i]):= 0 - end; + begin + t:= Pos(s[i], table); + if s[i] = '=' then inc(c); + if t > 0 then byte(s[i]):= t - 1 else byte(s[i]):= 0 + end; i:= 1; t:= 1; while i <= length(s) do - begin - DecodeBase64[t ]:= char((byte(s[i ]) shl 2) or (byte(s[i + 1]) shr 4)); - DecodeBase64[t + 1]:= char((byte(s[i + 1]) shl 4) or (byte(s[i + 2]) shr 2)); - DecodeBase64[t + 2]:= char((byte(s[i + 2]) shl 6) or (byte(s[i + 3]) )); - inc(t, 3); - inc(i, 4) - end; + begin + DecodeBase64[t ]:= char((byte(s[i ]) shl 2) or (byte(s[i + 1]) shr 4)); + DecodeBase64[t + 1]:= char((byte(s[i + 1]) shl 4) or (byte(s[i + 2]) shr 2)); + DecodeBase64[t + 2]:= char((byte(s[i + 2]) shl 6) or (byte(s[i + 3]) )); + inc(t, 3); + inc(i, 4) + end; if c < 3 then t:= t - c; @@ -526,30 +526,30 @@ {$IFNDEF IPHONEOS} procedure MakeScreenshot(filename: shortstring); var p: Pointer; - size: Longword; - f: file; + size: Longword; + f: file; {$IFNDEF WIN32} - // TGA Header - head: array[0..8] of Word = (0, 2, 0, 0, 0, 0, 0, 0, 24); + // TGA Header + head: array[0..8] of Word = (0, 2, 0, 0, 0, 0, 0, 0, 24); {$ELSE} - // Windows Bitmap Header - head: array[0..53] of Byte = ( - $42, $4D, // identifier ("BM") - 0, 0, 0, 0, // file size - 0, 0, 0, 0, // reserved - 54, 0, 0, 0, // starting offset - 40, 0, 0, 0, // header size - 0, 0, 0, 0, // width - 0, 0, 0, 0, // height - 1, 0, // color planes - 24, 0, // bit depth - 0, 0, 0, 0, // compression method (uncompressed) - 0, 0, 0, 0, // image size - 96, 0, 0, 0, // horizontal resolution - 96, 0, 0, 0, // vertical resolution - 0, 0, 0, 0, // number of colors (all) - 0, 0, 0, 0 // number of important colors - ); + // Windows Bitmap Header + head: array[0..53] of Byte = ( + $42, $4D, // identifier ("BM") + 0, 0, 0, 0, // file size + 0, 0, 0, 0, // reserved + 54, 0, 0, 0, // starting offset + 40, 0, 0, 0, // header size + 0, 0, 0, 0, // width + 0, 0, 0, 0, // height + 1, 0, // color planes + 24, 0, // bit depth + 0, 0, 0, 0, // compression method (uncompressed) + 0, 0, 0, 0, // image size + 96, 0, 0, 0, // horizontal resolution + 96, 0, 0, 0, // vertical resolution + 0, 0, 0, 0, // number of colors (all) + 0, 0, 0, 0 // number of important colors + ); {$ENDIF} begin playSound(sndShutter); @@ -592,11 +592,11 @@ Assign(f, filename); Rewrite(f, 1); if IOResult = 0 then - begin - BlockWrite(f, head, sizeof(head)); - BlockWrite(f, p^, size); - Close(f); - end; + begin + BlockWrite(f, head, sizeof(head)); + BlockWrite(f, p^, size); + Close(f); + end; {$I+} FreeMem(p) @@ -620,14 +620,14 @@ {* for more information http://www.idevgames.com/forum/showpost.php?p=85864&postcount=7 *} var convertedSurf: PSDL_Surface = nil; begin - if (tmpsurf^.format^.bitsperpixel = 24) or ((tmpsurf^.format^.bitsperpixel = 32) and (tmpsurf^.format^.rshift > tmpsurf^.format^.bshift)) then - begin - convertedSurf:= SDL_ConvertSurface(tmpsurf, @conversionFormat, SDL_SWSURFACE); - SDL_FreeSurface(tmpsurf); - exit(convertedSurf); - end; + if (tmpsurf^.format^.bitsperpixel = 24) or ((tmpsurf^.format^.bitsperpixel = 32) and (tmpsurf^.format^.rshift > tmpsurf^.format^.bshift)) then + begin + convertedSurf:= SDL_ConvertSurface(tmpsurf, @conversionFormat, SDL_SWSURFACE); + SDL_FreeSurface(tmpsurf); + exit(convertedSurf); + end; - exit(tmpsurf); + exit(tmpsurf); end; function endian(independent: LongWord): LongWord; @@ -636,9 +636,9 @@ endian:= independent; {$ELSE} endian:= (((independent and $FF000000) shr 24) or - ((independent and $00FF0000) shr 8) or - ((independent and $0000FF00) shl 8) or - ((independent and $000000FF) shl 24)) + ((independent and $00FF0000) shr 8) or + ((independent and $0000FF00) shl 8) or + ((independent and $000000FF) shl 24)) {$ENDIF} end; @@ -646,112 +646,112 @@ procedure init_uMisc; {$IFNDEF IPHONEOS}var i: LongInt;{$ENDIF} begin - cDrownSpeed.QWordValue := 257698038; // 0.06 - cMaxWindSpeed.QWordValue:= 2147484; // 0.0005 - cWindSpeed.QWordValue := 429496; // 0.0001 - cGravity := cMaxWindSpeed; - cDamageModifier := _1; - TargetPoint := cTargetPointRef; - TextureList := nil; - - // 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; + cDrownSpeed.QWordValue := 257698038; // 0.06 + cMaxWindSpeed.QWordValue:= 2147484; // 0.0005 + cWindSpeed.QWordValue := 429496; // 0.0001 + cGravity := cMaxWindSpeed; + cDamageModifier := _1; + TargetPoint := cTargetPointRef; + TextureList := nil; + + // 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; - cMineDudPercent := 0; - cTemplateFilter := 0; + GameFlags := 0; + TrainingFlags := 0; + TurnTimeLeft := 0; + cSuddenDTurns := 15; + cDamagePercent := 100; + cMineDudPercent := 0; + cTemplateFilter := 0; - cHedgehogTurnTime := 45000; - cMinesTime := 3000; - cMaxAIThinkTime := 9000; + 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'; - WeaponTooltipTex := nil; + cCloudsNumber := 9; + cScreenWidth := 1024; + cScreenHeight := 768; + cInitWidth := cScreenWidth; + cInitHeight := cScreenHeight; + cBits := 32; + cTagsMask := 0; + 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'; + WeaponTooltipTex := nil; - // 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; - cExplosives := 2; - cFullScreen := false; - cReducedQuality := false; - cLocaleFName := 'en.txt'; - cSeed := ''; - cInitVolume := 50; - cVolumeDelta := 0; - cTimerInterval := 8; - cHasFocus := true; - cInactDelay := 1250; - cAltDamage := true; + // 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; + cExplosives := 2; + cFullScreen := false; + cReducedQuality := false; + cLocaleFName := 'en.txt'; + cSeed := ''; + cInitVolume := 50; + cVolumeDelta := 0; + cTimerInterval := 8; + cHasFocus := true; + cInactDelay := 1250; + cAltDamage := true; {$IFDEF DEBUGFILE} {$I-} {$IFDEF IPHONEOS} - f:= stderr; + f:= stderr; {$ELSE} - if ParamStr(1) <> '' then - begin - for i:= 0 to 7 do - begin - assign(f, ParamStr(1) + '/debug' + inttostr(i) + '.txt'); - rewrite(f); - if IOResult = 0 then break; - end; - if IOResult <> 0 then f:= stderr; // if everything fails, write to stderr - end - else - f:= stderr; + if ParamStr(1) <> '' then + begin + for i:= 0 to 7 do + begin + assign(f, ParamStr(1) + '/debug' + inttostr(i) + '.txt'); + rewrite(f); + if IOResult = 0 then break; + end; + if IOResult <> 0 then f:= stderr; // if everything fails, write to stderr + end + else + f:= stderr; {$ENDIF} {$I+} {$ENDIF} @@ -760,13 +760,13 @@ procedure free_uMisc; begin - //uRandom.DumpBuffer; - while TextureList <> nil do FreeTexture(TextureList); + //uRandom.DumpBuffer; + while TextureList <> nil do FreeTexture(TextureList); {$IFDEF DEBUGFILE} - writeln(f, 'halt at ', GameTicks, ' ticks. TurnTimeLeft = ', TurnTimeLeft); - flush(f); - close(f); + writeln(f, 'halt at ', GameTicks, ' ticks. TurnTimeLeft = ', TurnTimeLeft); + flush(f); + close(f); {$ENDIF} end;