# HG changeset patch # User unc0rr # Date 1169409062 0 # Node ID 29bc9c36ad5f7208c2105b3978efa5d9a93eddb6 # Parent c3ccec3834e85983d55b05d253f6a61aa5603efd Fixed-point arithmetics in engine. Introduced many bugs. Currently disabled: - land morphing in land generator - AI - many minor features Engine is nearly unusable and totally unplayable. diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/CCHandlers.inc --- a/hedgewars/CCHandlers.inc Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/CCHandlers.inc Sun Jan 21 19:51:02 2007 +0000 @@ -17,13 +17,15 @@ *) function CheckNoTeamOrHH: boolean; +var Result: boolean; begin -Result:= (CurrentTeam = nil) or (CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear = nil); +Result:= (CurrentTeam = nil) or (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear = nil); {$IFDEF DEBUGFILE} if Result then if CurrentTeam = nil then AddFileLog('CONSOLE: CurTeam = nil') - else AddFileLog('CONSOLE: CurTeam <> nil, Gear = nil') + else AddFileLog('CONSOLE: CurTeam <> nil, Gear = nil'); {$ENDIF} +CheckNoTeamOrHH:= Result end; //////////////////////////////////////////////////////////////////////////////// procedure chQuit(var s: shortstring); @@ -53,15 +55,15 @@ TryDo(TeamsCount <= 5, 'Too many teams', true); AddTeam end; - -if GameType in [gmtDemo, gmtSave] then CurrentTeam.ExtDriven:= true + +if GameType in [gmtDemo, gmtSave] then CurrentTeam^.ExtDriven:= true end; procedure chTeamLocal(var s: shortstring); begin if not isDeveloperMode then exit; if CurrentTeam = nil then OutError(errmsgIncorrectUse + ' "/rdriven"', true); -CurrentTeam.ExtDriven:= true +CurrentTeam^.ExtDriven:= true end; procedure chName(var id: shortstring); @@ -71,11 +73,11 @@ SplitBySpace(id, s); if s[1]='"' then Delete(s, 1, 1); if s[byte(s[0])]='"' then Delete(s, byte(s[0]), 1); -if id = 'team' then CurrentTeam.TeamName:= s +if id = 'team' then CurrentTeam^.TeamName:= s else if (id[1] = 'h') and (id[2] = 'h') and (id[3] >= '0') and (id[3] <= chr(ord('0')+cMaxHHIndex)) then - CurrentTeam.Hedgehogs[byte(id[3])-48].Name:= s -else OutError(errmsgUnknownVariable + ' "' + id + '"') + CurrentTeam^.Hedgehogs[byte(id[3])-48].Name:= s +else OutError(errmsgUnknownVariable + ' "' + id + '"', false) end; procedure chGrave(var s: shortstring); @@ -83,7 +85,7 @@ if CurrentTeam = nil then OutError(errmsgIncorrectUse + ' "/grave"', true); if s[1]='"' then Delete(s, 1, 1); if s[byte(s[0])]='"' then Delete(s, byte(s[0]), 1); -CurrentTeam.GraveName:= s +CurrentTeam^.GraveName:= s end; procedure chFort(var s: shortstring); @@ -91,16 +93,16 @@ if CurrentTeam = nil then OutError(errmsgIncorrectUse + ' "/grave"', true); if s[1]='"' then Delete(s, 1, 1); if s[byte(s[0])]='"' then Delete(s, byte(s[0]), 1); -CurrentTeam.FortName:= s +CurrentTeam^.FortName:= s end; procedure chColor(var id: shortstring); var c: integer; begin if CurrentTeam = nil then OutError(errmsgIncorrectUse + ' "/color"', true); -val(id, CurrentTeam.Color, c); -CurrentTeam.AdjColor:= CurrentTeam.Color; -AdjustColor(CurrentTeam.AdjColor) +val(id, CurrentTeam^.Color, c); +CurrentTeam^.AdjColor:= CurrentTeam^.Color; +AdjustColor(CurrentTeam^.AdjColor) end; procedure chAddHH(var id: shortstring); @@ -113,11 +115,11 @@ begin SplitBySpace(id, s); val(id, Hedgehogs[HedgehogsNumber].BotLevel, c); - Gear:= AddGear(0, 0, gtHedgehog, 0); - Gear.Hedgehog:= @Hedgehogs[HedgehogsNumber]; - val(s, Gear.Health, c); - TryDo(Gear.Health > 0, 'Invalid hedgehog health', true); - PHedgehog(Gear.Hedgehog).Team:= CurrentTeam; + Gear:= AddGear(0, 0, gtHedgehog, 0, 0, 0, 0); + Gear^.Hedgehog:= @Hedgehogs[HedgehogsNumber]; + val(s, Gear^.Health, c); + TryDo(Gear^.Health > 0, 'Invalid hedgehog health', true); + PHedgehog(Gear^.Hedgehog)^.Team:= CurrentTeam; Hedgehogs[HedgehogsNumber].AmmoStore:= 0; Hedgehogs[HedgehogsNumber].Gear:= Gear; inc(HedgehogsNumber) @@ -138,24 +140,24 @@ if s[1]='"' then Delete(s, 1, 1); if s[byte(s[0])]='"' then Delete(s, byte(s[0]), 1); b:= KeyNameToCode(id); -if b = 0 then OutError(errmsgUnknownVariable + ' "' + id + '"') - else CurrentTeam.Binds[b]:= s +if b = 0 then OutError(errmsgUnknownVariable + ' "' + id + '"', false) + else CurrentTeam^.Binds[b]:= s end; procedure chLeft_p(var s: shortstring); begin if CheckNoTeamOrHH then exit; bShowFinger:= false; -if not CurrentTeam.ExtDriven then SendIPC('L'); -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^ do +if not CurrentTeam^.ExtDriven then SendIPC('L'); +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^ do Message:= Message or gm_Left end; procedure chLeft_m(var s: shortstring); begin if CheckNoTeamOrHH then exit; -if not CurrentTeam.ExtDriven then SendIPC('l'); -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^ do +if not CurrentTeam^.ExtDriven then SendIPC('l'); +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^ do Message:= Message and not gm_Left end; @@ -163,16 +165,16 @@ begin if CheckNoTeamOrHH then exit; bShowFinger:= false; -if not CurrentTeam.ExtDriven then SendIPC('R'); -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^ do +if not CurrentTeam^.ExtDriven then SendIPC('R'); +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^ do Message:= Message or gm_Right end; procedure chRight_m(var s: shortstring); begin if CheckNoTeamOrHH then exit; -if not CurrentTeam.ExtDriven then SendIPC('r'); -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^ do +if not CurrentTeam^.ExtDriven then SendIPC('r'); +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^ do Message:= Message and not gm_Right end; @@ -180,16 +182,16 @@ begin if CheckNoTeamOrHH then exit; bShowFinger:= false; -if not CurrentTeam.ExtDriven then SendIPC('U'); -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^ do +if not CurrentTeam^.ExtDriven then SendIPC('U'); +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^ do Message:= Message or gm_Up end; procedure chUp_m(var s: shortstring); begin if CheckNoTeamOrHH then exit; -if not CurrentTeam.ExtDriven then SendIPC('u'); -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^ do +if not CurrentTeam^.ExtDriven then SendIPC('u'); +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^ do Message:= Message and not gm_Up end; @@ -197,16 +199,16 @@ begin if CheckNoTeamOrHH then exit; bShowFinger:= false; -if not CurrentTeam.ExtDriven then SendIPC('D'); -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^ do +if not CurrentTeam^.ExtDriven then SendIPC('D'); +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^ do Message:= Message or gm_Down end; procedure chDown_m(var s: shortstring); begin if CheckNoTeamOrHH then exit; -if not CurrentTeam.ExtDriven then SendIPC('d'); -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^ do +if not CurrentTeam^.ExtDriven then SendIPC('d'); +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^ do Message:= Message and not gm_Down end; @@ -214,8 +216,8 @@ begin if CheckNoTeamOrHH then exit; bShowFinger:= false; -if not CurrentTeam.ExtDriven then SendIPC('j'); -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^ do +if not CurrentTeam^.ExtDriven then SendIPC('j'); +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^ do Message:= Message or gm_LJump end; @@ -223,8 +225,8 @@ begin if CheckNoTeamOrHH then exit; bShowFinger:= false; -if not CurrentTeam.ExtDriven then SendIPC('J'); -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^ do +if not CurrentTeam^.ExtDriven then SendIPC('J'); +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^ do Message:= Message or gm_HJump end; @@ -232,13 +234,13 @@ begin if CheckNoTeamOrHH then exit; bShowFinger:= false; -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^ do +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^ do begin - {$IFDEF DEBUGFILE}AddFileLog('/+attack: Gear.State = '+inttostr(State));{$ENDIF} + {$IFDEF DEBUGFILE}AddFileLog('/+attack: Gear^.State = '+inttostr(State));{$ENDIF} if ((State and gstHHDriven)<>0)and((State and (gstAttacked or gstHHChooseTarget or gstMoving)) = 0) then begin - FollowGear:= CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear; - if not CurrentTeam.ExtDriven then SendIPC('A'); + FollowGear:= CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear; + if not CurrentTeam^.ExtDriven then SendIPC('A'); Message:= Message or gm_Attack end end @@ -247,9 +249,9 @@ procedure chAttack_m(var s: shortstring); begin if CheckNoTeamOrHH then exit; -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^ do +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^ do begin - if not CurrentTeam.ExtDriven and + if not CurrentTeam^.ExtDriven and ((Message and gm_Attack) <> 0) then SendIPC('a'); Message:= Message and not gm_Attack end @@ -258,8 +260,8 @@ procedure chSwitch(var s: shortstring); begin if CheckNoTeamOrHH then exit; -if not CurrentTeam.ExtDriven then SendIPC('S'); -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^ do +if not CurrentTeam^.ExtDriven then SendIPC('S'); +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^ do Message:= Message or gm_Switch end; @@ -267,7 +269,7 @@ begin if AllInactive then begin - if not CurrentTeam.ExtDriven then SendIPC('N'); + if not CurrentTeam^.ExtDriven then SendIPC('N'); {$IFDEF DEBUGFILE}AddFileLog('Doing SwitchHedgehog: time '+inttostr(GameTicks));{$ENDIF} SwitchHedgehog; end @@ -283,13 +285,13 @@ begin if (s[0] <> #1) or (s[1] < '1') or (s[1] > '5') or (CurrentTeam = nil) then exit; bShowFinger:= false; -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do - if (Ammo[CurSlot, CurAmmo].Propz and ammoprop_Timerable) <> 0 then +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do + if (Ammo^[CurSlot, CurAmmo].Propz and ammoprop_Timerable) <> 0 then begin - Ammo[CurSlot, CurAmmo].Timer:= 1000 * (byte(s[1]) - 48); + Ammo^[CurSlot, CurAmmo].Timer:= 1000 * (byte(s[1]) - 48); with CurrentTeam^ do ApplyAmmoChanges(Hedgehogs[CurrHedgehog]); - if not CurrentTeam.ExtDriven then SendIPC(s); + if not CurrentTeam^.ExtDriven then SendIPC(s); end end; @@ -301,21 +303,21 @@ bShowFinger:= false; slot:= byte(s[1]) - 49; if slot > cMaxSlotIndex then exit; -if not CurrentTeam.ExtDriven then SendIPC(char(byte(s[1]) + 79)); +if not CurrentTeam^.ExtDriven then SendIPC(char(byte(s[1]) + 79)); with CurrentTeam^ do begin with Hedgehogs[CurrHedgehog] do begin - if ((Gear.State and (gstAttacking or gstAttacked)) <> 0) or (AttacksNum > 0) - or ((Gear.State and gstHHDriven) = 0) then exit; // во время стрельбы исключает смену оружия + if ((Gear^.State and (gstAttacking or gstAttacked)) <> 0) or (AttacksNum > 0) + or ((Gear^.State and gstHHDriven) = 0) then exit; // во время стрельбы исключает смену оружия if CurAmmoGear = nil then begin caSlot:= @CurSlot; caAmmo:= @CurAmmo end else begin caSlot:= @AltSlot; caAmmo:= @AltAmmo end; if caSlot^ = slot then begin inc(caAmmo^); - if (caAmmo^ > cMaxSlotAmmoIndex) or (Ammo[slot, caAmmo^].Count = 0) then caAmmo^:= 0 + if (caAmmo^ > cMaxSlotAmmoIndex) or (Ammo^[slot, caAmmo^].Count = 0) then caAmmo^:= 0 end else - if Ammo[slot, 0].Count > 0 then + if Ammo^[slot, 0].Count > 0 then begin caSlot^:= slot; caAmmo^:= 0; @@ -333,12 +335,12 @@ bSelected:= true; exit end; -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^, - CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^, + CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do if (State and gstHHChooseTarget) <> 0 then begin isCursorVisible:= false; - if not CurrentTeam.ExtDriven then + if not CurrentTeam^.ExtDriven then begin SDL_GetMouseState(@TargetPoint.X, @TargetPoint.Y); dec(TargetPoint.X, WorldDx); @@ -346,9 +348,9 @@ SendIPCXY('p', TargetPoint.X, TargetPoint.Y); end; State:= State and not gstHHChooseTarget; - if (Ammo[CurSlot, CurAmmo].Propz and ammoprop_AttackingPut) <> 0 then + 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 else if CurrentTeam^.ExtDriven then OutError('got /put while not being in choose target mode', false) end; procedure chCapture(var s: shortstring); @@ -358,7 +360,7 @@ procedure chSkip(var s: shortstring); begin -if not CurrentTeam.ExtDriven then SendIPC(','); +if not CurrentTeam^.ExtDriven then SendIPC(','); TurnTimeLeft:= 0 end; @@ -398,8 +400,8 @@ begin bSelected:= false; if bShowAmmoMenu then bShowAmmoMenu:= false - else if ((Gear.State and (gstAttacking or gstAttacked)) <> 0) or (AttacksNum > 0) - or ((Gear.State and gstHHDriven) = 0) then else bShowAmmoMenu:= true + else if ((Gear^.State and (gstAttacking or gstAttacked)) <> 0) or (AttacksNum > 0) + or ((Gear^.State and gstHHDriven) = 0) then else bShowAmmoMenu:= true end end; @@ -412,7 +414,7 @@ if Length(s) = 0 then cFullScreen:= not cFullScreen else cFullScreen:= s = '1'; -flags:= SDL_HWSURFACE or SDL_DOUBLEBUF or SDL_HWACCEL; +flags:= SDL_HWSURFACE or SDL_hwFloatBUF or SDL_HWACCEL; if cFullScreen then flags:= flags or SDL_FULLSCREEN else SDL_WM_SetCaption('Hedgewars', nil); SDL_FreeSurface(SDLPrimSurface); @@ -422,7 +424,7 @@ AddFileLog('SDL video driver: ' + string(SDL_VideoDriverName(buf, sizeof(buf)))); {$ENDIF} TryDo(SDLPrimSurface <> nil, errmsgCreateSurface, true); -PixelFormat:= SDLPrimSurface.format +PixelFormat:= SDLPrimSurface^.format end; procedure chVol_p(var s: shortstring); @@ -439,7 +441,7 @@ begin if CheckNoTeamOrHH then exit; bShowFinger:= true; -FollowGear:= CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear +FollowGear:= CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear end; procedure chPause(var s: shortstring); @@ -447,4 +449,3 @@ isPaused:= not isPaused; SDL_ShowCursor(ord(isPaused)) end; - diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/CMakeLists.txt --- a/hedgewars/CMakeLists.txt Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/CMakeLists.txt Sun Jan 21 19:51:02 2007 +0000 @@ -1,7 +1,7 @@ configure_file(${hedgewars_SOURCE_DIR}/hedgewars/proto.inc.in ${hedgewars_SOURCE_DIR}/hedgewars/proto.inc) -set(dcc32_tryexe dcc32.exe) +set(dcc32_tryexe "delphi!doesnt!work.exe") set(fpc_tryexe fpc) set(hwengine_project "hwengine.dpr") @@ -66,7 +66,7 @@ message("Minimum required version of FreePascal is 1.9.4") else (fpc_ver LESS "010904") set(pascal_compiler ${fpc_executable}) - set(pascal_compiler_flags "-k-z" "-knoexecstack" "-B" "-Sd" "-Xs" "-OG" "-O2" "-FE../bin" "-Cs2000000" ${hwengine_project}) + set(pascal_compiler_flags "-FE../bin" "-Cs2000000" "-O2" ${hwengine_project}) endif (fpc_ver LESS "010904") endif (fpc_version) endif (dcc32version) diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/GSHandlers.inc Sun Jan 21 19:51:02 2007 +0000 @@ -20,93 +20,94 @@ function CheckGearDrowning(Gear: PGear): boolean; begin -Result:= Gear.Y + Gear.Radius >= cWaterLine; -if Result then +if cWaterLine < Gear^.Y + Gear^.Radius then begin - Gear.State:= gstDrowning; - Gear.doStep:= doStepDrowningGear; - PlaySound(sndSplash) - end + CheckGearDrowning:= true; + Gear^.State:= gstDrowning; + Gear^.doStep:= @doStepDrowningGear; + PlaySound(sndSplash, false) + end else + CheckGearDrowning:= false end; procedure CheckCollision(Gear: PGear); begin -if TestCollisionXwithGear(Gear, hwSign(Gear.X)) or TestCollisionYwithGear(Gear, hwSign(Gear.Y)) - then Gear.State:= Gear.State or gstCollision - else Gear.State:= Gear.State and not gstCollision +if TestCollisionXwithGear(Gear, hwSign(Gear^.X)) or TestCollisionYwithGear(Gear, hwSign(Gear^.Y)) + then Gear^.State:= Gear^.State or gstCollision + else Gear^.State:= Gear^.State and not gstCollision end; procedure CheckHHDamage(Gear: PGear); begin -if Gear.dY > 0.40 then Gear.Damage:= Gear.Damage + 1 + round(70 * (abs(Gear.dY) - 0.40)); +if _0_4 < Gear^.dY then Gear^.Damage:= Gear^.Damage + 1 + hwRound(70 * (hwAbs(Gear^.dY) - _0_4)); end; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// procedure CalcRotationDirAngle(Gear: PGear); -var dAngle: Double; +var dAngle: hwFloat; begin -dAngle:= (abs(Gear.dX) + abs(Gear.dY))*0.1; -if Gear.dX >= 0 then Gear.DirAngle:= Gear.DirAngle + dAngle - else Gear.DirAngle:= Gear.DirAngle - dAngle; -if Gear.DirAngle < 0 then Gear.DirAngle:= Gear.DirAngle + 16 -else if Gear.DirAngle >= 16 then Gear.DirAngle:= Gear.DirAngle - 16 +dAngle:= (hwAbs(Gear^.dX) + hwAbs(Gear^.dY)) * _0_1; +if not Gear^.dX.isNegative then Gear^.DirAngle:= Gear^.DirAngle + dAngle + else Gear^.DirAngle:= Gear^.DirAngle - dAngle; +if Gear^.DirAngle < 0 then Gear^.DirAngle:= Gear^.DirAngle + 16 +else if 16 < Gear^.DirAngle then Gear^.DirAngle:= Gear^.DirAngle - 16 end; //////////////////////////////////////////////////////////////////////////////// procedure doStepDrowningGear(Gear: PGear); begin AllInactive:= false; -Gear.Y:= Gear.Y + cDrownSpeed; -if round(Gear.Y) > Gear.Radius + cWaterLine + cVisibleWater then DeleteGear(Gear) +Gear^.Y:= Gear^.Y + cDrownSpeed; +if hwRound(Gear^.Y) > Gear^.Radius + cWaterLine + cVisibleWater then DeleteGear(Gear) end; //////////////////////////////////////////////////////////////////////////////// procedure doStepFallingGear(Gear: PGear); var b: boolean; begin -if TestCollisionYwithGear(Gear, hwSign(Gear.dY)) then +if TestCollisionYwithGear(Gear, hwSign(Gear^.dY)) then begin - Gear.dX:= Gear.dX * Gear.Friction; - Gear.dY:= - Gear.dY * Gear.Elasticity; + Gear^.dX:= Gear^.dX * Gear^.Friction; + Gear^.dY:= - Gear^.dY * Gear^.Elasticity; b:= false end else b:= true; -if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then +if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then begin - Gear.dX:= - Gear.dX * Gear.Elasticity; -// Gear.dY:= Gear.dY; + Gear^.dX:= - Gear^.dX * Gear^.Elasticity; +// Gear^.dY:= Gear^.dY; b:= false end; if b then begin - Gear.dY:= Gear.dY + cGravity; - Gear.State:= Gear.State and not gstCollision + Gear^.dY:= Gear^.dY + cGravity; + Gear^.State:= Gear^.State and not gstCollision end else begin - if sqr(Gear.dX) + sqr(Gear.dY) < 0.00001 then - if (Gear.Timer = 0) then Gear.Active:= false + if hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _1div100000 then + if (Gear^.Timer = 0) then Gear^.Active:= false else begin - Gear.dX:= 0; - Gear.dY:= 0 + Gear^.dX:= 0; + Gear^.dY:= 0 end; - Gear.State:= Gear.State or gstCollision + Gear^.State:= Gear^.State or gstCollision end; -Gear.X:= Gear.X + Gear.dX; -Gear.Y:= Gear.Y + Gear.dY; +Gear^.X:= Gear^.X + Gear^.dX; +Gear^.Y:= Gear^.Y + Gear^.dY; CheckGearDrowning(Gear); -if (sqr(Gear.dX) + sqr(Gear.dY) < 0.003) then Gear.State:= Gear.State and not gstMoving - else Gear.State:= Gear.State or gstMoving +if (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _0_003) then Gear^.State:= Gear^.State and not gstMoving + else Gear^.State:= Gear^.State or gstMoving end; //////////////////////////////////////////////////////////////////////////////// procedure doStepCloud(Gear: PGear); begin -Gear.X:= Gear.X + cWindSpeed * 200 + Gear.dX; -if Gear.Y > -160 then Gear.dY:= Gear.dY - 0.00002 - else Gear.dY:= Gear.dY + 0.00002; -Gear.Y:= Gear.Y + Gear.dY; -if Gear.X < -cScreenWidth - 256 then Gear.X:= cScreenWidth + 2048 else -if Gear.X > cScreenWidth + 2048 then Gear.X:= -cScreenWidth - 256 +Gear^.X:= Gear^.X + cWindSpeed * 200 + Gear^.dX; +if Gear^.Y > -160 then Gear^.dY:= Gear^.dY - _1div50000 + else Gear^.dY:= Gear^.dY + _1div50000; +Gear^.Y:= Gear^.Y + Gear^.dY; +if Gear^.X < -cScreenWidth - 256 then Gear^.X:= cScreenWidth + 2048 else +if Gear^.X > cScreenWidth + 2048 then Gear^.X:= -cScreenWidth - 256 end; //////////////////////////////////////////////////////////////////////////////// @@ -115,63 +116,63 @@ begin AllInactive:= false; doStepFallingGear(Gear); -dec(Gear.Timer); -if Gear.Timer = 0 then +dec(Gear^.Timer); +if Gear^.Timer = 0 then begin - case Gear.Kind of - gtAmmo_Bomb: doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound); + case Gear^.Kind of + gtAmmo_Bomb: doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); gtClusterBomb: begin - doMakeExplosion(round(Gear.X), round(Gear.Y), 30, EXPLAutoSound); + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, EXPLAutoSound); for i:= 0 to 4 do - AddGear(round(Gear.X), round(Gear.Y), gtCluster, 0, (getrandom - 0.5)*0.2, (getrandom - 3) * 0.08); + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtCluster, 0, (getrandom - _0_5) * _0_2, (getrandom - 3) * _0_08, 0); end end; DeleteGear(Gear); exit end; CalcRotationDirAngle(Gear); -if (Gear.State and (gstCollision or gstMoving)) = (gstCollision or gstMoving) then PlaySound(sndGrenadeImpact) +if (Gear^.State and (gstCollision or gstMoving)) = (gstCollision or gstMoving) then PlaySound(sndGrenadeImpact, false) end; procedure doStepCluster(Gear: PGear); begin AllInactive:= false; doStepFallingGear(Gear); -if (Gear.State and gstCollision) <> 0 then +if (Gear^.State and gstCollision) <> 0 then begin - doMakeExplosion(round(Gear.X), round(Gear.Y), 20, EXPLAutoSound); + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 20, EXPLAutoSound); DeleteGear(Gear); exit end; if (GameTicks and $1F) = 0 then - AddGear(round(Gear.X), round(Gear.Y), gtSmokeTrace, 0) + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, 0, 0, 0) end; //////////////////////////////////////////////////////////////////////////////// procedure doStepGrenade(Gear: PGear); begin AllInactive:= false; -Gear.dX:= Gear.dX + cWindSpeed; +Gear^.dX:= Gear^.dX + cWindSpeed; doStepFallingGear(Gear); -if (Gear.State and gstCollision) <> 0 then +if (Gear^.State and gstCollision) <> 0 then begin - doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound); + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); DeleteGear(Gear); exit end; if (GameTicks and $3F) = 0 then - AddGear(round(Gear.X), round(Gear.Y), gtSmokeTrace, 0) + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, 0, 0, 0) end; //////////////////////////////////////////////////////////////////////////////// procedure doStepHealthTagWork(Gear: PGear); begin AllInactive:= false; -dec(Gear.Timer); -Gear.Y:= Gear.Y - 0.07; -if Gear.Timer = 0 then +dec(Gear^.Timer); +Gear^.Y:= Gear^.Y - _0_08; +if Gear^.Timer = 0 then begin - PHedgehog(Gear.Hedgehog).Gear.Active:= true; // to let current hh die + PHedgehog(Gear^.Hedgehog)^.Gear^.Active:= true; // to let current hh die DeleteGear(Gear) end end; @@ -179,8 +180,8 @@ procedure doStepHealthTagWorkUnderWater(Gear: PGear); begin AllInactive:= false; -Gear.Y:= Gear.Y - 0.07; -if Gear.Y <= cWaterLine + 10 then +Gear^.Y:= Gear^.Y - _0_08; +if Gear^.Y < cWaterLine + 10 then DeleteGear(Gear) end; @@ -188,52 +189,52 @@ var s: shortstring; begin AllInactive:= false; -str(Gear.State, s); -Gear.Surf:= RenderString(s, PHedgehog(Gear.Hedgehog).Team.Color, fnt16); -if Gear.Y < cWaterLine then Gear.doStep:= doStepHealthTagWork - else Gear.doStep:= doStepHealthTagWorkUnderWater +str(Gear^.State, s); +Gear^.Surf:= RenderString(s, PHedgehog(Gear^.Hedgehog)^.Team^.Color, fnt16); +if Gear^.Y < cWaterLine then Gear^.doStep:= @doStepHealthTagWork + else Gear^.doStep:= @doStepHealthTagWorkUnderWater end; //////////////////////////////////////////////////////////////////////////////// procedure doStepGrave(Gear: PGear); begin AllInactive:= false; -if Gear.dY < 0 then - if TestCollisionY(Gear, -1) then Gear.dY:= 0; +if Gear^.dY < 0 then + if TestCollisionY(Gear, -1) then Gear^.dY:= 0; -if Gear.dY >=0 then +if not Gear^.dY.isNegative then if TestCollisionY(Gear, 1) then begin - Gear.dY:= - Gear.dY * Gear.Elasticity; - if Gear.dY > - 0.001 then + Gear^.dY:= - Gear^.dY * Gear^.Elasticity; + if Gear^.dY > - _1div1024 then begin - Gear.Active:= false; + Gear^.Active:= false; exit - end else if Gear.dY < - 0.03 then PlaySound(sndGraveImpact) + end else if Gear^.dY < - _0_03 then PlaySound(sndGraveImpact, false) end; -Gear.Y:= Gear.Y + Gear.dY; +Gear^.Y:= Gear^.Y + Gear^.dY; CheckGearDrowning(Gear); -Gear.dY:= Gear.dY + cGravity +Gear^.dY:= Gear^.dY + cGravity end; //////////////////////////////////////////////////////////////////////////////// procedure doStepUFOWork(Gear: PGear); -var t: Double; +var t: hwFloat; begin AllInactive:= false; -t:= sqrt(sqr(Gear.dX) + sqr(Gear.dY)); -Gear.dX:= Gear.Elasticity * (Gear.dX + 0.000004 * (TargetPoint.X - trunc(Gear.X))); -Gear.dY:= Gear.Elasticity * (Gear.dY + 0.000004 * (TargetPoint.Y - trunc(Gear.Y))); -t:= t / (sqrt(sqr(Gear.dX) + sqr(Gear.dY))); -Gear.dX:= Gear.dX * t; -Gear.dY:= Gear.dY * t; -Gear.X:= Gear.X + Gear.dX; -Gear.Y:= Gear.Y + Gear.dY; +t:= Distance(Gear^.dX, Gear^.dY); +Gear^.dX:= Gear^.Elasticity * (Gear^.dX + _0_000004 * (TargetPoint.X - hwRound(Gear^.X))); +Gear^.dY:= Gear^.Elasticity * (Gear^.dY + _0_000004 * (TargetPoint.Y - hwRound(Gear^.Y))); +t:= t / Distance(Gear^.dX, Gear^.dY); +Gear^.dX:= Gear^.dX * t; +Gear^.dY:= Gear^.dY * t; +Gear^.X:= Gear^.X + Gear^.dX; +Gear^.Y:= Gear^.Y + Gear^.dY; CheckCollision(Gear); -dec(Gear.Timer); -if ((Gear.State and gstCollision) <> 0) or (Gear.Timer = 0) then +dec(Gear^.Timer); +if ((Gear^.State and gstCollision) <> 0) or (Gear^.Timer = 0) then begin - doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound); + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); DeleteGear(Gear); end; end; @@ -241,21 +242,21 @@ procedure doStepUFO(Gear: PGear); begin AllInactive:= false; -Gear.X:= Gear.X + Gear.dX; -Gear.Y:= Gear.Y + Gear.dY; -Gear.dY:= Gear.dY + cGravity; +Gear^.X:= Gear^.X + Gear^.dX; +Gear^.Y:= Gear^.Y + Gear^.dY; +Gear^.dY:= Gear^.dY + cGravity; CheckCollision(Gear); -if (Gear.State and gstCollision) <> 0 then +if (Gear^.State and gstCollision) <> 0 then begin - doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound); + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); DeleteGear(Gear); exit end; -dec(Gear.Timer); -if Gear.Timer = 0 then +dec(Gear^.Timer); +if Gear^.Timer = 0 then begin - Gear.Timer:= 5000; - Gear.doStep:= doStepUFOWork + Gear^.Timer:= 5000; + Gear^.doStep:= @doStepUFOWork end; end; @@ -264,28 +265,28 @@ var i: LongWord; begin AllInactive:= false; -if Gear.Timer > 0 then +if Gear^.Timer > 0 then begin - dec(Gear.Timer); - if Gear.Timer = 0 then PlaySound(sndShotgunFire); + dec(Gear^.Timer); + if Gear^.Timer = 0 then PlaySound(sndShotgunFire, false); exit end; i:= 200; repeat -Gear.X:= Gear.X + Gear.dX; -Gear.Y:= Gear.Y + Gear.dY; +Gear^.X:= Gear^.X + Gear^.dX; +Gear^.Y:= Gear^.Y + Gear^.dY; CheckCollision(Gear); -if (Gear.State and gstCollision) <> 0 then +if (Gear^.State and gstCollision) <> 0 then begin AmmoShove(Gear, 25, 25); - doMakeExplosion(round(Gear.X), round(Gear.Y), 25, EXPLNoDamage or EXPLDoNotTouchHH); + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, EXPLNoDamage or EXPLDoNotTouchHH); DeleteGear(Gear); AfterAttack; exit end; dec(i) until i = 0; -if (Gear.X < 0) or (Gear.Y < 0) or (Gear.X > 2048) or (Gear.Y > 1024) then +if (Gear^.X < 0) or (Gear^.Y < 0) or (Gear^.X > 2048) or (Gear^.Y > 1024) then begin DeleteGear(Gear); AfterAttack @@ -295,53 +296,53 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepDEagleShot(Gear: PGear); var i, x, y: LongWord; - oX, oY: Double; + oX, oY: hwFloat; begin AllInactive:= false; i:= 80; -oX:= Gear.X; -oY:= Gear.Y; +oX:= Gear^.X; +oY:= Gear^.Y; repeat - Gear.X:= Gear.X + Gear.dX; - Gear.Y:= Gear.Y + Gear.dY; - x:= round(Gear.X); - y:= round(Gear.Y); + Gear^.X:= Gear^.X + Gear^.dX; + Gear^.Y:= Gear^.Y + Gear^.dY; + x:= hwRound(Gear^.X); + y:= hwRound(Gear^.Y); if ((y and $FFFFFC00) = 0) and ((x and $FFFFF800) = 0) - and (Land[y, x] <> 0) then inc(Gear.Damage); + and (Land[y, x] <> 0) then inc(Gear^.Damage); AmmoShove(Gear, 7, 20); dec(i) -until (i = 0) or (Gear.Damage > Gear.Health); -if Gear.Damage > 0 then +until (i = 0) or (Gear^.Damage > Gear^.Health); +if Gear^.Damage > 0 then begin - DrawTunnel(oX, oY, Gear.dX, Gear.dY, 82 - i, 1); - dec(Gear.Health, Gear.Damage); - Gear.Damage:= 0 + DrawTunnel(oX, oY, Gear^.dX, Gear^.dY, 82 - i, 1); + dec(Gear^.Health, Gear^.Damage); + Gear^.Damage:= 0 end; -if (Gear.Health <= 0) or (Gear.X < 0) or (Gear.Y < 0) or (Gear.X > 2048) or (Gear.Y > 1024) then +if (Gear^.Health <= 0) or (Gear^.X < 0) or (Gear^.Y < 0) or (Gear^.X > 2048) or (Gear^.Y > 1024) then DeleteGear(Gear) end; //////////////////////////////////////////////////////////////////////////////// procedure doStepActionTimer(Gear: PGear); begin -dec(Gear.Timer); -case Gear.Kind of +dec(Gear^.Timer); +case Gear^.Kind of gtATStartGame: begin AllInactive:= false; - if Gear.Timer = 0 then + if Gear^.Timer = 0 then AddCaption(trmsg[sidStartFight], $FFFFFF, capgrpGameState); end; gtATSmoothWindCh: begin - if Gear.Timer = 0 then + if Gear^.Timer = 0 then begin - if WindBarWidth < Gear.Tag then inc(WindBarWidth) - else if WindBarWidth > Gear.Tag then dec(WindBarWidth); - if WindBarWidth <> Gear.Tag then Gear.Timer:= 10; + if WindBarWidth < Gear^.Tag then inc(WindBarWidth) + else if WindBarWidth > Gear^.Tag then dec(WindBarWidth); + if WindBarWidth <> Gear^.Tag then Gear^.Timer:= 10; end end; gtATFinishGame: begin AllInactive:= false; - if Gear.Timer = 0 then + if Gear^.Timer = 0 then begin SendIPC('N'); SendIPC('q'); @@ -349,7 +350,7 @@ end end; end; -if Gear.Timer = 0 then DeleteGear(Gear) +if Gear^.Timer = 0 then DeleteGear(Gear) end; //////////////////////////////////////////////////////////////////////////////// @@ -358,50 +359,50 @@ HHGear: PGear; begin AllInactive:= false; -HHGear:= PHedgehog(Gear.Hedgehog).Gear; -dec(Gear.Timer); -if (Gear.Timer = 0)or((Gear.Message and gm_Destroy) <> 0)or((HHGear.State and gstHHDriven) = 0) then +HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; +dec(Gear^.Timer); +if (Gear^.Timer = 0)or((Gear^.Message and gm_Destroy) <> 0)or((HHGear^.State and gstHHDriven) = 0) then begin StopSound(sndPickhammer); DeleteGear(Gear); AfterAttack; exit end; -if (Gear.Timer and $3F) = 0 then +if (Gear^.Timer and $3F) = 0 then begin - i:= round(Gear.X) - Gear.Radius - GetRandom(2); - ei:= round(Gear.X) + Gear.Radius + GetRandom(2); + i:= hwRound(Gear^.X) - Gear^.Radius - GetRandom(2); + ei:= hwRound(Gear^.X) + Gear^.Radius + GetRandom(2); while i <= ei do begin - doMakeExplosion(i, round(Gear.Y) + 3, 3, 0); + doMakeExplosion(i, hwRound(Gear^.Y) + 3, 3, 0); inc(i, 1) end; - Gear.X:= Gear.X + Gear.dX; - Gear.Y:= Gear.Y + 1.9; + Gear^.X:= Gear^.X + Gear^.dX; + Gear^.Y:= Gear^.Y + _1_9; SetAllHHToActive; end; if TestCollisionYwithGear(Gear, 1) then begin - Gear.dY:= 0; - SetLittle(HHGear.dX); - HHGear.dY:= 0; + Gear^.dY:= 0; + SetLittle(HHGear^.dX); + HHGear^.dY:= 0; end else begin - Gear.dY:= Gear.dY + cGravity; - Gear.Y:= Gear.Y + Gear.dY; - if Gear.Y > 1024 then Gear.Timer:= 1 + Gear^.dY:= Gear^.dY + cGravity; + Gear^.Y:= Gear^.Y + Gear^.dY; + if Gear^.Y > 1024 then Gear^.Timer:= 1 end; -Gear.X:= Gear.X + HHGear.dX; -HHGear.X:= Gear.X; -HHGear.Y:= Gear.Y - cHHRadius; +Gear^.X:= Gear^.X + HHGear^.dX; +HHGear^.X:= Gear^.X; +HHGear^.Y:= Gear^.Y - cHHRadius; -if (Gear.Message and gm_Attack) <> 0 then - if (Gear.State and gsttmpFlag) <> 0 then Gear.Timer:= 1 else else - if (Gear.State and gsttmpFlag) = 0 then Gear.State:= Gear.State or gsttmpFlag; -if ((Gear.Message and gm_Left) <> 0) then Gear.dX:= -0.3 else - if ((Gear.Message and gm_Right) <> 0) then Gear.dX:= 0.3 - else Gear.dX:= 0; +if (Gear^.Message and gm_Attack) <> 0 then + if (Gear^.State and gsttmpFlag) <> 0 then Gear^.Timer:= 1 else else + if (Gear^.State and gsttmpFlag) = 0 then Gear^.State:= Gear^.State or gsttmpFlag; +if ((Gear^.Message and gm_Left) <> 0) then Gear^.dX:= - _0_3 else + if ((Gear^.Message and gm_Right) <> 0) then Gear^.dX:= _0_3 + else Gear^.dX:= 0; end; procedure doStepPickHammer(Gear: PGear); @@ -409,19 +410,19 @@ ar: TRangeArray; begin i:= 0; -y:= round(Gear.Y) - cHHRadius*2; -while y < round(Gear.Y) do +y:= hwRound(Gear^.Y) - cHHRadius*2; +while y < hwRound(Gear^.Y) do begin - ar[i].Left := round(Gear.X) - Gear.Radius - GetRandom(2); - ar[i].Right:= round(Gear.X) + Gear.Radius + GetRandom(2); + ar[i].Left := hwRound(Gear^.X) - Gear^.Radius - GetRandom(2); + ar[i].Right:= hwRound(Gear^.X) + Gear^.Radius + GetRandom(2); inc(y, 2); inc(i) end; -DrawHLinesExplosions(@ar, 3, round(Gear.Y) - cHHRadius*2, 2, Pred(i)); -Gear.dY:= PHedgehog(Gear.Hedgehog).Gear.dY; +DrawHLinesExplosions(@ar, 3, hwRound(Gear^.Y) - cHHRadius*2, 2, Pred(i)); +Gear^.dY:= PHedgehog(Gear^.Hedgehog)^.Gear^.dY; PlaySound(sndPickhammer, true); doStepPickHammerWork(Gear); -Gear.doStep:= doStepPickHammerWork +Gear^.doStep:= @doStepPickHammerWork end; //////////////////////////////////////////////////////////////////////////////// @@ -432,50 +433,50 @@ b: boolean; begin AllInactive:= false; -dec(Gear.Timer); -HHGear:= PHedgehog(Gear.Hedgehog).Gear; +dec(Gear^.Timer); +HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; HedgehogChAngle(HHGear); b:= false; -if (HHGear.Angle <> BTPrevAngle) then +if (HHGear^.Angle <> BTPrevAngle) then begin - Gear.dX:= hwSign(HHGear.dX) * Sin(HHGear.Angle * pi / cMaxAngle) * 0.5; - Gear.dY:= Cos(HHGear.Angle * pi / cMaxAngle) * (-0.5); - BTPrevAngle:= HHGear.Angle; + Gear^.dX:= hwSign(HHGear^.dX) * _0_5;//hwSign(HHGear^.dX) * Sin(HHGear^.Angle * pi / cMaxAngle) * _0_5; + Gear^.dY:= 0;//Cos(HHGear^.Angle * pi / cMaxAngle) * (-0.5); + BTPrevAngle:= HHGear^.Angle; b:= true end; -if Gear.Timer mod cHHStepTicks = 0 then +if Gear^.Timer mod cHHStepTicks = 0 then begin b:= true; - if Gear.dX < 0 then HHGear.Message:= (HHGear.Message or gm_Left) and not gm_Right - else HHGear.Message:= (HHGear.Message or gm_Right) and not gm_Left; + if Gear^.dX < 0 then HHGear^.Message:= (HHGear^.Message or gm_Left) and not gm_Right + else HHGear^.Message:= (HHGear^.Message or gm_Right) and not gm_Left; HedgehogStep(HHGear); inc(BTSteps); if BTSteps = 11 then begin BTSteps:= 0; - Gear.X:= HHGear.X + Gear.dX * cHHRadius * 2; - Gear.Y:= HHGear.Y + Gear.dY * cHHRadius * 2; - HHGear.State:= HHGear.State or gstNoDamage; + Gear^.X:= HHGear^.X + Gear^.dX * cHHRadius * 2; + Gear^.Y:= HHGear^.Y + Gear^.dY * cHHRadius * 2; + HHGear^.State:= HHGear^.State or gstNoDamage; AmmoShove(Gear, 3, 14); - HHGear.State:= HHGear.State and not gstNoDamage + HHGear^.State:= HHGear^.State and not gstNoDamage end; - if (HHGear.State and gstFalling) <> 0 then Gear.Timer:= 0 + if (HHGear^.State and gstFalling) <> 0 then Gear^.Timer:= 0 end; if b then - DrawTunnel(HHGear.X - Gear.dX * cHHRadius, HHGear.Y - 4 - Gear.dY * cHHRadius + abs(Gear.dY) * 7, - Gear.dX, Gear.dY, + DrawTunnel(HHGear^.X - Gear^.dX * cHHRadius, HHGear^.Y - 4 - Gear^.dY * cHHRadius + hwAbs(Gear^.dY) * 7, + Gear^.dX, Gear^.dY, cHHRadius * 5, cHHRadius * 2 + 6); -if (Gear.Timer = 0) or ((HHGear.Message and gm_Attack) <> 0) then +if (Gear^.Timer = 0) or ((HHGear^.Message and gm_Attack) <> 0) then begin - HHGear.Message:= 0; + HHGear^.Message:= 0; DeleteGear(Gear); AfterAttack end @@ -486,10 +487,10 @@ begin BTPrevAngle:= High(Longword); BTSteps:= 0; -HHGear:= PHedgehog(Gear.Hedgehog).Gear; -HHGear.State:= HHGear.State and not gstAttacking; -HHGear.Message:= 0; -Gear.doStep:= doStepBlowTorchWork +HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; +HHGear^.State:= HHGear^.State and not gstAttacking; +HHGear^.Message:= 0; +Gear^.doStep:= @doStepBlowTorchWork end; //////////////////////////////////////////////////////////////////////////////// @@ -497,7 +498,7 @@ procedure doStepRopeWork(Gear: PGear); const flCheck: boolean = false; var HHGear: PGear; - len, cs, cc, tx, ty: Double; + len, cs, cc, tx, ty: hwFloat; lx, ly: LongInt; procedure DeleteMe; @@ -508,58 +509,58 @@ State:= State or gstFalling; end; DeleteGear(Gear); - OnUsedAmmo(PHedgehog(HHGear.Hedgehog)^.Ammo); - ApplyAmmoChanges(PHedgehog(HHGear.Hedgehog)^) + OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^.Ammo); + ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^) end; begin -HHGear:= PHedgehog(Gear.Hedgehog).Gear; +HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; -if ((HHGear.State and gstHHDriven) = 0) +if ((HHGear^.State and gstHHDriven) = 0) or (CheckGearDrowning(HHGear)) then begin DeleteMe; exit end; -Gear.dX:= HHGear.X - Gear.X; -Gear.dY:= HHGear.Y - Gear.Y; +Gear^.dX:= HHGear^.X - Gear^.X; +Gear^.dY:= HHGear^.Y - Gear^.Y; -if (Gear.Message and gm_Left <> 0) then HHGear.dX:= HHGear.dX - 0.0002 else -if (Gear.Message and gm_Right <> 0) then HHGear.dX:= HHGear.dX + 0.0002; +if (Gear^.Message and gm_Left <> 0) then HHGear^.dX:= HHGear^.dX - _0_0002 else +if (Gear^.Message and gm_Right <> 0) then HHGear^.dX:= HHGear^.dX + _0_0002; -if not TestCollisionYwithGear(HHGear, 1) then HHGear.dY:= HHGear.dY + cGravity; +if not TestCollisionYwithGear(HHGear, 1) then HHGear^.dY:= HHGear^.dY + cGravity; -cs:= Gear.dY + HHGear.dY; -cc:= Gear.dX + HHGear.dX; -len:= 1 / sqrt(sqr(cc)+sqr(cs)); +cs:= Gear^.dY + HHGear^.dY; +cc:= Gear^.dX + HHGear^.dX; +len:= 1 / Distance(cc, cs); cc:= cc * len; cs:= cs * len; flCheck:= not flCheck; if flCheck then // check whether rope needs dividing begin - len:= Gear.Elasticity - 20; + len:= Gear^.Elasticity - 20; while len > 5 do begin tx:= cc*len; ty:= cs*len; - lx:= round(Gear.X + tx) + hwSign(HHGear.dX); - ly:= round(Gear.Y + ty) + hwSign(HHGear.dY); + lx:= hwRound(Gear^.X + tx) + hwSign(HHGear^.dX); + ly:= hwRound(Gear^.Y + ty) + hwSign(HHGear^.dY); if ((ly and $FFFFFC00) = 0) and ((lx and $FFFFF800) = 0)and (Land[ly, lx] <> 0) then begin with RopePoints.ar[RopePoints.Count] do begin - X:= Gear.X; - Y:= Gear.Y; - if RopePoints.Count = 0 then RopePoints.HookAngle:= DxDy2Angle32(Gear.dY, Gear.dX); - b:= (cc * HHGear.dY) > (cs * HHGear.dX); + X:= Gear^.X; + Y:= Gear^.Y; + if RopePoints.Count = 0 then RopePoints.HookAngle:= 0;//DxDy2Angle32(Gear^.dY, Gear^.dX); + b:= (cc * HHGear^.dY) > (cs * HHGear^.dX); dLen:= len end; - Gear.X:= Gear.X + tx; - Gear.Y:= Gear.Y + ty; + Gear^.X:= Gear^.X + tx; + Gear^.Y:= Gear^.Y + ty; inc(RopePoints.Count); - Gear.Elasticity:= Gear.Elasticity - len; - Gear.Friction:= Gear.Friction - len; + Gear^.Elasticity:= Gear^.Elasticity - len; + Gear^.Friction:= Gear^.Friction - len; break end; len:= len - 3 @@ -569,113 +570,107 @@ begin tx:= RopePoints.ar[Pred(RopePoints.Count)].X; ty:= RopePoints.ar[Pred(RopePoints.Count)].Y; - if GameTicks = 189245 then - begin - AddFileLog('tx = ' + floattostr(tx) + ' ty = ' + floattostr(ty)); - AddFileLog('Gear.X = ' + floattostr(Gear.X) + ' Gear.Y = ' + floattostr(Gear.Y)); - AddFileLog('HHGear.X = ' + floattostr(HHGear.X) + ' HHGear.Y = ' + floattostr(HHGear.Y)); - end; - if RopePoints.ar[Pred(RopePoints.Count)].b xor ((tx - Gear.X) * (ty - HHGear.Y) > (tx - HHGear.X) * (ty - Gear.Y)) then + if RopePoints.ar[Pred(RopePoints.Count)].b xor ((tx - Gear^.X) * (ty - HHGear^.Y) > (tx - HHGear^.X) * (ty - Gear^.Y)) then begin dec(RopePoints.Count); - Gear.X:=RopePoints.ar[RopePoints.Count].X; - Gear.Y:=RopePoints.ar[RopePoints.Count].Y; - Gear.Elasticity:= Gear.Elasticity + RopePoints.ar[RopePoints.Count].dLen; - Gear.Friction:= Gear.Friction + RopePoints.ar[RopePoints.Count].dLen + Gear^.X:=RopePoints.ar[RopePoints.Count].X; + Gear^.Y:=RopePoints.ar[RopePoints.Count].Y; + Gear^.Elasticity:= Gear^.Elasticity + RopePoints.ar[RopePoints.Count].dLen; + Gear^.Friction:= Gear^.Friction + RopePoints.ar[RopePoints.Count].dLen end end; -Gear.dX:= HHGear.X - Gear.X; -Gear.dY:= HHGear.Y - Gear.Y; +Gear^.dX:= HHGear^.X - Gear^.X; +Gear^.dY:= HHGear^.Y - Gear^.Y; -cs:= Gear.dY + HHGear.dY; -cc:= Gear.dX + HHGear.dX; -len:= 1 / sqrt(sqr(cc)+sqr(cs)); +cs:= Gear^.dY + HHGear^.dY; +cc:= Gear^.dX + HHGear^.dX; +len:= 1 / Distance(cc, cs); cc:= cc * len; cs:= cs * len; -HHGear.dX:= HHGear.X; -HHGear.dY:= HHGear.Y; +HHGear^.dX:= HHGear^.X; +HHGear^.dY:= HHGear^.Y; -if ((Gear.Message and gm_Down) <> 0) and (Gear.Elasticity < Gear.Friction) then - if not (TestCollisionXwithGear(HHGear, hwSign(Gear.dX)) - or TestCollisionYwithGear(HHGear, hwSign(Gear.dY))) then Gear.Elasticity:= Gear.Elasticity + 0.3; +if ((Gear^.Message and gm_Down) <> 0) and (Gear^.Elasticity < Gear^.Friction) then + if not (TestCollisionXwithGear(HHGear, hwSign(Gear^.dX)) + or TestCollisionYwithGear(HHGear, hwSign(Gear^.dY))) then Gear^.Elasticity:= Gear^.Elasticity + _0_3; -if ((Gear.Message and gm_Up) <> 0) and (Gear.Elasticity > 30) then - if not (TestCollisionXwithGear(HHGear, -hwSign(Gear.dX)) - or TestCollisionYwithGear(HHGear, -hwSign(Gear.dY))) then Gear.Elasticity:= Gear.Elasticity - 0.3; +if ((Gear^.Message and gm_Up) <> 0) and (Gear^.Elasticity > 30) then + if not (TestCollisionXwithGear(HHGear, -hwSign(Gear^.dX)) + or TestCollisionYwithGear(HHGear, -hwSign(Gear^.dY))) then Gear^.Elasticity:= Gear^.Elasticity - _0_3; -HHGear.X:= Gear.X + cc*Gear.Elasticity; -HHGear.Y:= Gear.Y + cs*Gear.Elasticity; +HHGear^.X:= Gear^.X + cc*Gear^.Elasticity; +HHGear^.Y:= Gear^.Y + cs*Gear^.Elasticity; -HHGear.dX:= HHGear.X - HHGear.dX; -HHGear.dY:= HHGear.Y - HHGear.dY; +HHGear^.dX:= HHGear^.X - HHGear^.dX; +HHGear^.dY:= HHGear^.Y - HHGear^.dY; -if TestCollisionXwithGear(HHGear, hwSign(HHGear.dX)) then - HHGear.dX:= -0.6 * HHGear.dX; -if TestCollisionYwithGear(HHGear, hwSign(HHGear.dY)) then - HHGear.dY:= -0.6 * HHGear.dY; +if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then + HHGear^.dX:= -_0_6 * HHGear^.dX; +if TestCollisionYwithGear(HHGear, hwSign(HHGear^.dY)) then + HHGear^.dY:= -_0_6 * HHGear^.dY; -if (Gear.Message and gm_Attack) <> 0 then - if (Gear.State and gsttmpFlag) <> 0 then DeleteMe else -else if (Gear.State and gsttmpFlag) = 0 then Gear.State:= Gear.State or gsttmpFlag; +if (Gear^.Message and gm_Attack) <> 0 then + if (Gear^.State and gsttmpFlag) <> 0 then DeleteMe else +else if (Gear^.State and gsttmpFlag) = 0 then Gear^.State:= Gear^.State or gsttmpFlag; end; procedure doStepRopeAttach(Gear: PGear); var HHGear: PGear; - tx, ty, tt: Double; + tx, ty, tt: hwFloat; begin -Gear.X:= Gear.X - Gear.dX; -Gear.Y:= Gear.Y - Gear.dY; -Gear.Elasticity:= Gear.Elasticity + 1.0; -HHGear:= PHedgehog(Gear.Hedgehog)^.Gear; -if (HHGear.State and gstFalling) <> 0 then +Gear^.X:= Gear^.X - Gear^.dX; +Gear^.Y:= Gear^.Y - Gear^.dY; +Gear^.Elasticity:= Gear^.Elasticity + 1; +HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; +if (HHGear^.State and gstFalling) <> 0 then if TestCollisionYwithGear(HHGear, 1) then begin - HHGear.dY:= 0; + HHGear^.dY:= 0; CheckHHDamage(HHGear); - HHGear.State:= HHGear.State and not (gstFalling or gstHHJumping); + HHGear^.State:= HHGear^.State and not (gstFalling or gstHHJumping); end else begin - if TestCollisionXwithGear(HHGear, hwSign(HHGear.dX)) then HHGear.dX:= 0.0000001 * hwSign(HHGear.dX); - HHGear.X:= HHGear.X + HHGear.dX; - HHGear.Y:= HHGear.Y + HHGear.dY; - Gear.X:= Gear.X + HHGear.dX; - Gear.Y:= Gear.Y + HHGear.dY; - HHGear.dY:= HHGear.dY + cGravity; - tt:= Gear.Elasticity; + if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then SetLittle(HHGear^.dX); + HHGear^.X:= HHGear^.X + HHGear^.dX; + HHGear^.Y:= HHGear^.Y + HHGear^.dY; + Gear^.X:= Gear^.X + HHGear^.dX; + Gear^.Y:= Gear^.Y + HHGear^.dY; + HHGear^.dY:= HHGear^.dY + cGravity; + tt:= Gear^.Elasticity; tx:= 0; ty:= 0; while tt > 20 do begin - if TestCollisionXwithXYShift(Gear, round(tx), round(ty), hwSign(Gear.dX)) - or TestCollisionYwithXYShift(Gear, round(tx), round(ty), hwSign(Gear.dY)) then + if TestCollisionXwithXYShift(Gear, hwRound(tx), hwRound(ty), hwSign(Gear^.dX)) + or TestCollisionYwithXYShift(Gear, hwRound(tx), hwRound(ty), hwSign(Gear^.dY)) then begin - Gear.X:= Gear.X + tx; - Gear.Y:= Gear.Y + ty; - Gear.Elasticity:= tt; - Gear.doStep:= doStepRopeWork; + Gear^.X:= Gear^.X + tx; + Gear^.Y:= Gear^.Y + ty; + Gear^.Elasticity:= tt; + Gear^.doStep:= @doStepRopeWork; with HHGear^ do State:= State and not gstAttacking; tt:= 0 end; - tx:= tx + Gear.dX - Gear.dX; - ty:= ty + Gear.dY - Gear.dY; - tt:= tt - 2.0; + tx:= tx + Gear^.dX - Gear^.dX; + ty:= ty + Gear^.dY - Gear^.dY; + tt:= tt - 2; end; end; CheckCollision(Gear); -if (Gear.State and gstCollision) <> 0 then +if (Gear^.State and gstCollision) <> 0 then begin - Gear.doStep:= doStepRopeWork; + Gear^.doStep:= @doStepRopeWork; with HHGear^ do State:= State and not gstAttacking; - if Gear.Elasticity < 10 then - Gear.Elasticity:= 10000; + if Gear^.Elasticity < 10 then + Gear^.Elasticity:= 10000; end; -if (Gear.Elasticity >= Gear.Friction) or ((Gear.Message and gm_Attack) = 0) then +if (Gear^.Elasticity > Gear^.Friction) or ((Gear^.Message and gm_Attack) = 0) then begin - with PHedgehog(Gear.Hedgehog).Gear^ do + with PHedgehog(Gear^.Hedgehog)^.Gear^ do begin State:= State and not gstAttacking; Message:= Message and not gm_Attack @@ -686,71 +681,71 @@ procedure doStepRope(Gear: PGear); begin -Gear.dX:= - Gear.dX; -Gear.dY:= - Gear.dY; -Gear.doStep:= doStepRopeAttach +Gear^.dX:= - Gear^.dX; +Gear^.dY:= - Gear^.dY; +Gear^.doStep:= @doStepRopeAttach end; //////////////////////////////////////////////////////////////////////////////// procedure doStepSmokeTrace(Gear: PGear); begin -inc(Gear.Timer); -if Gear.Timer > 64 then +inc(Gear^.Timer); +if Gear^.Timer > 64 then begin - Gear.Timer:= 0; - dec(Gear.State) + Gear^.Timer:= 0; + dec(Gear^.State) end; -Gear.dX:= Gear.dX + cWindSpeed; -Gear.X:= Gear.X + Gear.dX; -if Gear.State = 0 then DeleteGear(Gear) +Gear^.dX:= Gear^.dX + cWindSpeed; +Gear^.X:= Gear^.X + Gear^.dX; +if Gear^.State = 0 then DeleteGear(Gear) end; //////////////////////////////////////////////////////////////////////////////// procedure doStepExplosion(Gear: PGear); begin -inc(Gear.Timer); -if Gear.Timer > 75 then +inc(Gear^.Timer); +if Gear^.Timer > 75 then begin - inc(Gear.State); - Gear.Timer:= 0; - if Gear.State > 5 then DeleteGear(Gear) + inc(Gear^.State); + Gear^.Timer:= 0; + if Gear^.State > 5 then DeleteGear(Gear) end; end; //////////////////////////////////////////////////////////////////////////////// procedure doStepMine(Gear: PGear); begin -if (Gear.dX <> 0) or (Gear.dY <> 0) then +if (Gear^.dX.QWordValue <> 0) or (Gear^.dY.QWordValue <> 0) then begin - if Gear.CollIndex < High(Longword) then DeleteCI(Gear); + if Gear^.CollIndex < High(Longword) then DeleteCI(Gear); doStepFallingGear(Gear); - if Gear.Active = false then + if Gear^.Active = false then begin - if Gear.CollIndex = High(Longword) then AddGearCI(Gear); - Gear.dX:= 0; - Gear.dY:= 0 + if Gear^.CollIndex = High(Longword) then AddGearCI(Gear); + Gear^.dX:= 0; + Gear^.dY:= 0 end; CalcRotationDirAngle(Gear); AllInactive:= false end; - -if ((Gear.State and gsttmpFlag) <> 0) then - if ((Gear.State and gstAttacking) = 0) then + +if ((Gear^.State and gsttmpFlag) <> 0) then + if ((Gear^.State and gstAttacking) = 0) then begin if ((GameTicks and $F) = 0) then - if CheckGearNear(Gear, gtHedgehog, 46, 32) <> nil then Gear.State:= Gear.State or gstAttacking + if CheckGearNear(Gear, gtHedgehog, 46, 32) <> nil then Gear^.State:= Gear^.State or gstAttacking end else // gstAttacking <> 0 begin AllInactive:= false; - if (Gear.Timer and $FF) = 0 then PlaySound(sndMineTick); - if Gear.Timer = 0 then + if (Gear^.Timer and $FF) = 0 then PlaySound(sndMineTick, false); + if Gear^.Timer = 0 then begin - doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound); + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound); DeleteGear(Gear) end; - dec(Gear.Timer); + dec(Gear^.Timer); end else // gsttmpFlag = 0 - if TurnTimeLeft = 0 then Gear.State:= Gear.State or gsttmpFlag; + if TurnTimeLeft = 0 then Gear^.State:= Gear^.State or gsttmpFlag; end; //////////////////////////////////////////////////////////////////////////////// @@ -758,54 +753,54 @@ begin doStepFallingGear(Gear); AllInactive:= false; -if Gear.Timer mod 166 = 0 then inc(Gear.Tag); -if Gear.Timer = 0 then +if Gear^.Timer mod 166 = 0 then inc(Gear^.Tag); +if Gear^.Timer = 0 then begin - doMakeExplosion(round(Gear.X), round(Gear.Y), 75, EXPLAutoSound); + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 75, EXPLAutoSound); DeleteGear(Gear); exit end; -dec(Gear.Timer); +dec(Gear^.Timer); end; -//////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// procedure doStepCase(Gear: PGear); var i, x, y: integer; begin -if (Gear.Message and gm_Destroy) > 0 then +if (Gear^.Message and gm_Destroy) > 0 then begin DeleteGear(Gear); exit end; -if Gear.Damage > 0 then +if Gear^.Damage > 0 then begin - x:= round(Gear.X); - y:= round(Gear.Y); + x:= hwRound(Gear^.X); + y:= hwRound(Gear^.Y); DeleteGear(Gear); doMakeExplosion(x, y, 25, EXPLAutoSound); for i:= 0 to 63 do - AddGear(x, y, gtFlame, 0); + AddGear(x, y, gtFlame, 0, 0, 0, 0); exit end; -if (Gear.dY <> 0) or (not TestCollisionYwithGear(Gear, 1)) then +if (Gear^.dY.QWordValue <> 0) or (not TestCollisionYwithGear(Gear, 1)) then begin AllInactive:= false; - Gear.dY:= Gear.dY + cGravity; - Gear.Y:= Gear.Y + Gear.dY; - if (Gear.dY < 0) and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0 else - if (Gear.dY >= 0) and TestCollisionYwithGear(Gear, 1) then + Gear^.dY:= Gear^.dY + cGravity; + Gear^.Y:= Gear^.Y + Gear^.dY; + if (Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, -1) then Gear^.dY:= 0 else + if (Gear^.dY.QWordValue <> 0) and TestCollisionYwithGear(Gear, 1) then begin - Gear.dY:= - Gear.dY * Gear.Elasticity; - if Gear.dY > - 0.001 then Gear.dY:= 0 - else if Gear.dY < - 0.03 then PlaySound(sndGraveImpact); + Gear^.dY:= - Gear^.dY * Gear^.Elasticity; + if Gear^.dY > - _0_001 then Gear^.dY:= 0 + else if Gear^.dY < - _0_03 then PlaySound(sndGraveImpact, false); end; CheckGearDrowning(Gear); end; -if (Gear.CollIndex = High(Longword)) and (Gear.dY = 0) then AddGearCI(Gear) - else if (Gear.CollIndex < High(Longword)) and (Gear.dY <> 0) then DeleteCI(Gear); +if (Gear^.CollIndex = High(Longword)) and (Gear^.dY.QWordValue = 0) then AddGearCI(Gear) + else if (Gear^.CollIndex < High(Longword)) and (Gear^.dY.QWordValue <> 0) then DeleteCI(Gear); end; //////////////////////////////////////////////////////////////////////////////// @@ -820,14 +815,14 @@ var i: integer; begin AllInactive:= false; -dec(Gear.Timer); -if (Gear.Timer and 15) = 0 then +dec(Gear^.Timer); +if (Gear^.Timer and 15) = 0 then for i:= 0 to Pred(thexchcnt) do with thexchar[i] do {$WARNINGS OFF} - team.DrawHealthY:= ny + (oy - ny) * Gear.Timer div 640; + team^.DrawHealthY:= ny + (oy - ny) * Gear^.Timer div 640; {$WARNINGS ON} -if (Gear.Timer = 0) or (currsorter <> Gear) then +if (Gear^.Timer = 0) or (currsorter <> Gear) then begin if currsorter = Gear then currsorter:= nil; DeleteGear(Gear) @@ -843,15 +838,15 @@ i:= 0; while team <> nil do begin - thexchar[i].oy:= team.DrawHealthY; + thexchar[i].oy:= team^.DrawHealthY; thexchar[i].team:= team; inc(i); - team:= team.Next + team:= team^.Next end; thexchcnt:= i; for i:= 1 to thexchcnt do for t:= 0 to thexchcnt - 2 do - if thexchar[t].team.TeamHealthBarWidth > thexchar[Succ(t)].team.TeamHealthBarWidth then + if thexchar[t].team^.TeamHealthBarWidth > thexchar[Succ(t)].team^.TeamHealthBarWidth then begin thexchar[5]:= thexchar[t]; thexchar[t]:= thexchar[Succ(t)]; @@ -861,11 +856,11 @@ for i:= 0 to Pred(thexchcnt) do with thexchar[i] do begin - dec(t, team.HealthRect.h + 2); + dec(t, team^.HealthRect.h + 2); ny:= t end; -Gear.Timer:= 640; -Gear.doStep:= doStepTeamHealthSorterWork; +Gear^.Timer:= 640; +Gear^.doStep:= @doStepTeamHealthSorterWork; currsorter:= Gear end; @@ -873,10 +868,10 @@ procedure doStepShover(Gear: PGear); var HHGear: PGear; begin -HHGear:= PHedgehog(Gear.Hedgehog)^.Gear; -HHGear.State:= HHGear.State or gstNoDamage; +HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; +HHGear^.State:= HHGear^.State or gstNoDamage; AmmoShove(Gear, 30, 115); -HHGear.State:= HHGear.State and not gstNoDamage; +HHGear^.State:= HHGear^.State and not gstNoDamage; DeleteGear(Gear) end; @@ -886,30 +881,30 @@ AllInactive:= false; if not TestCollisionYwithGear(Gear, 1) then begin - Gear.dX:= Gear.dX + cWindSpeed; - Gear.dY:= Gear.dY + cGravity; - if abs(Gear.dX) > 0.12 then Gear.dX:= Gear.dX * 0.5; - if Gear.dY > 0.12 then Gear.dY:= Gear.dY * 0.995; - Gear.X:= Gear.X + Gear.dX; - Gear.Y:= Gear.Y + Gear.dY; - if Gear.Y > 1023 then + Gear^.dX:= Gear^.dX + cWindSpeed; + Gear^.dY:= Gear^.dY + cGravity; + if hwAbs(Gear^.dX) > _0_1 then Gear^.dX:= Gear^.dX * _0_5; + if Gear^.dY > _0_1 then Gear^.dY:= Gear^.dY * _0_995; + Gear^.X:= Gear^.X + Gear^.dX; + Gear^.Y:= Gear^.Y + Gear^.dY; + if Gear^.Y > 1023 then begin DeleteGear(Gear); exit end end else begin - if Gear.Timer > 0 then dec(Gear.Timer) + if Gear^.Timer > 0 then dec(Gear^.Timer) else begin - doMakeExplosion(round(Gear.X), round(Gear.Y), 2, 0); - dec(Gear.Health); - Gear.Timer:= 1250 - Gear.Angle * 12 + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 2, 0); + dec(Gear^.Health); + Gear^.Timer:= 1250 - Gear^.Angle * 12 end end; -if (((GameTicks div 8) mod 64) = Gear.Angle) then +if (((GameTicks div 8) mod 64) = Gear^.Angle) then AmmoFlameWork(Gear); -if Gear.Health = 0 then +if Gear^.Health = 0 then DeleteGear(Gear) end; @@ -918,49 +913,49 @@ var HHGear: PGear; begin AllInactive:= false; -if ((Gear.Message and gm_Destroy) <> 0) then +if ((Gear^.Message and gm_Destroy) <> 0) then begin DeleteGear(Gear); AfterAttack; exit end; -HHGear:= PHedgehog(Gear.Hedgehog).Gear; -if round(HHGear.Y) <= Gear.Tag - 2 then +HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; +if hwRound(HHGear^.Y) <= Gear^.Tag - 2 then begin - Gear.Tag:= round(HHGear.Y); - DrawTunnel(HHGear.X - cHHRadius, HHGear.Y - 1, 0.5, 0.0, cHHRadius * 4, 2); - HHGear.State:= HHGear.State or gstNoDamage; - Gear.Y:= HHGear.Y; + Gear^.Tag:= hwRound(HHGear^.Y); + DrawTunnel(HHGear^.X - cHHRadius, HHGear^.Y - 1, _0_5, 0, cHHRadius * 4, 2); + HHGear^.State:= HHGear^.State or gstNoDamage; + Gear^.Y:= HHGear^.Y; AmmoShove(Gear, 30, 40); - HHGear.State:= HHGear.State and not gstNoDamage + HHGear^.State:= HHGear^.State and not gstNoDamage end; - -HHGear.dY:= HHGear.dY + cGravity; -if HHGear.dY >= 0 then + +HHGear^.dY:= HHGear^.dY + cGravity; +if not (HHGear^.dY.isNegative) then begin - HHGear.State:= HHGear.State or gstFalling; + HHGear^.State:= HHGear^.State or gstFalling; DeleteGear(Gear); AfterAttack; exit end; -HHGear.Y:= HHGear.Y + HHGear.dY +HHGear^.Y:= HHGear^.Y + HHGear^.dY end; procedure doStepFirePunch(Gear: PGear); var HHGear: PGear; begin AllInactive:= false; -HHGear:= PHedgehog(Gear.Hedgehog).Gear; -HHGear.X:= round(HHGear.X) - 0.5; -HHGear.dX:= 0.0000001 * hwSign(HHGear.dX); -HHGear.dY:= -0.30; +HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; +HHGear^.X:= hwRound(HHGear^.X) - _0_5; +SetLittle(HHGear^.dX); +HHGear^.dY:= - _0_3; -Gear.X:= HHGear.X; -Gear.dX:= hwSign(HHGear.dX)* 0.45; -Gear.dY:= -0.9; -Gear.doStep:= doStepFirePunchWork; -DrawTunnel(HHGear.X - cHHRadius, HHGear.Y + 1, 0.5, 0.0, cHHRadius * 4, 5); +Gear^.X:= HHGear^.X; +Gear^.dX:= hwSign(HHGear^.dX) * _0_45; +Gear^.dY:= - _0_9; +Gear^.doStep:= @doStepFirePunchWork; +DrawTunnel(HHGear^.X - cHHRadius, HHGear^.Y + 1, _0_5, 0, cHHRadius * 4, 5); end; //////////////////////////////////////////////////////////////////////////////// @@ -968,69 +963,69 @@ procedure doStepParachute(Gear: PGear); var HHGear: PGear; begin -HHGear:= PHedgehog(Gear.Hedgehog).Gear; -HHGear.State:= HHGear.State and not gstAttacking; +HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; +HHGear^.State:= HHGear^.State and not gstAttacking; if TestCollisionYwithGear(HHGear, 1) - or ((HHGear.State and gstHHDriven) = 0) + or ((HHGear^.State and gstHHDriven) = 0) or CheckGearDrowning(HHGear) then begin with HHGear^ do begin Message:= 0; - dx:= 0.0000001 * hwSign(dX); + SetLittle(dx); dY:= 0; State:= State and not (gstAttacking or gstAttacked); State:= State or gstFalling; end; DeleteGear(Gear); - OnUsedAmmo(PHedgehog(HHGear.Hedgehog)^.Ammo); - ApplyAmmoChanges(PHedgehog(HHGear.Hedgehog)^); + OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^.Ammo); + ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^); exit end; -if not TestCollisionXwithGear(HHGear, hwSign(HHGear.dX)) then - HHGear.X:= HHGear.X + cWindSpeed * 200; +if not TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then + HHGear^.X:= HHGear^.X + cWindSpeed * 200; -if (Gear.Message and gm_Left) <> 0 then HHGear.X:= HHGear.X - cMaxWindSpeed * 40 -else if (Gear.Message and gm_Right) <> 0 then HHGear.X:= HHGear.X + cMaxWindSpeed * 40; -if (Gear.Message and gm_Up) <> 0 then HHGear.Y:= HHGear.Y - cGravity * 40 -else if (Gear.Message and gm_Down) <> 0 then HHGear.Y:= HHGear.Y + cGravity * 40; +if (Gear^.Message and gm_Left) <> 0 then HHGear^.X:= HHGear^.X - cMaxWindSpeed * 40 +else if (Gear^.Message and gm_Right) <> 0 then HHGear^.X:= HHGear^.X + cMaxWindSpeed * 40; +if (Gear^.Message and gm_Up) <> 0 then HHGear^.Y:= HHGear^.Y - cGravity * 40 +else if (Gear^.Message and gm_Down) <> 0 then HHGear^.Y:= HHGear^.Y + cGravity * 40; -HHGear.Y:= HHGear.Y + cGravity * 100; +HHGear^.Y:= HHGear^.Y + cGravity * 100; end; //////////////////////////////////////////////////////////////////////////////// -const cAirPlaneSpeed = 1.4; - cBombsDistance = 30; - cBombsSpeed = 0.1; +const cAirPlaneSpeed: hwFloat = (isNegative: false; QWordValue: 6012954214); // 1.4 + cBombsDistance: hwFloat = (isNegative: false; QWordValue: 128849018880); // 30 + cBombsSpeed : hwFloat = (isNegative: false; QWordValue: 429496729); procedure doStepAirAttackWork(Gear: PGear); begin AllInactive:= false; -Gear.X:= Gear.X + cAirPlaneSpeed; -if (Gear.Health > 0)and(Gear.X >= Gear.dX)and(Gear.X < Gear.dX + cAirPlaneSpeed) then +Gear^.X:= Gear^.X + cAirPlaneSpeed; +if (Gear^.Health > 0)and( not (Gear^.X < Gear^.dX))and(Gear^.X < Gear^.dX + cAirPlaneSpeed) then begin - dec(Gear.Health); - case Gear.State of - 0: AddGear(round(Gear.X), round(Gear.Y), gtAirBomb, 0, cBombsSpeed, 0.0); - 1: AddGear(round(Gear.X), round(Gear.Y), gtMine, 0, cBombsSpeed, 0.0); + dec(Gear^.Health); + case Gear^.State of + 0: AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtAirBomb, 0, cBombsSpeed, 0, 0); + 1: AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtMine, 0, cBombsSpeed, 0, 0); end; - Gear.dX:= Gear.dX + cBombsDistance + Gear^.dX:= Gear^.dX + cBombsDistance end; -if Gear.X > 3072 then DeleteGear(Gear) +if Gear^.X > 3072 then DeleteGear(Gear) end; procedure doStepAirAttack(Gear: PGear); begin AllInactive:= false; -Gear.X:= -1024; -Gear.Y:= -128; -Gear.dX:= TargetPoint.X - - cBombsDistance * 5 / 2 - - cBombsSpeed * sqrt(2 * (TargetPoint.Y - Gear.Y) / cGravity); -Gear.Health:= 6; -Gear.doStep:= doStepAirAttackWork +Gear^.X:= -1024; +Gear^.Y:= -128; +Gear^.dX:= TargetPoint.X - + cBombsDistance * 5 / 2;{ - + cBombsSpeed * sqrt(2 * (TargetPoint.Y - Gear^.Y) / cGravity);} +Gear^.Health:= 6; +Gear^.doStep:= @doStepAirAttackWork end; //////////////////////////////////////////////////////////////////////////////// @@ -1039,14 +1034,12 @@ begin AllInactive:= false; doStepFallingGear(Gear); -if (Gear.State and gstCollision) <> 0 then +if (Gear^.State and gstCollision) <> 0 then begin - doMakeExplosion(round(Gear.X), round(Gear.Y), 30, EXPLAutoSound); + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, EXPLAutoSound); DeleteGear(Gear); exit end; if (GameTicks and $3F) = 0 then - AddGear(round(Gear.X), round(Gear.Y), gtSmokeTrace, 0) + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtSmokeTrace, 0, 0, 0, 0) end; - - diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/HHHandlers.inc --- a/hedgewars/HHHandlers.inc Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/HHHandlers.inc Sun Jan 21 19:51:02 2007 +0000 @@ -18,68 +18,71 @@ //////////////////////////////////////////////////////////////////////////////// procedure Attack(Gear: PGear); -var xx, yy: Double; +var xx, yy: hwFloat; begin with Gear^, - PHedgehog(Gear.Hedgehog)^ do + PHedgehog(Gear^.Hedgehog)^ do begin if ((State and gstHHDriven) <> 0)and // (((State and gstAttacking) <> 0) or ((Message and gm_Attack) <> 0))and ((State and (gstAttacked or gstMoving or gstHHChooseTarget)) = 0)and - (((State and gstFalling ) = 0)or((Ammo[CurSlot, CurAmmo].Propz and ammoprop_AttackInFall) <> 0))and - (((State and gstHHJumping) = 0)or((Ammo[CurSlot, CurAmmo].Propz and ammoprop_AttackInJump) <> 0))and - ((TargetPoint.X <> NoPointX) or((Ammo[CurSlot, CurAmmo].Propz and ammoprop_NeedTarget) = 0)) then + (((State and gstFalling ) = 0)or((Ammo^[CurSlot, CurAmmo].Propz and ammoprop_AttackInFall) <> 0))and + (((State and gstHHJumping) = 0)or((Ammo^[CurSlot, CurAmmo].Propz and ammoprop_AttackInJump) <> 0))and + ((TargetPoint.X <> NoPointX) or((Ammo^[CurSlot, CurAmmo].Propz and ammoprop_NeedTarget) = 0)) then begin State:= State or gstAttacking; if Power = cMaxPower then Message:= Message and not gm_Attack - else if (Ammo[CurSlot, CurAmmo].Propz and ammoprop_Power) = 0 then Message:= Message and not gm_Attack + else if (Ammo^[CurSlot, CurAmmo].Propz and ammoprop_Power) = 0 then Message:= Message and not gm_Attack else begin if Power = 0 then begin - AttackBar:= CurrentTeam.AttackBar; - PlaySound(sndThrowPowerUp) + AttackBar:= CurrentTeam^.AttackBar; + PlaySound(sndThrowPowerUp, false) end; inc(Power) end; if ((Message and gm_Attack) <> 0) then exit; - - if (Ammo[CurSlot, CurAmmo].Propz and ammoprop_Power) <> 0 then + + if (Ammo^[CurSlot, CurAmmo].Propz and ammoprop_Power) <> 0 then begin StopSound(sndThrowPowerUp); - PlaySound(sndThrowRelease); + PlaySound(sndThrowRelease, false); end; - xx:= hwSign(dX)*Sin(Angle*pi/cMaxAngle); - yy:= -Cos(Angle*pi/cMaxAngle); - case Ammo[CurSlot, CurAmmo].AmmoType of - amGrenade: FollowGear:= AddGear(round(X), round(Y), gtAmmo_Bomb, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, Ammo[CurSlot, CurAmmo].Timer); - amClusterBomb: FollowGear:= AddGear(round(X), round(Y), gtClusterBomb, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, Ammo[CurSlot, CurAmmo].Timer); - amBazooka: FollowGear:= AddGear(round(X), round(Y), gtAmmo_Grenade, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor); - amUFO: FollowGear:= AddGear(round(X), round(Y), gtUFO, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor); +// xx:= hwSign(dX)*Sin(Angle*pi/cMaxAngle); +// yy:= -Cos(Angle*pi/cMaxAngle); + xx:= AngleSin(Angle); + xx.isNegative:= dX.isNegative; + yy:= -AngleCos(Angle); + case Ammo^[CurSlot, CurAmmo].AmmoType of + amGrenade: FollowGear:= AddGear(hwRound(X), hwRound(Y), gtAmmo_Bomb, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, Ammo^[CurSlot, CurAmmo].Timer); + amClusterBomb: FollowGear:= AddGear(hwRound(X), hwRound(Y), gtClusterBomb, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, Ammo^[CurSlot, CurAmmo].Timer); + amBazooka: FollowGear:= AddGear(hwRound(X), hwRound(Y), gtAmmo_Grenade, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, 0); + amUFO: FollowGear:= AddGear(hwRound(X), hwRound(Y), gtUFO, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, 0); amShotgun: begin - PlaySound(sndShotgunReload); - CurAmmoGear:= AddGear(round(X), round(Y), gtShotgunShot, 0, xx * 0.5, yy * 0.5); + PlaySound(sndShotgunReload, false); + CurAmmoGear:= AddGear(hwRound(X), hwRound(Y), gtShotgunShot, 0, xx * _0_5, yy * _0_5, 0); end; - amPickHammer: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y) + cHHRadius, gtPickHammer, 0); + amPickHammer: CurAmmoGear:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y) + cHHRadius, gtPickHammer, 0, 0, 0, 0); amSkip: TurnTimeLeft:= 0; - amRope: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y), gtRope, 0, xx, yy); - amMine: AddGear(round(X) + hwSign(dX) * 7, round(Y), gtMine, 0, hwSign(dX) * 0.02, 0, 3000); - amDEagle: AddGear(round(X), round(Y), gtDEagleShot, 0, xx * 0.5, yy * 0.5); - amDynamite: AddGear(round(X) + hwSign(dX) * 7, round(Y), gtDynamite, 0, hwSign(dX) * 0.035, 0, 5000); - amBaseballBat: AddGear(round(X) + hwSign(dX) * 10, round(Y), gtShover, 0, xx * 0.5, yy * 0.5).Radius:= 20; - amFirePunch: CurAmmoGear:= AddGear(round(X) + hwSign(dX) * 10, round(Y), gtFirePunch, 0); - amParachute: CurAmmoGear:= AddGear(round(X), round(Y), gtParachute, 0); - amAirAttack: AddGear(0, 0, gtAirAttack, 0); - amMineStrike: AddGear(0, 0, gtAirAttack, 1); - amBlowTorch: CurAmmoGear:= AddGear(round(Gear.X), round(Gear.Y), gtBlowTorch, 0, hwSign(Gear.dX) * 0.5); + amRope: CurAmmoGear:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtRope, 0, xx, yy, 0); + amMine: AddGear(hwRound(X) + hwSign(dX) * 7, hwRound(Y), gtMine, 0, hwSign(dX) * _0_02, 0, 3000); + amDEagle: AddGear(hwRound(X), hwRound(Y), gtDEagleShot, 0, xx * _0_5, yy * _0_5, 0); + amDynamite: AddGear(hwRound(X) + hwSign(dX) * 7, hwRound(Y), gtDynamite, 0, hwSign(dX) * _0_03, 0, 5000); + amBaseballBat: AddGear(hwRound(X) + hwSign(dX) * 10, hwRound(Y), gtShover, 0, xx * _0_5, yy * _0_5, 0)^.Radius:= 20; + amFirePunch: CurAmmoGear:= AddGear(hwRound(X) + hwSign(dX) * 10, hwRound(Y), gtFirePunch, 0, 0, 0, 0); + amParachute: CurAmmoGear:= AddGear(hwRound(X), hwRound(Y), gtParachute, 0, 0, 0, 0); + amAirAttack: AddGear(0, 0, gtAirAttack, 0, 0, 0, 0); + amMineStrike: AddGear(0, 0, gtAirAttack, 1, 0, 0, 0); + amBlowTorch: CurAmmoGear:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtBlowTorch, 0, hwSign(Gear^.dX) * _0_5, 0, 0); end; Power:= 0; if CurAmmoGear <> nil then begin Message:= Message or gm_Attack; - CurAmmoGear.Message:= Message + CurAmmoGear^.Message:= Message end else begin - if not CurrentTeam.ExtDriven and - ((Ammo[CurSlot, CurAmmo].Propz and ammoprop_Power) <> 0) then SendIPC('a'); + if not CurrentTeam^.ExtDriven and + ((Ammo^[CurSlot, CurAmmo].Propz and ammoprop_Power) <> 0) then SendIPC('a'); AfterAttack end end else Message:= Message and not gm_Attack @@ -88,14 +91,14 @@ procedure AfterAttack; begin -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear^, - CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^, + CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do begin Inc(AttacksNum); State:= State and not gstAttacking; - if Ammo[CurSlot, CurAmmo].NumPerTurn >= AttacksNum then isInMultiShoot:= true + if Ammo^[CurSlot, CurAmmo].NumPerTurn >= AttacksNum then isInMultiShoot:= true else begin - TurnTimeLeft:= Ammoz[Ammo[CurSlot, CurAmmo].AmmoType].TimeAfterTurn; + TurnTimeLeft:= Ammoz[Ammo^[CurSlot, CurAmmo].AmmoType].TimeAfterTurn; State:= State or gstAttacked; OnUsedAmmo(Ammo) end; @@ -108,21 +111,21 @@ var s: shortstring; a: TAmmoType; begin -Gear.Message:= gm_Destroy; -case Gear.Pos of +Gear^.Message:= gm_Destroy; +case Gear^.Pos of posCaseAmmo: begin - a:= TAmmoType(Gear.State); - AddAmmo(PHedgehog(HH.Hedgehog), a); + a:= TAmmoType(Gear^.State); + AddAmmo(PHedgehog(HH^.Hedgehog), a); s:= trammo[Ammoz[a].NameId]; - AddCaption(s, PHedgehog(HH.Hedgehog).Team.Color, capgrpAmmoinfo); + AddCaption(s, PHedgehog(HH^.Hedgehog)^.Team^.Color, capgrpAmmoinfo); end; posCaseHealth: begin - inc(HH.Health, Gear.Health); - str(Gear.Health, s); + inc(HH^.Health, Gear^.Health); + str(Gear^.Health, s); s:= '+' + s; - AddCaption(s, PHedgehog(HH.Hedgehog).Team.Color, capgrpAmmoinfo); - RenderHealth(PHedgehog(HH.Hedgehog)^); - RecountTeamHealth(PHedgehog(HH.Hedgehog)^.Team) + AddCaption(s, PHedgehog(HH^.Hedgehog)^.Team^.Color, capgrpAmmoinfo); + RenderHealth(PHedgehog(HH^.Hedgehog)^); + RecountTeamHealth(PHedgehog(HH^.Hedgehog)^.Team) end; end; end; @@ -132,83 +135,82 @@ procedure HedgehogStep(Gear: PGear); var PrevdX: integer; begin -if ((Gear.State and (gstAttacking or gstMoving or gstFalling)) = 0) then +if ((Gear^.State and (gstAttacking or gstMoving or gstFalling)) = 0) then begin - if ((Gear.Message and gm_LJump ) <> 0) then + if ((Gear^.Message and gm_LJump ) <> 0) then begin - Gear.Message:= 0; + Gear^.Message:= 0; if not TestCollisionYwithGear(Gear, -1) then - if not TestCollisionXwithXYShift(Gear, 0, -2, hwSign(Gear.dX)) then Gear.Y:= Gear.Y - 2 else - if not TestCollisionXwithXYShift(Gear, 0, -1, hwSign(Gear.dX)) then Gear.Y:= Gear.Y - 1; - if not (TestCollisionXwithGear(Gear, hwSign(Gear.dX)) + if not TestCollisionXwithXYShift(Gear, 0, -2, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - 2 else + if not TestCollisionXwithXYShift(Gear, 0, -1, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - 1; + if not (TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) or TestCollisionYwithGear(Gear, -1)) then begin - Gear.dY:= -0.15; - Gear.dX:= hwSign(Gear.dX) * 0.15; - Gear.State:= Gear.State or gstFalling or gstHHJumping; + Gear^.dY:= -_0_15; + Gear^.dX:= hwSign(Gear^.dX) * _0_15; + Gear^.State:= Gear^.State or gstFalling or gstHHJumping; exit end; end; - if ((Gear.Message and gm_HJump ) <> 0) then + if ((Gear^.Message and gm_HJump ) <> 0) then begin - Gear.Message:= 0; + Gear^.Message:= 0; if not TestCollisionYwithGear(Gear, -1) then begin - Gear.dY:= -0.20; - Gear.dX:= 0.0000001 * hwSign(Gear.dX); - Gear.X:= Gear.X - hwSign(Gear.dX)*0.00008; // shift compensation - Gear.State:= Gear.State or gstFalling or gstHHJumping; + Gear^.dY:= -_0_2; + SetLittle(Gear^.dX); + Gear^.State:= Gear^.State or gstFalling or gstHHJumping; exit end; end; - PrevdX:= hwSign(Gear.dX); - if (Gear.Message and gm_Left )<>0 then Gear.dX:= -cLittle else - if (Gear.Message and gm_Right )<>0 then Gear.dX:= cLittle else exit; + PrevdX:= hwSign(Gear^.dX); + if (Gear^.Message and gm_Left )<>0 then Gear^.dX:= -cLittle else + if (Gear^.Message and gm_Right )<>0 then Gear^.dX:= cLittle else exit; StepTicks:= cHHStepTicks; - if PrevdX <> hwSign(Gear.dX) then exit; - PHedgehog(Gear.Hedgehog).visStepPos:= (PHedgehog(Gear.Hedgehog).visStepPos + 1) and 7; - if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then + if PrevdX <> hwSign(Gear^.dX) then exit; + PHedgehog(Gear^.Hedgehog)^.visStepPos:= (PHedgehog(Gear^.Hedgehog)^.visStepPos + 1) and 7; + if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then begin - if not (TestCollisionXwithXYShift(Gear, 0, -6, hwSign(Gear.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; - if not (TestCollisionXwithXYShift(Gear, 0, -5, hwSign(Gear.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; - if not (TestCollisionXwithXYShift(Gear, 0, -4, hwSign(Gear.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; - if not (TestCollisionXwithXYShift(Gear, 0, -3, hwSign(Gear.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; - if not (TestCollisionXwithXYShift(Gear, 0, -2, hwSign(Gear.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; - if not (TestCollisionXwithXYShift(Gear, 0, -1, hwSign(Gear.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; + if not (TestCollisionXwithXYShift(Gear, 0, -6, hwSign(Gear^.dX)) + or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - 1; + if not (TestCollisionXwithXYShift(Gear, 0, -5, hwSign(Gear^.dX)) + or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - 1; + if not (TestCollisionXwithXYShift(Gear, 0, -4, hwSign(Gear^.dX)) + or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - 1; + if not (TestCollisionXwithXYShift(Gear, 0, -3, hwSign(Gear^.dX)) + or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - 1; + if not (TestCollisionXwithXYShift(Gear, 0, -2, hwSign(Gear^.dX)) + or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - 1; + if not (TestCollisionXwithXYShift(Gear, 0, -1, hwSign(Gear^.dX)) + or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - 1; end; - if not TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then Gear.X:= Gear.X + hwSign(Gear.dX); + if not TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then Gear^.X:= Gear^.X + hwSign(Gear^.dX); SetAllHHToActive; if not TestCollisionYwithGear(Gear, 1) then begin - Gear.Y:= Gear.Y + 1; + Gear^.Y:= Gear^.Y + 1; if not TestCollisionYwithGear(Gear, 1) then begin - Gear.Y:= Gear.Y + 1; + Gear^.Y:= Gear^.Y + 1; if not TestCollisionYwithGear(Gear, 1) then begin - Gear.Y:= Gear.Y + 1; + Gear^.Y:= Gear^.Y + 1; if not TestCollisionYwithGear(Gear, 1) then begin - Gear.Y:= Gear.Y + 1; + Gear^.Y:= Gear^.Y + 1; if not TestCollisionYwithGear(Gear, 1) then begin - Gear.Y:= Gear.Y + 1; + Gear^.Y:= Gear^.Y + 1; if not TestCollisionYwithGear(Gear, 1) then begin - Gear.Y:= Gear.Y + 1; + Gear^.Y:= Gear^.Y + 1; if not TestCollisionYwithGear(Gear, 1) then begin - Gear.Y:= Gear.Y - 6; - Gear.dY:= 0; - Gear.State:= Gear.State or gstFalling + Gear^.Y:= Gear^.Y - 6; + Gear^.dY:= 0; + Gear^.State:= Gear^.State or gstFalling end; end end @@ -221,10 +223,10 @@ procedure HedgehogChAngle(Gear: PGear); begin -if ((Gear.State and (gstMoving or gstFalling)) = 0) then - if (Gear.Message and gm_Up )<>0 then if Gear.Angle > CurMinAngle then dec(Gear.Angle) +if ((Gear^.State and (gstMoving or gstFalling)) = 0) then + if (Gear^.Message and gm_Up )<>0 then if Gear^.Angle > CurMinAngle then dec(Gear^.Angle) else else - if (Gear.Message and gm_Down )<>0 then if Gear.Angle < CurMaxAngle then inc(Gear.Angle); + if (Gear^.Message and gm_Down )<>0 then if Gear^.Angle < CurMaxAngle then inc(Gear^.Angle); end; procedure doStepHedgehog(Gear: PGear); forward; @@ -232,21 +234,21 @@ procedure doStepHedgehogDriven(Gear: PGear); var t: PGear; begin -if isInMultiShoot and (Gear.Damage = 0) then +if isInMultiShoot and (Gear^.Damage = 0) then begin exit end; AllInactive:= false; DeleteCI(Gear); -if (TurnTimeLeft = 0) or (Gear.Damage > 0) then +if (TurnTimeLeft = 0) or (Gear^.Damage > 0) then begin TurnTimeLeft:= 0; - Gear.State:= Gear.State and not gstHHDriven; - if Gear.Damage > 0 then - Gear.State:= Gear.State and not gstHHJumping; + Gear^.State:= Gear^.State and not gstHHDriven; + if Gear^.Damage > 0 then + Gear^.State:= Gear^.State and not gstHHJumping; exit end; -if ((Gear.State and gstFalling) <> 0) or (StepTicks = cHHStepTicks) +if ((Gear^.State and gstFalling) <> 0) or (StepTicks = cHHStepTicks) or (CurAmmoGear <> nil) then // we're moving begin // check for case with ammo @@ -257,41 +259,41 @@ if CurAmmoGear <> nil then begin - CurAmmoGear.Message:= Gear.Message; + CurAmmoGear^.Message:= Gear^.Message; exit end; -if ((Gear.Message and gm_Attack) <> 0) or - ((Gear.State and gstAttacking) <> 0)then Attack(Gear); +if ((Gear^.Message and gm_Attack) <> 0) or + ((Gear^.State and gstAttacking) <> 0)then Attack(Gear); -if (Gear.State and gstFalling) <> 0 then +if (Gear^.State and gstFalling) <> 0 then begin - // it could be the source to trick: double-backspace jump -> vertical wall - // collision - > (abs(Gear.dX) < 0.0000002) -> backspace -> even more high jump - if ((Gear.Message and gm_HJump) <> 0) and ((Gear.State and gstHHJumping) <> 0) then - if (abs(Gear.dX) < 2 * cLittle) and (Gear.dY < -0.02) then + // it could be the source to trick: hwFloat-backspace jump -> vertical wall + // collision - > (abs(Gear^.dX) < 0.0000002) -> backspace -> even more high jump + if ((Gear^.Message and gm_HJump) <> 0) and ((Gear^.State and gstHHJumping) <> 0) then + if (hwAbs(Gear^.dX) < cLittle + cLittle) and (Gear^.dY < -_0_02) then begin - Gear.dY:= -0.25; - Gear.dX:= hwSign(Gear.dX) * 0.02 + Gear^.dY:= -_0_25; + Gear^.dX:= hwSign(Gear^.dX) * _0_02 end; - Gear.Message:= Gear.Message and not (gm_LJump or gm_HJump); - if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then SetLittle(Gear.dX); - Gear.X:= Gear.X + Gear.dX; - Gear.dY:= Gear.dY + cGravity; - if (Gear.dY < 0)and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; - Gear.Y:= Gear.Y + Gear.dY; - if (Gear.dY >= 0)and TestCollisionYwithGear(Gear, 1) then + Gear^.Message:= Gear^.Message and not (gm_LJump or gm_HJump); + if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then SetLittle(Gear^.dX); + Gear^.X:= Gear^.X + Gear^.dX; + Gear^.dY:= Gear^.dY + cGravity; + if (Gear^.dY < 0)and TestCollisionYwithGear(Gear, -1) then Gear^.dY:= 0; + Gear^.Y:= Gear^.Y + Gear^.dY; + if (not Gear^.dY.isNegative)and TestCollisionYwithGear(Gear, 1) then begin CheckHHDamage(Gear); - if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55) - and ((Gear.State and gstHHJumping) <> 0) then SetLittle(Gear.dX); - Gear.State:= Gear.State and not (gstFalling or gstHHJumping); - StepTicks:= 300; - Gear.dY:= 0 + if ((hwAbs(Gear^.dX) + hwAbs(Gear^.dY)) < _0_55) + and ((Gear^.State and gstHHJumping) <> 0) then SetLittle(Gear^.dX); + Gear^.State:= Gear^.State and not (gstFalling or gstHHJumping); + StepTicks:= 300; + Gear^.dY:= 0 end; CheckGearDrowning(Gear); exit - end ;//else if Gear.CollIndex = High(Longword) then AddIntersectorsCR(Gear); + end ;//else if Gear^.CollIndex = High(Longword) then AddIntersectorsCR(Gear); HedgehogChAngle(Gear); if StepTicks > 0 then dec(StepTicks); @@ -304,79 +306,79 @@ //DeleteCI(Gear); if not TestCollisionYwithGear(Gear, 1) then begin - if (Gear.dY < 0) and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; - Gear.State:= Gear.State or gstFalling or gstMoving; - Gear.dY:= Gear.dY + cGravity + if (Gear^.dY < 0) and TestCollisionYwithGear(Gear, -1) then Gear^.dY:= 0; + Gear^.State:= Gear^.State or gstFalling or gstMoving; + Gear^.dY:= Gear^.dY + cGravity end else begin CheckHHDamage(Gear); - if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55) - and ((Gear.State and gstHHJumping) <> 0) then SetLittle(Gear.dX); - Gear.State:= Gear.State and not (gstFalling or gstHHJumping); - if Gear.dY > 0 then Gear.dY:= 0; - if ((Gear.State and gstMoving) <> 0) then Gear.dX:= Gear.dX * Gear.Friction + if ((hwAbs(Gear^.dX) + hwAbs(Gear^.dY)) < _0_55) + and ((Gear^.State and gstHHJumping) <> 0) then SetLittle(Gear^.dX); + Gear^.State:= Gear^.State and not (gstFalling or gstHHJumping); + if Gear^.dY > 0 then Gear^.dY:= 0; + if ((Gear^.State and gstMoving) <> 0) then Gear^.dX:= Gear^.dX * Gear^.Friction end; -if (Gear.State <> 0) then DeleteCI(Gear); +if (Gear^.State <> 0) then DeleteCI(Gear); -if (Gear.State and gstMoving) <> 0 then - if TestCollisionXwithGear(Gear, hwSign(Gear.dX)) then - if ((Gear.State and gstFalling) = 0) then - if abs(Gear.dX) > 0.01 then - if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -1, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.96; Gear.Y:= Gear.Y - 1 end else - if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -2, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.93; Gear.Y:= Gear.Y - 2 end else - if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -3, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.90; Gear.Y:= Gear.Y - 3 end else - if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -4, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.87; Gear.Y:= Gear.Y - 4 end else - if not TestCollisionXwithXYShift(Gear, hwSign(Gear.dX) - Gear.dX, -5, hwSign(Gear.dX)) then begin Gear.X:= Gear.X + Gear.dX; Gear.dX:= Gear.dX * 0.84; Gear.Y:= Gear.Y - 5 end else - if abs(Gear.dX) > 0.02 then Gear.dX:= -Gear.Elasticity * Gear.dX +if (Gear^.State and gstMoving) <> 0 then + if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then + if ((Gear^.State and gstFalling) = 0) then + if hwAbs(Gear^.dX) > _0_01 then + if not TestCollisionXwithXYShift(Gear, hwSign(Gear^.dX) - Gear^.dX, -1, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_96; Gear^.Y:= Gear^.Y - 1 end else + if not TestCollisionXwithXYShift(Gear, hwSign(Gear^.dX) - Gear^.dX, -2, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_93; Gear^.Y:= Gear^.Y - 2 end else + if not TestCollisionXwithXYShift(Gear, hwSign(Gear^.dX) - Gear^.dX, -3, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_9; Gear^.Y:= Gear^.Y - 3 end else + if not TestCollisionXwithXYShift(Gear, hwSign(Gear^.dX) - Gear^.dX, -4, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_87; Gear^.Y:= Gear^.Y - 4 end else + if not TestCollisionXwithXYShift(Gear, hwSign(Gear^.dX) - Gear^.dX, -5, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_84; Gear^.Y:= Gear^.Y - 5 end else + if hwAbs(Gear^.dX) > _0_02 then Gear^.dX:= -Gear^.Elasticity * Gear^.dX else begin - Gear.State:= Gear.State and not gstMoving; - SetLittle(Gear.dX) + Gear^.State:= Gear^.State and not gstMoving; + SetLittle(Gear^.dX) end else begin - Gear.State:= Gear.State and not gstMoving; - SetLittle(Gear.dX) + Gear^.State:= Gear^.State and not gstMoving; + SetLittle(Gear^.dX) end - else Gear.dX:= -Gear.Elasticity * Gear.dX; + else Gear^.dX:= -Gear^.Elasticity * Gear^.dX; -if ((Gear.State and gstFalling) = 0)and - (sqr(Gear.dX) + sqr(Gear.dY) < 0.0008) then +if ((Gear^.State and gstFalling) = 0)and + (hwAbs(Gear^.dX) + hwAbs(Gear^.dY) < _0_03) then begin - Gear.State:= Gear.State and not gstMoving; - SetLittle(Gear.dX); - Gear.dY:= 0 - end else Gear.State:= Gear.State or gstMoving; + Gear^.State:= Gear^.State and not gstMoving; + SetLittle(Gear^.dX); + Gear^.dY:= 0 + end else Gear^.State:= Gear^.State or gstMoving; -if (Gear.State and gstMoving) <> 0 then +if (Gear^.State and gstMoving) <> 0 then begin - Gear.X:= Gear.X + Gear.dX; - Gear.Y:= Gear.Y + Gear.dY; - if (Gear.dY > 0) and not TestCollisionYwithGear(Gear, 1) and TestCollisionYwithXYShift(Gear, 0, 1, 1) then + Gear^.X:= Gear^.X + Gear^.dX; + Gear^.Y:= Gear^.Y + Gear^.dY; + if (Gear^.dY > 0) and not TestCollisionYwithGear(Gear, 1) and TestCollisionYwithXYShift(Gear, 0, 1, 1) then begin CheckHHDamage(Gear); - Gear.dY:= 0; - Gear.Y:= Gear.Y + 1 + Gear^.dY:= 0; + Gear^.Y:= Gear^.Y + 1 end; end else - if Gear.Health = 0 then + if Gear^.Health = 0 then begin if AllInactive then begin - doMakeExplosion(round(Gear.X), round(Gear.Y), 30, EXPLAutoSound); - AddGear(round(Gear.X), round(Gear.Y), gtGrave, 0).Hedgehog:= Gear.Hedgehog; + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, EXPLAutoSound); + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtGrave, 0, 0, 0, 0)^.Hedgehog:= Gear^.Hedgehog; DeleteGear(Gear); SetAllToActive end; - AllInactive:= false; + AllInactive:= false; exit end; AllInactive:= false; if (not CheckGearDrowning(Gear)) and - ((Gear.State and gstMoving) = 0) then + ((Gear^.State and gstMoving) = 0) then begin - Gear.State:= 0; - Gear.Active:= false; + Gear^.State:= 0; + Gear^.Active:= false; AddGearCI(Gear); exit end @@ -385,11 +387,11 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepHedgehog(Gear: PGear); begin -if (Gear.Message and gm_Destroy) <> 0 then +if (Gear^.Message and gm_Destroy) <> 0 then begin DeleteGear(Gear); exit end; -if (Gear.State and gstHHDriven) = 0 then doStepHedgehogFree(Gear) +if (Gear^.State and gstHHDriven) = 0 then doStepHedgehogFree(Gear) else doStepHedgehogDriven(Gear) end; diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/SDLh.pas --- a/hedgewars/SDLh.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/SDLh.pas Sun Jan 21 19:51:02 2007 +0000 @@ -47,7 +47,7 @@ SDL_ASYNCBLIT = $00000004; SDL_ANYFORMAT = $10000000; SDL_HWPALETTE = $20000000; - SDL_DOUBLEBUF = $40000000; + SDL_hwFloatBUF = $40000000; SDL_FULLSCREEN = $80000000; SDL_NOFRAME = $00000020; SDL_HWACCEL = $00000100; diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/hwengine.dpr --- a/hedgewars/hwengine.dpr Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/hwengine.dpr Sun Jan 21 19:51:02 2007 +0000 @@ -43,7 +43,8 @@ uLandGraphics in 'uLandGraphics.pas', uLocale in 'uLocale.pas', uAmmos in 'uAmmos.pas', - uSHA in 'uSHA.pas'; + uSHA in 'uSHA.pas', + uFloat in 'uFloat.pas'; {$INCLUDE options.inc} @@ -102,7 +103,7 @@ flagMakeCapture:= false; s:= 'hw_' + cSeed + '_' + inttostr(GameTicks) + '.bmp'; WriteLnToConsole('Saving ' + s); - SDL_SaveBMP_RW(SDLPrimSurface, SDL_RWFromFile(PChar(s), 'wb'), 1) +// SDL_SaveBMP_RW(SDLPrimSurface, SDL_RWFromFile(PChar(s), 'wb'), 1) end; end; @@ -154,7 +155,7 @@ procedure GetParams; var c: integer; {$IFDEF DEBUGFILE} - i: integer; + i: integer; {$ENDIF} p: TPathType; begin @@ -194,8 +195,8 @@ procedure ShowMainWindow; begin -if cFullScreen then ParseCommand('fullscr 1') - else ParseCommand('fullscr 0'); +if cFullScreen then ParseCommand('fullscr 1', true) + else ParseCommand('fullscr 0', true); SDL_ShowCursor(0) end; @@ -225,7 +226,7 @@ SendIPCRaw(@s[0], Length(s) + 1); // send proto version InitTeams; -ParseCommand('ammstore 91911111111111108'); +ParseCommand('ammstore 91911111111111108', true); AssignStores; if isSoundEnabled then InitSound; diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/options.inc --- a/hedgewars/options.inc Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/options.inc Sun Jan 21 19:51:02 2007 +0000 @@ -17,6 +17,7 @@ *) {$J+} + {$DEFINE DEBUGFILE} { $DEFINE COUNTTICKS} { $DEFINE DUMP} diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/tunsetborder.inc --- a/hedgewars/tunsetborder.inc Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/tunsetborder.inc Sun Jan 21 19:51:02 2007 +0000 @@ -1,8 +1,8 @@ begin X:= X + dX; Y:= Y + dY; - tx:= round(X); - ty:= round(Y); + tx:= hwRound(X); + ty:= hwRound(Y); if ((ty and $FFFFFC00) = 0) and ((tx and $FFFFF800) = 0)and (Land[ty, tx] = $FFFFFF) then SetLandPixel(ty, tx) - end; \ No newline at end of file + end; diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uAI.pas --- a/hedgewars/uAI.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uAI.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,12 +18,13 @@ unit uAI; interface +uses uFloat; {$INCLUDE options.inc} procedure ProcessBot(FrameNo: Longword); procedure FreeActionsList; implementation -uses uTeams, uConsts, SDLh, uAIMisc, uGears, uAIAmmoTests, uAIActions, uMisc, +{uses uTeams, uConsts, SDLh, uAIMisc, uGears, uAIAmmoTests, uAIActions, uMisc, uAIThinkStack, uAmmos; var BestActions: TActions; @@ -31,13 +32,13 @@ AIThinkStart: Longword; isThinking: boolean = false; -procedure FreeActionsList; +}procedure FreeActionsList; begin -isThinking:= false; +{isThinking:= false; BestActions.Count:= 0; BestActions.Pos:= 0 -end; - +}end; +{ procedure TestAmmos(var Actions: TActions; Me: PGear); var Time, BotLevel: Longword; Angle, Power, Score, ExplX, ExplY, ExplR: integer; @@ -235,12 +236,12 @@ BestActions.Score:= Low(integer); Think(Me) -end; +end; } procedure ProcessBot(FrameNo: Longword); -const LastFrameNo: Longword = 0; +//const LastFrameNo: Longword = 0; begin -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do +{with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do if (Gear <> nil) and ((Gear.State and gstHHDriven) <> 0) and (TurnTimeLeft < cHedgehogTurnTime - 50) then @@ -252,6 +253,6 @@ LastFrameNo:= FrameNo; Think(Gear) end; -end; +}end; end. diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uAIActions.pas --- a/hedgewars/uAIActions.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uAIActions.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,9 +18,9 @@ unit uAIActions; interface -uses uGears; +uses uGears, uFloat; {$INCLUDE options.inc} -const MAXACTIONS = 96; +(*const MAXACTIONS = 96; aia_none = 0; aia_Left = 1; aia_Right = 2; @@ -57,9 +57,9 @@ procedure AddAction(var Actions: TActions; Action, Param, TimeDelta: Longword; const X: integer = 0; Y: integer = 0); procedure ProcessAction(var Actions: TActions; Me: PGear); - +*) implementation -uses uMisc, uTeams, uConsts, uConsole, uAIMisc; +(*uses uMisc, uTeams, uConsts, uConsole, uAIMisc; const ActionIdToStr: array[0..6] of string[16] = ( {aia_none} '', @@ -191,5 +191,5 @@ inc(Actions.actions[Actions.Pos].Time, GameTicks); until false end; - +*) end. diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uAIAmmoTests.pas --- a/hedgewars/uAIAmmoTests.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uAIAmmoTests.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,9 +18,9 @@ unit uAIAmmoTests; interface -uses SDLh, uGears, uConsts; +uses SDLh, uGears, uConsts, uFloat; -function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; +(*function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; @@ -50,22 +50,23 @@ ); const BadTurn = Low(integer); +*) implementation uses uMisc, uAIMisc, uLand; - +{ function Metric(x1, y1, x2, y2: integer): integer; begin Result:= abs(x1 - x2) + abs(y1 - y2) end; function TestBazooka(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; -var Vx, Vy, r: Double; - rTime: Double; +var Vx, Vy, r: hwFloat; + rTime: hwFloat; Score, EX, EY: integer; function CheckTrace: integer; - var x, y, dX, dY: Double; + var x, y, dX, dY: hwFloat; t: integer; begin x:= Me.X; @@ -115,12 +116,12 @@ function TestGrenade(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; const tDelta = 24; -var Vx, Vy, r: Double; +var Vx, Vy, r: hwFloat; Score, EX, EY: integer; TestTime: Longword; function CheckTrace: integer; - var x, y, dY: Double; + var x, y, dY: hwFloat; t: integer; begin x:= Me.X; @@ -167,7 +168,7 @@ end; function TestShotgun(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; -var Vx, Vy, x, y: Double; +var Vx, Vy, x, y: hwFloat; begin ExplR:= 0; if Metric(round(Me.X), round(Me.Y), Targ.X, Targ.Y) < 80 then @@ -197,7 +198,7 @@ end; function TestDesertEagle(Me: PGear; Targ: TPoint; Level: Integer; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; -var Vx, Vy, x, y, t: Double; +var Vx, Vy, x, y, t: hwFloat; d: Longword; begin ExplR:= 0; @@ -257,5 +258,5 @@ Result:= Result + RateShove(Me, round(Me.X) + 10 * hwSign(Targ.X - Me.X), round(Me.Y) - 20 * i - 5, 10, 30); if Result <= 0 then Result:= BadTurn end; - +} end. diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uAIMisc.pas --- a/hedgewars/uAIMisc.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uAIMisc.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,9 +18,9 @@ unit uAIMisc; interface -uses SDLh, uConsts, uGears; +uses SDLh, uConsts, uGears, uFloat; {$INCLUDE options.inc} - + { type TTarget = record Point: TPoint; Score: integer; @@ -48,9 +48,9 @@ var ThinkingHH: PGear; Targets: TTargets; - + } implementation -uses uTeams, uMisc, uLand, uCollisions; +{uses uTeams, uMisc, uLand, uCollisions; const KillScore = 200; MAXBONUS = 1024; @@ -389,6 +389,6 @@ begin if random(2) = 0 then Result:= num else Result:= - num -end; +end; } end. diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uAmmos.pas --- a/hedgewars/uAmmos.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uAmmos.pas Sun Jan 21 19:51:02 2007 +0000 @@ -28,8 +28,8 @@ if cnts[a] > 0 then begin TryDo(mi[Ammoz[a].Slot] <= cMaxSlotAmmoIndex, 'Ammo slot overflow', true); - Ammo[Ammoz[a].Slot, mi[Ammoz[a].Slot]]:= Ammoz[a].Ammo; - Ammo[Ammoz[a].Slot, mi[Ammoz[a].Slot]].Count:= cnts[a]; + Ammo^[Ammoz[a].Slot, mi[Ammoz[a].Slot]]:= Ammoz[a].Ammo; + Ammo^[Ammoz[a].Slot, mi[Ammoz[a].Slot]].Count:= cnts[a]; inc(mi[Ammoz[a].Slot]) end end; @@ -59,7 +59,7 @@ function GetAmmoByNum(num: Longword): PHHAmmo; begin TryDo(num < StoreCnt, 'Invalid store number', true); -Result:= StoresList[num] +exit(StoresList[num]) end; procedure AssignStores; @@ -70,9 +70,9 @@ while tteam <> nil do begin for i:= 0 to cMaxHHIndex do - if tteam.Hedgehogs[i].Gear <> nil then - tteam.Hedgehogs[i].Ammo:= GetAmmoByNum(tteam.Hedgehogs[i].AmmoStore); - tteam:= tteam.Next + if tteam^.Hedgehogs[i].Gear <> nil then + tteam^.Hedgehogs[i].Ammo:= GetAmmoByNum(tteam^.Hedgehogs[i].AmmoStore); + tteam:= tteam^.Next end end; @@ -82,12 +82,12 @@ hhammo: PHHAmmo; begin FillChar(ammos, sizeof(ammos), 0); -hhammo:= PHedgehog(Hedgehog).Ammo; +hhammo:= PHedgehog(Hedgehog)^.Ammo; for slot:= 0 to cMaxSlotIndex do for ami:= 0 to cMaxSlotAmmoIndex do - if hhammo[slot, ami].Count > 0 then - ammos[hhammo[slot, ami].AmmoType]:= hhammo[slot, ami].Count; + if hhammo^[slot, ami].Count > 0 then + ammos[hhammo^[slot, ami].AmmoType]:= hhammo^[slot, ami].Count; if ammos[ammo] <> AMMO_INFINITE then inc(ammos[ammo]); FillAmmoStore(hhammo, ammos) @@ -101,13 +101,13 @@ b:= false; ami:= 0; while (not b) and (ami < cMaxSlotAmmoIndex) do - if (Ammo[Slot, ami].Count = 0) - and (Ammo[Slot, ami + 1].Count > 0) then b:= true + if (Ammo^[Slot, ami].Count = 0) + and (Ammo^[Slot, ami + 1].Count > 0) then b:= true else inc(ami); if b then // there's a free item in ammo stack begin - Ammo[Slot, ami]:= Ammo[Slot, ami + 1]; - Ammo[Slot, ami + 1].Count:= 0 + Ammo^[Slot, ami]:= Ammo^[Slot, ami + 1]; + Ammo^[Slot, ami + 1].Count:= 0 end; until not b; end; @@ -115,11 +115,11 @@ procedure OnUsedAmmo(Ammo: PHHAmmo); var s, a: Longword; begin -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do begin if CurAmmoGear = nil then begin s:= CurSlot; a:= CurAmmo end else begin s:= AltSlot; a:= AltAmmo end; - with Ammo[s, a] do + with Ammo^[s, a] do if Count <> AMMO_INFINITE then begin dec(Count); @@ -133,13 +133,13 @@ begin Slot:= Ammoz[Ammo].Slot; ami:= 0; -Result:= false; -while (not Result) and (ami <= cMaxSlotAmmoIndex) do +while (ami <= cMaxSlotAmmoIndex) do begin - with PHedgehog(Hedgehog).Ammo[Slot, ami] do - if (AmmoType = Ammo) and (Count > 0) then Result:= true; + with PHedgehog(Hedgehog)^.Ammo^[Slot, ami] do + if (AmmoType = Ammo) and (Count > 0) then exit(true); inc(ami) - end + end; +HHHasAmmo:= false end; end. diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uCollisions.pas --- a/hedgewars/uCollisions.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uCollisions.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,7 +18,7 @@ unit uCollisions; interface -uses uGears; +uses uGears, uFloat; {$INCLUDE options.inc} const cMaxGearArrayInd = 255; @@ -34,7 +34,7 @@ function TestCollisionXwithGear(Gear: PGear; Dir: integer): boolean; function TestCollisionYwithGear(Gear: PGear; Dir: integer): boolean; function TestCollisionY(Gear: PGear; Dir: integer): boolean; -function TestCollisionXwithXYShift(Gear: PGear; ShiftX, ShiftY: Double; Dir: integer): boolean; +function TestCollisionXwithXYShift(Gear: PGear; ShiftX, ShiftY: hwFloat; Dir: integer): boolean; function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: integer; Dir: integer): boolean; implementation @@ -44,7 +44,7 @@ X, Y, Radius: integer; cGear: PGear; end; - + const MAXRECTSINDEX = 255; var Count: Longword = 0; cinfos: array[0..MAXRECTSINDEX] of TCollisionEntry; @@ -52,28 +52,28 @@ procedure AddGearCI(Gear: PGear); begin -if Gear.CollIndex < High(Longword) then exit; +if Gear^.CollIndex < High(Longword) then exit; TryDo(Count <= MAXRECTSINDEX, 'Collision rects array overflow', true); with cinfos[Count] do begin - X:= round(Gear.X); - Y:= round(Gear.Y); - Radius:= Gear.Radius; + X:= hwRound(Gear^.X); + Y:= hwRound(Gear^.Y); + Radius:= Gear^.Radius; FillRoundInLand(X, Y, Radius-1, $FF); cGear:= Gear end; -Gear.CollIndex:= Count; +Gear^.CollIndex:= Count; inc(Count) end; procedure DeleteCI(Gear: PGear); begin -if Gear.CollIndex < Count then +if Gear^.CollIndex < Count then begin - with cinfos[Gear.CollIndex] do FillRoundInLand(X, Y, Radius-1, 0); - cinfos[Gear.CollIndex]:= cinfos[Pred(Count)]; - cinfos[Gear.CollIndex].cGear.CollIndex:= Gear.CollIndex; - Gear.CollIndex:= High(Longword); + with cinfos[Gear^.CollIndex] do FillRoundInLand(X, Y, Radius-1, 0); + cinfos[Gear^.CollIndex]:= cinfos[Pred(Count)]; + cinfos[Gear^.CollIndex].cGear^.CollIndex:= Gear^.CollIndex; + Gear^.CollIndex:= High(Longword); dec(Count) end; end; @@ -81,93 +81,98 @@ function CheckGearsCollision(Gear: PGear): PGearArray; var mx, my: integer; i: Longword; + Result: PGearArray; begin Result:= @ga; ga.Count:= 0; if Count = 0 then exit; -mx:= round(Gear.X); -my:= round(Gear.Y); +mx:= hwRound(Gear^.X); +my:= hwRound(Gear^.Y); for i:= 0 to Pred(Count) do with cinfos[i] do if (Gear <> cGear) and - (sqrt(sqr(mx - x) + sqr(my - y)) <= Radius + Gear.Radius) then + (sqrt(sqr(mx - x) + sqr(my - y)) <= Radius + Gear^.Radius) then begin ga.ar[ga.Count]:= cinfos[i].cGear; inc(ga.Count) end; +CheckGearsCollision:= Result end; function TestCollisionXwithGear(Gear: PGear; Dir: integer): boolean; var x, y, i: integer; begin -Result:= false; -x:= round(Gear.X); -if Dir < 0 then x:= x - Gear.Radius - else x:= x + Gear.Radius; +x:= hwRound(Gear^.X); +if Dir < 0 then x:= x - Gear^.Radius + else x:= x + Gear^.Radius; if (x and $FFFFF800) = 0 then begin - y:= round(Gear.Y) - Gear.Radius + 1; - i:= y + Gear.Radius * 2 - 2; + y:= hwRound(Gear^.Y) - Gear^.Radius + 1; + i:= y + Gear^.Radius * 2 - 2; repeat - if (y and $FFFFFC00) = 0 then Result:= Land[y, x]<>0; + if (y and $FFFFFC00) = 0 then + if Land[y, x] <> 0 then exit(true); inc(y) - until (y > i) or Result; - end + until (y > i); + end; +TestCollisionXwithGear:= false end; -function TestCollisionXwithXYShift(Gear: PGear; ShiftX, ShiftY: Double; Dir: integer): boolean; +function TestCollisionXwithXYShift(Gear: PGear; ShiftX, ShiftY: hwFloat; Dir: integer): boolean; begin -Gear.X:= Gear.X + ShiftX; -Gear.Y:= Gear.Y + ShiftY; -Result:= TestCollisionXwithGear(Gear, Dir); -Gear.X:= Gear.X - ShiftX; -Gear.Y:= Gear.Y - ShiftY +Gear^.X:= Gear^.X + ShiftX; +Gear^.Y:= Gear^.Y + ShiftY; +TestCollisionXwithXYShift:= TestCollisionXwithGear(Gear, Dir); +Gear^.X:= Gear^.X - ShiftX; +Gear^.Y:= Gear^.Y - ShiftY end; function TestCollisionYwithGear(Gear: PGear; Dir: integer): boolean; var x, y, i: integer; begin -Result:= false; -y:= round(Gear.Y); -if Dir < 0 then y:= y - Gear.Radius - else y:= y + Gear.Radius; +y:= hwRound(Gear^.Y); +if Dir < 0 then y:= y - Gear^.Radius + else y:= y + Gear^.Radius; if (y and $FFFFFC00) = 0 then begin - x:= round(Gear.X) - Gear.Radius + 1; - i:= x + Gear.Radius * 2 - 2; + x:= hwRound(Gear^.X) - Gear^.Radius + 1; + i:= x + Gear^.Radius * 2 - 2; repeat - if (x and $FFFFF800) = 0 then Result:= Land[y, x]<>0; + if (x and $FFFFF800) = 0 then + if Land[y, x] <> 0 then exit(true); inc(x) - until (x > i) or Result; - end + until (x > i); + end; +TestCollisionYwithGear:= false end; function TestCollisionY(Gear: PGear; Dir: integer): boolean; var x, y, i: integer; begin -Result:= false; -y:= round(Gear.Y); -if Dir < 0 then y:= y - Gear.Radius - else y:= y + Gear.Radius; +y:= hwRound(Gear^.Y); +if Dir < 0 then y:= y - Gear^.Radius + else y:= y + Gear^.Radius; if (y and $FFFFFC00) = 0 then begin - x:= round(Gear.X) - Gear.Radius + 1; - i:= x + Gear.Radius * 2 - 2; + x:= hwRound(Gear^.X) - Gear^.Radius + 1; + i:= x + Gear^.Radius * 2 - 2; repeat - if (x and $FFFFF800) = 0 then Result:= Land[y, x] = COLOR_LAND; + if (x and $FFFFF800) = 0 then + if Land[y, x] = COLOR_LAND then exit(true); inc(x) - until (x > i) or Result; - end + until (x > i); + end; +TestCollisionY:= false end; function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: integer; Dir: integer): boolean; begin -Gear.X:= Gear.X + ShiftX; -Gear.Y:= Gear.Y + ShiftY; -Result:= TestCollisionYwithGear(Gear, Dir); -Gear.X:= Gear.X - ShiftX; -Gear.Y:= Gear.Y - ShiftY +Gear^.X:= Gear^.X + ShiftX; +Gear^.Y:= Gear^.Y + ShiftY; +TestCollisionYwithXYShift:= TestCollisionYwithGear(Gear, Dir); +Gear^.X:= Gear^.X - ShiftX; +Gear^.Y:= Gear^.Y - ShiftY end; end. diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uConsole.pas --- a/hedgewars/uConsole.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uConsole.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,17 +18,17 @@ unit uConsole; interface -uses SDLh; +uses SDLh, uFloat; {$INCLUDE options.inc} const isDeveloperMode: boolean = true; -type TVariableType = (vtCommand, vtInteger, vtDouble, vtBoolean); +type TVariableType = (vtCommand, vtInteger, vthwFloat, vtBoolean); TCommandHandler = procedure (var params: shortstring); procedure DrawConsole(Surface: PSDL_Surface); procedure WriteToConsole(s: shortstring); procedure WriteLnToConsole(s: shortstring); procedure KeyPressConsole(Key: Longword); -procedure ParseCommand(CmdStr: shortstring; const TrustedSource: boolean = true); +procedure ParseCommand(CmdStr: shortstring; TrustedSource: boolean); function GetLastConsoleLine: shortstring; implementation @@ -37,7 +37,7 @@ uRandom, uAmmos; const cLineWidth: integer = 0; cLinesCount = 256; - + type PVariable = ^TVariable; TVariable = record Next: PVariable; @@ -53,20 +53,23 @@ Variables: PVariable = nil; function RegisterVariable(Name: string; VType: TVariableType; p: pointer; Trusted: boolean): PVariable; +var Result: PVariable; begin New(Result); TryDo(Result <> nil, 'RegisterVariable: Result = nil', true); FillChar(Result^, sizeof(TVariable), 0); -Result.Name:= Name; -Result.VType:= VType; -Result.Handler:= p; -Result.Trusted:= Trusted; +Result^.Name:= Name; +Result^.VType:= VType; +Result^.Handler:= p; +Result^.Trusted:= Trusted; if Variables = nil then Variables:= Result else begin - Result.Next:= Variables; + Result^.Next:= Variables; Variables:= Result - end + end; + +RegisterVariable:= Result end; procedure FreeVariablesList; @@ -74,10 +77,10 @@ begin tt:= Variables; Variables:= nil; -while tt<>nil do +while tt <> nil do begin t:= tt; - tt:= tt.Next; + tt:= tt^.Next; Dispose(t) end; end; @@ -151,8 +154,8 @@ for i:= 0 to Pred(cLinesCount) do PLongWord(@ConsoleLines[i])^:= 0 end; -procedure ParseCommand(CmdStr: shortstring; const TrustedSource: boolean = true); -type PDouble = ^Double; +procedure ParseCommand(CmdStr: shortstring; TrustedSource: boolean); +type PhwFloat = ^hwFloat; var i, ii: integer; s: shortstring; t: PVariable; @@ -167,39 +170,39 @@ t:= Variables; while t <> nil do begin - if t.Name = CmdStr then + if t^.Name = CmdStr then begin - if TrustedSource or t.Trusted then - case t.VType of + if TrustedSource or t^.Trusted then + case t^.VType of vtCommand: if c='/' then begin - TCommandHandler(t.Handler)(s); + TCommandHandler(t^.Handler)(s); end; vtInteger: if c='$' then if s[0]=#0 then begin - str(PInteger(t.Handler)^, s); + str(PInteger(t^.Handler)^, s); WriteLnToConsole('$' + CmdStr + ' is "' + s + '"'); - end else val(s, PInteger(t.Handler)^, i); - vtDouble: if c='$' then + end else val(s, PInteger(t^.Handler)^, i); + vthwFloat: if c='$' then if s[0]=#0 then begin - str(PDouble(t.Handler)^:4:6, s); + //str(PhwFloat(t^.Handler)^:4:6, s); WriteLnToConsole('$' + CmdStr + ' is "' + s + '"'); - end else val(s, PDouble(t.Handler)^ , i); + end else; //val(s, PhwFloat(t^.Handler)^, i); vtBoolean: if c='$' then if s[0]=#0 then begin - str(ord(boolean(t.Handler^)), s); + str(ord(boolean(t^.Handler^)), s); WriteLnToConsole('$' + CmdStr + ' is "' + s + '"'); end else begin val(s, ii, i); - boolean(t.Handler^):= not (ii = 0) + boolean(t^.Handler^):= not (ii = 0) end; end; exit - end else t:= t.Next + end else t:= t^.Next end; case c of '$': WriteLnToConsole(errmsgUnknownVariable + ': "$' + CmdStr + '"') @@ -218,15 +221,15 @@ t:= Variables; while t <> nil do begin - if (c=#0) or ((t.VType = vtCommand) and (c='/'))or - ((t.VType <> vtCommand) and (c='$'))then - if copy(t.Name, 1, Length(InputStr)) = InputStr then + if (c=#0) or ((t^.VType = vtCommand) and (c='/'))or + ((t^.VType <> vtCommand) and (c='$'))then + if copy(t^.Name, 1, Length(InputStr)) = InputStr then begin - if t.VType = vtCommand then InputStr:= '/' + t.Name + ' ' - else InputStr:= '$' + t.Name + ' '; + if t^.VType = vtCommand then InputStr:= '/' + t^.Name + ' ' + else InputStr:= '$' + t^.Name + ' '; exit end; - t:= t.Next + t:= t^.Next end end; @@ -253,8 +256,8 @@ function GetLastConsoleLine: shortstring; begin -if CurrLine = 0 then Result:= ConsoleLines[Pred(cLinesCount)] - else Result:= ConsoleLines[Pred(CurrLine)] +if CurrLine = 0 then GetLastConsoleLine:= ConsoleLines[Pred(cLinesCount)] + else GetLastConsoleLine:= ConsoleLines[Pred(CurrLine)] end; {$INCLUDE CCHandlers.inc} diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uConsts.pas Sun Jan 21 19:51:02 2007 +0000 @@ -121,8 +121,6 @@ cHHStepTicks = 38; cHHZ = 1000; cCurrHHZ = Succ(cHHZ); - cHHKick = 0.03; - cLittle = 0.0000001; cKeyMaxIndex = 1023; @@ -184,10 +182,12 @@ cThemeCFGFilename = 'theme.cfg'; Fontz: array[THWFont] of THHFont = ( - (Height: 12; + (Handle: nil; + Height: 12; style: TTF_STYLE_NORMAL; Name: 'DejaVuSans.ttf'), - (Height: 24; + (Handle: nil; + Height: 24; style: TTF_STYLE_NORMAL; Name: 'DejaVuSans.ttf') ); @@ -241,40 +241,72 @@ Width, Height: integer; hasAlpha: boolean; end = ( - (FileName: 'BlueWater'; Path: ptGraphics; Width: 256; Height: 48; hasAlpha: false),// sprWater - (FileName: 'Clouds'; Path: ptCurrTheme; - AltPath: ptGraphics; Width: 256; Height:128; hasAlpha: false),// sprCloud - (FileName: 'Bomb'; Path: ptGraphics; Width: 16; Height: 16; hasAlpha: false),// sprBomb - (FileName: 'BigDigits'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: true),// sprBigDigit - (FileName: 'Frame'; Path: ptGraphics; Width: 4; Height: 32; hasAlpha: true),// sprFrame - (FileName: 'Lag'; Path: ptGraphics; Width: 64; Height: 64; hasAlpha: false),// sprLag - (FileName: 'Arrow'; Path: ptGraphics; Width: 16; Height: 16; hasAlpha: false),// sprCursor - (FileName: 'Grenade'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false),// sprGrenade - (FileName: 'Targetp'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false),// sprTargetP - (FileName: 'UFO'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false),// sprUFO - (FileName:'SmokeTrace'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: true),// sprSmokeTrace - (FileName: 'RopeHook'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false),// sprRopeHook - (FileName: 'Expl50'; Path: ptGraphics; Width: 64; Height: 64; hasAlpha: false),// sprExplosion50 - (FileName: 'MineOff'; Path: ptGraphics; Width: 16; Height: 16; hasAlpha: false),// sprMineOff - (FileName: 'MineOn'; Path: ptGraphics; Width: 16; Height: 16; hasAlpha: false),// sprMineOn - (FileName: 'Case'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false),// sprCase - (FileName: 'FirstAid'; Path: ptGraphics; Width: 48; Height: 48; hasAlpha: false),// sprFAid - (FileName: 'dynamite'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false),// sprDynamite - (FileName: 'Power'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: true),// sprPower - (FileName: 'ClBomb'; Path: ptGraphics; Width: 16; Height: 16; hasAlpha: false),// sprClusterBomb - (FileName:'ClParticle'; Path: ptGraphics; Width: 16; Height: 16; hasAlpha: false),// sprClusterParticle - (FileName: 'Flame'; Path: ptGraphics; Width: 16; Height: 16; hasAlpha: false),// sprFlame - (FileName: 'horizont'; Path: ptCurrTheme;Width: 0; Height: 0; hasAlpha: false),// sprHorizont - (FileName: 'Sky'; Path: ptCurrTheme;Width: 0; Height: 0; hasAlpha: false),// sprSky - (FileName: 'BrdrLines'; Path: ptAmmoMenu; Width: 202; Height: 1; hasAlpha: false),// sprAMBorders - (FileName: 'Slot'; Path: ptAmmoMenu; Width: 202; Height: 33; hasAlpha: false),// sprAMSlot - (FileName: 'AmmoName'; Path: ptAmmoMenu; Width: 202; Height: 33; hasAlpha: false),// sprAMSlotName - (FileName: 'Ammos'; Path: ptAmmoMenu; Width: 32; Height: 32; hasAlpha: false),// sprAMAmmos - (FileName: 'SlotKeys'; Path: ptAmmoMenu; Width: 32; Height: 32; hasAlpha: false),// sprAMSlotKeys - (FileName: 'Selection'; Path: ptAmmoMenu; Width: 32; Height: 32; hasAlpha: false),// sprAMSelection - (FileName: 'Finger'; Path: ptGraphics; Width: 32; Height: 48; hasAlpha: false),// sprFinger - (FileName: 'AirBomb'; Path: ptGraphics; Width: 32; Height: 32; hasAlpha: false),// sprAirBomb - (FileName: 'Airplane'; Path: ptGraphics; Width: 125; Height: 42; hasAlpha: false) // sprAirplane + (FileName: 'BlueWater'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 256; Height: 48; hasAlpha: false),// sprWater + (FileName: 'Clouds'; Path: ptCurrTheme; AltPath: ptGraphics; Surface: nil; + Width: 256; Height:128; hasAlpha: false),// sprCloud + (FileName: 'Bomb'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 16; Height: 16; hasAlpha: false),// sprBomb + (FileName: 'BigDigits'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 32; Height: 32; hasAlpha: true),// sprBigDigit + (FileName: 'Frame'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 4; Height: 32; hasAlpha: true),// sprFrame + (FileName: 'Lag'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 64; Height: 64; hasAlpha: false),// sprLag + (FileName: 'Arrow'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 16; Height: 16; hasAlpha: false),// sprCursor + (FileName: 'Grenade'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 32; Height: 32; hasAlpha: false),// sprGrenade + (FileName: 'Targetp'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 32; Height: 32; hasAlpha: false),// sprTargetP + (FileName: 'UFO'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 32; Height: 32; hasAlpha: false),// sprUFO + (FileName:'SmokeTrace'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 32; Height: 32; hasAlpha: true),// sprSmokeTrace + (FileName: 'RopeHook'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 32; Height: 32; hasAlpha: false),// sprRopeHook + (FileName: 'Expl50'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 64; Height: 64; hasAlpha: false),// sprExplosion50 + (FileName: 'MineOff'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 16; Height: 16; hasAlpha: false),// sprMineOff + (FileName: 'MineOn'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 16; Height: 16; hasAlpha: false),// sprMineOn + (FileName: 'Case'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 32; Height: 32; hasAlpha: false),// sprCase + (FileName: 'FirstAid'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 48; Height: 48; hasAlpha: false),// sprFAid + (FileName: 'dynamite'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 32; Height: 32; hasAlpha: false),// sprDynamite + (FileName: 'Power'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 32; Height: 32; hasAlpha: true),// sprPower + (FileName: 'ClBomb'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 16; Height: 16; hasAlpha: false),// sprClusterBomb + (FileName:'ClParticle'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 16; Height: 16; hasAlpha: false),// sprClusterParticle + (FileName: 'Flame'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 16; Height: 16; hasAlpha: false),// sprFlame + (FileName: 'horizont'; Path: ptCurrTheme; AltPath: ptNone; Surface: nil; + Width: 0; Height: 0; hasAlpha: false),// sprHorizont + (FileName: 'Sky'; Path: ptCurrTheme; AltPath: ptNone; Surface: nil; + Width: 0; Height: 0; hasAlpha: false),// sprSky + (FileName: 'BrdrLines'; Path: ptAmmoMenu; AltPath: ptNone; Surface: nil; + Width: 202; Height: 1; hasAlpha: false),// sprAMBorders + (FileName: 'Slot'; Path: ptAmmoMenu; AltPath: ptNone; Surface: nil; + Width: 202; Height: 33; hasAlpha: false),// sprAMSlot + (FileName: 'AmmoName'; Path: ptAmmoMenu; AltPath: ptNone; Surface: nil; + Width: 202; Height: 33; hasAlpha: false),// sprAMSlotName + (FileName: 'Ammos'; Path: ptAmmoMenu; AltPath: ptNone; Surface: nil; + Width: 32; Height: 32; hasAlpha: false),// sprAMAmmos + (FileName: 'SlotKeys'; Path: ptAmmoMenu; AltPath: ptNone; Surface: nil; + Width: 32; Height: 32; hasAlpha: false),// sprAMSlotKeys + (FileName: 'Selection'; Path: ptAmmoMenu; AltPath: ptNone; Surface: nil; + Width: 32; Height: 32; hasAlpha: false),// sprAMSelection + (FileName: 'Finger'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 32; Height: 48; hasAlpha: false),// sprFinger + (FileName: 'AirBomb'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 32; Height: 32; hasAlpha: false),// sprAirBomb + (FileName: 'Airplane'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + Width: 125; Height: 42; hasAlpha: false) // sprAirplane ); Soundz: array[TSound] of record FileName: String[31]; @@ -309,7 +341,9 @@ Timer: 3000; AmmoType: amGrenade); Slot: 1; - TimeAfterTurn: 3000), + TimeAfterTurn: 3000; + minAngle: 0; + maxAngle: 0), (NameId: sidClusterBomb; Ammo: (Propz: ammoprop_Timerable or ammoprop_Power; @@ -318,7 +352,9 @@ Timer: 3000; AmmoType: amClusterBomb); Slot: 1; - TimeAfterTurn: 3000), + TimeAfterTurn: 3000; + minAngle: 0; + maxAngle: 0), (NameId: sidBazooka; Ammo: (Propz: ammoprop_Power; Count: AMMO_INFINITE; @@ -326,7 +362,9 @@ Timer: 0; AmmoType: amBazooka); Slot: 0; - TimeAfterTurn: 3000), + TimeAfterTurn: 3000; + minAngle: 0; + maxAngle: 0), (NameId: sidUFO; Ammo: (Propz: ammoprop_Power or ammoprop_NeedTarget; @@ -335,7 +373,9 @@ Timer: 0; AmmoType: amUFO); Slot: 0; - TimeAfterTurn: 3000), + TimeAfterTurn: 3000; + minAngle: 0; + maxAngle: 0), (NameId: sidShotgun; Ammo: (Propz: ammoprop_ForwMsgs; Count: AMMO_INFINITE; @@ -343,7 +383,9 @@ Timer: 0; AmmoType: amShotgun); Slot: 2; - TimeAfterTurn: 3000), + TimeAfterTurn: 3000; + minAngle: 0; + maxAngle: 0), (NameId: sidPickHammer; Ammo: (Propz: ammoprop_ForwMsgs or ammoprop_AttackInFall or @@ -354,7 +396,9 @@ Timer: 0; AmmoType: amPickHammer); Slot: 6; - TimeAfterTurn: 0), + TimeAfterTurn: 0; + minAngle: 0; + maxAngle: 0), (NameId: sidSkip; Ammo: (Propz: 0; Count: AMMO_INFINITE; @@ -362,7 +406,9 @@ Timer: 0; AmmoType: amSkip); Slot: 8; - TimeAfterTurn: 0), + TimeAfterTurn: 0; + minAngle: 0; + maxAngle: 0), (NameId: sidRope; Ammo: (Propz: ammoprop_ForwMsgs or ammoprop_AttackInFall or @@ -373,6 +419,7 @@ AmmoType: amRope); Slot: 7; TimeAfterTurn: 0; + minAngle: 0; maxAngle: cMaxAngle div 2), (NameId: sidMine; Ammo: (Propz: ammoprop_NoCrosshair; @@ -381,7 +428,9 @@ Timer: 0; AmmoType: amMine); Slot: 4; - TimeAfterTurn: 5000), + TimeAfterTurn: 5000; + minAngle: 0; + maxAngle: 0), (NameId: sidDEagle; Ammo: (Propz: 0; Count: 3; @@ -389,7 +438,9 @@ Timer: 0; AmmoType: amDEagle); Slot: 2; - TimeAfterTurn: 3000), + TimeAfterTurn: 3000; + minAngle: 0; + maxAngle: 0), (NameId: sidDynamite; Ammo: (Propz: ammoprop_NoCrosshair or ammoprop_AttackInJump or @@ -399,7 +450,9 @@ Timer: 0; AmmoType: amDynamite); Slot: 4; - TimeAfterTurn: 5000), + TimeAfterTurn: 5000; + minAngle: 0; + maxAngle: 0), (NameId: sidFirePunch; Ammo: (Propz: ammoprop_NoCrosshair or ammoprop_ForwMsgs or @@ -410,7 +463,9 @@ Timer: 0; AmmoType: amFirePunch); Slot: 3; - TimeAfterTurn: 3000), + TimeAfterTurn: 3000; + minAngle: 0; + maxAngle: 0), (NameId: sidBaseballBat; Ammo: (Propz: 0; Count: 1; @@ -418,7 +473,9 @@ Timer: 0; AmmoType: amBaseballBat); Slot: 3; - TimeAfterTurn: 5000), + TimeAfterTurn: 5000; + minAngle: 0; + maxAngle: 0), (NameId: sidParachute; Ammo: (Propz: ammoprop_ForwMsgs or ammoprop_AttackInJump or @@ -428,7 +485,9 @@ Timer: 0; AmmoType: amParachute); Slot: 7; - TimeAfterTurn: 0), + TimeAfterTurn: 0; + minAngle: 0; + maxAngle: 0), (NameId: sidAirAttack; Ammo: (Propz: ammoprop_NoCrosshair or ammoprop_NeedTarget or @@ -438,7 +497,9 @@ Timer: 0; AmmoType: amAirAttack); Slot: 5; - TimeAfterTurn: 0), + TimeAfterTurn: 0; + minAngle: 0; + maxAngle: 0), (NameId: sidMineStrike; Ammo: (Propz: ammoprop_NoCrosshair or ammoprop_NeedTarget or @@ -448,7 +509,9 @@ Timer: 0; AmmoType: amMineStrike); Slot: 5; - TimeAfterTurn: 0), + TimeAfterTurn: 0; + minAngle: 0; + maxAngle: 0), (NameId: sidBlowTorch; Ammo: (Propz: ammoprop_ForwMsgs; Count: 1; diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uFloat.pas --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hedgewars/uFloat.pas Sun Jan 21 19:51:02 2007 +0000 @@ -0,0 +1,276 @@ +(* + * Hedgewars, a Worms style game + * Copyright (c) 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 + *) + +unit uFloat; +interface + +{$IFDEF FPC} +{$ifdef FPC_LITTLE_ENDIAN} +type hwFloat = record + isNegative: boolean; + case byte of + 0: (Frac, Round: Longword); + 1: (QWordValue : QWord); + end; +{$else FPC_LITTLE_ENDIAN} +type hwFloat = record + isNegative: boolean; + case byte of + 0: (Round, Frac: Longword); + 1: (QWordValue : QWord); + end; +{$endif FPC_LITTLE_ENDIAN} + +operator := (i: LongInt) z : hwFloat; + +operator + (z1, z2: hwFloat) z : hwFloat; +operator - (z1, z2: hwFloat) z : hwFloat; +operator - (z1: hwFloat) z : hwFloat; + +operator * (z1, z2: hwFloat) z : hwFloat; +operator * (z1: hwFloat; z2: LongInt) z : hwFloat; +operator / (z1, z2: hwFloat) z : hwFloat; + +operator < (z1, z2: hwFloat) b : boolean; +operator > (z1, z2: hwFloat) b : boolean; + +function cstr(z: hwFloat): string; +function hwRound(t: hwFloat): integer; +function hwAbs(t: hwFloat): hwFloat; +function hwSqr(t: hwFloat): hwFloat; +function Distance(dx, dy: hwFloat): hwFloat; +function AngleSin(angle: Longword): hwFloat; +function AngleCos(angle: Longword): hwFloat; + +const _1div1024: hwFloat = (isNegative: false; QWordValue: 4194304); + _1div10000: hwFloat = (isNegative: false; QWordValue: 429496); + _1div50000: hwFloat = (isNegative: false; QWordValue: 85899); + _1div100000: hwFloat = (isNegative: false; QWordValue: 42950); + _1div3: hwFloat = (isNegative: false; QWordValue: 1431655766); + hwPi: hwFloat = (isNegative: false; QWordValue: 13493037704); + _0_000004: hwFloat = (isNegative: false; QWordValue: 17179); + _0_0002: hwFloat = (isNegative: false; QWordValue: 858993); + _0_001: hwFloat = (isNegative: false; QWordValue: 4294967); + _0_003: hwFloat = (isNegative: false; QWordValue: 12884902); + _0_004: hwFloat = (isNegative: false; QWordValue: 17179869); + _0_005: hwFloat = (isNegative: false; QWordValue: 21474836); + _0_01: hwFloat = (isNegative: false; QWordValue: 42949673); + _0_02: hwFloat = (isNegative: false; QWordValue: 85899345); + _0_03: hwFloat = (isNegative: false; QWordValue: 128849018); + _0_08: hwFloat = (isNegative: false; QWordValue: 343597383); + _0_1: hwFloat = (isNegative: false; QWordValue: 429496729); + _0_15: hwFloat = (isNegative: false; QWordValue: 644245094); + _0_2: hwFloat = (isNegative: false; QWordValue: 858993459); + _0_25: hwFloat = (isNegative: false; QWordValue: 1073741824); + _0_3: hwFloat = (isNegative: false; QWordValue: 1288490189); + _0_35: hwFloat = (isNegative: false; QWordValue: 1503238553); + _0_4: hwFloat = (isNegative: false; QWordValue: 1717986918); + _0_45: hwFloat = (isNegative: false; QWordValue: 1932735283); + _0_5: hwFloat = (isNegative: false; QWordValue: 2147483648); + _0_55: hwFloat = (isNegative: false; QWordValue: 2362232012); + _0_6: hwFloat = (isNegative: false; QWordValue: 2576980377); + _0_8: hwFloat = (isNegative: false; QWordValue: 3435973837); + _0_84: hwFloat = (isNegative: false; QWordValue: 3607772528); + _0_87: hwFloat = (isNegative: false; QWordValue: 3736621547); + _0_9: hwFloat = (isNegative: false; QWordValue: 3865470566); + _0_93: hwFloat = (isNegative: false; QWordValue: 3994319585); + _0_96: hwFloat = (isNegative: false; QWordValue: 4123168604); + _0_995: hwFloat = (isNegative: false; QWordValue: 4273492459); + _0_999: hwFloat = (isNegative: false; QWordValue: 4290672328); + _1_9: hwFloat = (isNegative: false; QWordValue: 8160437862); + + cLittle: hwFloat = (isNegative: false; QWordValue: 1); + cHHKick: hwFloat = (isNegative: false; QWordValue: 128849018); +{$ENDIF} + +{$IFNDEF FPC} +type hwFloat = Extended; +{$ENDIF} + +implementation +uses uConsts; + +{$IFDEF FPC} + +operator := (i: LongInt) z : hwFloat; +begin +z.isNegative:= i < 0; +z.Round:= abs(i); +z.Frac:= 0 +end; + +operator + (z1, z2: hwFloat) z : hwFloat; +begin +if z1.isNegative = z2.isNegative then + begin + z.isNegative:= z1.isNegative; + z.QWordValue:= z1.QWordValue + z2.QWordValue + end +else + if z1.QWordValue > z2.QWordValue then + begin + z.isNegative:= z1.isNegative; + z.QWordValue:= z1.QWordValue - z2.QWordValue + end else + begin + z.isNegative:= z2.isNegative; + z.QWordValue:= z2.QWordValue - z1.QWordValue + end +end; + +operator - (z1, z2: hwFloat) z : hwFloat; +begin +if z1.isNegative = z2.isNegative then + if z1.QWordValue > z2.QWordValue then + begin + z.isNegative:= z1.isNegative; + z.QWordValue:= z1.QWordValue - z2.QWordValue + end else + begin + z.isNegative:= not z2.isNegative; + z.QWordValue:= z2.QWordValue - z1.QWordValue + end +else begin + z.isNegative:= z1.isNegative; + z.QWordValue:= z1.QWordValue + z2.QWordValue + end +end; + +operator - (z1: hwFloat) z : hwFloat; +begin +z:= z1; +z.isNegative:= not z.isNegative +end; + + +operator * (z1, z2: hwFloat) z : hwFloat; +begin +z.isNegative:= z1.isNegative xor z2.isNegative; +z.QWordValue:= QWord(z1.Round) * z2.Frac + + QWord(z1.Frac) * z2.Round + + ((QWord(z1.Frac) * z2.Frac) shr 32); +z.Round:= z.Round + QWord(z1.Round) * z2.Round; +end; + +operator * (z1: hwFloat; z2: LongInt) z : hwFloat; +begin +z.isNegative:= z1.isNegative xor (z2 < 0); +z2:= abs(z2); +z.QWordValue:= z.QWordValue * z2 +end; + +operator / (z1, z2: hwFloat) z : hwFloat; +var t: hwFloat; +begin +z.isNegative:= z1.isNegative xor z2.isNegative; +z.Round:= z1.QWordValue div z2.QWordValue; +t:= z1 - z2 * z.Round; +if t.QWordValue = 0 then + z.Frac:= 0 +else + begin + while ((t.QWordValue and $8000000000000000) = 0) and + ((z2.QWordValue and $8000000000000000) = 0) do + begin + t.QWordValue:= t.QWordValue shl 1; + z2.QWordValue:= z2.QWordValue shl 1 + end; + z.Frac:= (t.QWordValue) div (z2.Round) + end +end; + +operator < (z1, z2: hwFloat) b : boolean; +begin +if z1.isNegative <> z2.isNegative then + b:= z1.isNegative +else + if z1.QWordValue = z2.QWordValue then + b:= false + else + b:= (z1.QWordValue < z2.QWordValue) xor z1.isNegative +end; + +operator > (z1, z2: hwFloat) b : boolean; +begin +if z1.isNegative <> z2.isNegative then + b:= z2.isNegative +else + if z1.QWordValue = z2.QWordValue then + b:= false + else + b:= (z1.QWordValue > z2.QWordValue) xor z2.isNegative +end; + +function cstr(z: hwFloat): string; +var tmpstr: string; +begin +str(z.Round, cstr); +if z.Frac <> 0 then + begin + str(z.Frac / $100000000:1:15, tmpstr); + delete(tmpstr, 1, 2); + cstr:= cstr + '.' + tmpstr + end; +if z.isNegative then cstr:= '-' + cstr +end; + +function hwRound(t: hwFloat): integer; +begin +if t.isNegative then hwRound:= -t.Round + else hwRound:= t.Round +end; + +function hwAbs(t: hwFloat): hwFloat; +begin +hwAbs:= t; +hwAbs.isNegative:= false +end; + +function hwSqr(t: hwFloat): hwFloat; +begin +hwSqr:= t * t +end; + +function Distance(dx, dy: hwFloat): hwFloat; +var x, y: hwFloat; + Result: hwFloat; +begin +x:= dx * dx; +y:= dy * dy; +Result:= x + y; +Result.QWordValue:= Round(sqrt(1.0 / 4294967296 * (Result.QWordValue)) * 4294967296); +Distance:= Result +end; + +function AngleSin(angle: Longword): hwFloat; +begin +AngleSin.isNegative:= false; +AngleSin:= Round(Sin(Angle * pi / cMaxAngle) * 4294967296) +end; + +function AngleCos(angle: Longword): hwFloat; +var CosVal: Extended; +begin +CosVal:= Cos(Angle * pi / cMaxAngle); +AngleCos.isNegative:= CosVal < 0; +AngleCos:= Round(Cosval * 4294967296) +end; + +{$ENDIF} + +end. diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uGame.pas --- a/hedgewars/uGame.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uGame.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,6 +18,7 @@ unit uGame; interface +uses uFloat; {$INCLUDE options.inc} procedure DoGameTick(Lag: integer); @@ -32,7 +33,7 @@ var i: integer; begin if isPaused then exit; -if not CurrentTeam.ExtDriven then +if not CurrentTeam^.ExtDriven then begin NetGetNextCmd; // its for the case when receiving "/say" message isInLag:= false; @@ -49,7 +50,7 @@ i:= 1; while (GameState <> gsExit) and (i <= Lag) do begin - if not CurrentTeam.ExtDriven then + if not CurrentTeam^.ExtDriven then begin with CurrentTeam^ do if Hedgehogs[CurrHedgehog].BotLevel <> 0 then ProcessBot(Frames); diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uGears.pas --- a/hedgewars/uGears.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uGears.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,7 +18,7 @@ unit uGears; interface -uses SDLh, uConsts; +uses SDLh, uConsts, uFloat; {$INCLUDE options.inc} const AllInactive: boolean = false; @@ -28,19 +28,19 @@ NextGear, PrevGear: PGear; Active: Boolean; State : Longword; - X : Double; - Y : Double; - dX: Double; - dY: Double; + X : hwFloat; + Y : hwFloat; + dX: hwFloat; + dY: hwFloat; Kind: TGearType; Pos: Longword; doStep: TGearStepProcedure; Radius: integer; Angle, Power : Longword; - DirAngle: Double; + DirAngle: hwFloat; Timer : LongWord; - Elasticity: Double; - Friction : Double; + Elasticity: hwFloat; + Friction : hwFloat; Message : Longword; Hedgehog: pointer; Health, Damage: integer; @@ -50,7 +50,7 @@ Z: Longword; end; -function AddGear(X, Y: integer; Kind: TGearType; State: Longword; const dX: Double=0.0; dY: Double=0.0; Timer: LongWord=0): PGear; +function AddGear(X, Y: integer; Kind: TGearType; State: Longword; dX, dY: hwFloat; Timer: LongWord): PGear; procedure ProcessGears; procedure SetAllToActive; procedure SetAllHHToActive; @@ -73,8 +73,8 @@ Count: Longword; HookAngle: integer; ar: array[0..300] of record - X, Y: Double; - dLen: Double; + X, Y: hwFloat; + dLen: hwFloat; b: boolean; end; end; @@ -95,35 +95,35 @@ {$INCLUDE HHHandlers.inc} const doStepHandlers: array[TGearType] of TGearStepProcedure = ( - doStepCloud, - doStepBomb, - doStepHedgehog, - doStepGrenade, - doStepHealthTag, - doStepGrave, - doStepUFO, - doStepShotgunShot, - doStepPickHammer, - doStepRope, - doStepSmokeTrace, - doStepExplosion, - doStepMine, - doStepCase, - doStepDEagleShot, - doStepDynamite, - doStepTeamHealthSorter, - doStepBomb, - doStepCluster, - doStepShover, - doStepFlame, - doStepFirePunch, - doStepActionTimer, - doStepActionTimer, - doStepActionTimer, - doStepParachute, - doStepAirAttack, - doStepAirBomb, - doStepBlowTorch + @doStepCloud, + @doStepBomb, + @doStepHedgehog, + @doStepGrenade, + @doStepHealthTag, + @doStepGrave, + @doStepUFO, + @doStepShotgunShot, + @doStepPickHammer, + @doStepRope, + @doStepSmokeTrace, + @doStepExplosion, + @doStepMine, + @doStepCase, + @doStepDEagleShot, + @doStepDynamite, + @doStepTeamHealthSorter, + @doStepBomb, + @doStepCluster, + @doStepShover, + @doStepFlame, + @doStepFirePunch, + @doStepActionTimer, + @doStepActionTimer, + @doStepActionTimer, + @doStepParachute, + @doStepAirAttack, + @doStepAirBomb, + @doStepBlowTorch ); procedure InsertGearToList(Gear: PGear); @@ -134,172 +134,174 @@ else begin // WARNING: this code assumes that the first gears added to the list are clouds (have maximal Z) tmp:= GearsList; - while (tmp <> nil) and (tmp.Z < Gear.Z) do - tmp:= tmp.NextGear; + while (tmp <> nil) and (tmp^.Z < Gear^.Z) do + tmp:= tmp^.NextGear; - if tmp.PrevGear <> nil then tmp.PrevGear.NextGear:= Gear; - Gear.PrevGear:= tmp.PrevGear; - tmp.PrevGear:= Gear; - Gear.NextGear:= tmp; + if tmp^.PrevGear <> nil then tmp^.PrevGear^.NextGear:= Gear; + Gear^.PrevGear:= tmp^.PrevGear; + tmp^.PrevGear:= Gear; + Gear^.NextGear:= tmp; if GearsList = tmp then GearsList:= Gear end end; procedure RemoveGearFromList(Gear: PGear); begin -if Gear.NextGear <> nil then Gear.NextGear.PrevGear:= Gear.PrevGear; -if Gear.PrevGear <> nil then Gear.PrevGear.NextGear:= Gear.NextGear +if Gear^.NextGear <> nil then Gear^.NextGear^.PrevGear:= Gear^.PrevGear; +if Gear^.PrevGear <> nil then Gear^.PrevGear^.NextGear:= Gear^.NextGear else begin - GearsList:= Gear.NextGear; - if GearsList <> nil then GearsList.PrevGear:= nil + GearsList:= Gear^.NextGear; + if GearsList <> nil then GearsList^.PrevGear:= nil end; end; -function AddGear(X, Y: integer; Kind: TGearType; State: Longword; const dX: Double=0.0; dY: Double=0.0; Timer: LongWord=0): PGear; +function AddGear(X, Y: integer; Kind: TGearType; State: Longword; dX, dY: hwFloat; Timer: LongWord): PGear; const Counter: Longword = 0; +var Result: PGear; begin inc(Counter); {$IFDEF DEBUGFILE}AddFileLog('AddGear: ('+inttostr(x)+','+inttostr(y)+'), d('+floattostr(dX)+','+floattostr(dY)+')');{$ENDIF} New(Result); {$IFDEF DEBUGFILE}AddFileLog('AddGear: type = '+inttostr(ord(Kind))+'; handle = '+inttostr(integer(Result)));{$ENDIF} FillChar(Result^, sizeof(TGear), 0); -Result.X:= X; -Result.Y:= Y; -Result.Kind := Kind; -Result.State:= State; -Result.Active:= true; -Result.dX:= dX; -Result.dY:= dY; -Result.doStep:= doStepHandlers[Kind]; -Result.CollIndex:= High(Longword); -Result.Timer:= Timer; +Result^.X:= X; +Result^.Y:= Y; +Result^.Kind := Kind; +Result^.State:= State; +Result^.Active:= true; +Result^.dX:= dX; +Result^.dY:= dY; +Result^.doStep:= doStepHandlers[Kind]; +Result^.CollIndex:= High(Longword); +Result^.Timer:= Timer; if CurrentTeam <> nil then - Result.Hedgehog:= @CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog]; + Result^.Hedgehog:= @(CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog]); case Kind of - gtCloud: Result.Z:= High(Result.Z); + gtCloud: Result^.Z:= High(Result^.Z); gtAmmo_Bomb: begin - Result.Radius:= 4; - Result.Elasticity:= 0.6; - Result.Friction:= 0.995; + Result^.Radius:= 4; + Result^.Elasticity:= _0_6; + Result^.Friction:= _0_995; end; gtHedgehog: begin - Result.Radius:= cHHRadius; - Result.Elasticity:= 0.35; - Result.Friction:= 0.999; - Result.Angle:= cMaxAngle div 2; - Result.Z:= cHHZ; + Result^.Radius:= cHHRadius; + Result^.Elasticity:= _0_35; + Result^.Friction:= _0_999; + Result^.Angle:= cMaxAngle div 2; + Result^.Z:= cHHZ; end; gtAmmo_Grenade: begin - Result.Radius:= 4; + Result^.Radius:= 4; end; gtHealthTag: begin - Result.Timer:= 1500; - Result.Z:= 2000; + Result^.Timer:= 1500; + Result^.Z:= 2000; end; gtGrave: begin - Result.Radius:= 10; - Result.Elasticity:= 0.6; + Result^.Radius:= 10; + Result^.Elasticity:= _0_6; end; gtUFO: begin - Result.Radius:= 5; - Result.Timer:= 500; - Result.Elasticity:= 0.9 + Result^.Radius:= 5; + Result^.Timer:= 500; + Result^.Elasticity:= _0_9 end; gtShotgunShot: begin - Result.Timer:= 900; - Result.Radius:= 2 + Result^.Timer:= 900; + Result^.Radius:= 2 end; gtPickHammer: begin - Result.Radius:= 10; - Result.Timer:= 4000 + Result^.Radius:= 10; + Result^.Timer:= 4000 end; gtSmokeTrace: begin - Result.X:= Result.X - 16; - Result.Y:= Result.Y - 16; - Result.State:= 8 + Result^.X:= Result^.X - 16; + Result^.Y:= Result^.Y - 16; + Result^.State:= 8 end; gtRope: begin - Result.Radius:= 3; - Result.Friction:= 500; + Result^.Radius:= 3; + Result^.Friction:= 500; RopePoints.Count:= 0; end; gtExplosion: begin - Result.X:= Result.X - 25; - Result.Y:= Result.Y - 25; + Result^.X:= Result^.X - 25; + Result^.Y:= Result^.Y - 25; end; gtMine: begin - Result.Radius:= 3; - Result.Elasticity:= 0.55; - Result.Friction:= 0.995; - Result.Timer:= 3000; + Result^.Radius:= 3; + Result^.Elasticity:= _0_55; + Result^.Friction:= _0_995; + Result^.Timer:= 3000; end; gtCase: begin - Result.Radius:= 16; - Result.Elasticity:= 0.4 + Result^.Radius:= 16; + Result^.Elasticity:= _0_4 end; gtDEagleShot: begin - Result.Radius:= 1; - Result.Radius:= 1; - Result.Health:= 50 + Result^.Radius:= 1; + Result^.Radius:= 1; + Result^.Health:= 50 end; gtDynamite: begin - Result.Radius:= 3; - Result.Elasticity:= 0.55; - Result.Friction:= 0.03; - Result.Timer:= 5000; + Result^.Radius:= 3; + Result^.Elasticity:= _0_55; + Result^.Friction:= _0_03; + Result^.Timer:= 5000; end; gtClusterBomb: begin - Result.Radius:= 4; - Result.Elasticity:= 0.6; - Result.Friction:= 0.995; + Result^.Radius:= 4; + Result^.Elasticity:= _0_6; + Result^.Friction:= _0_995; end; gtFlame: begin - Result.Angle:= Counter mod 64; - Result.Radius:= 1; - Result.Health:= 2; - Result.dY:= (getrandom - 0.8) * 0.03; - Result.dX:= (getrandom - 0.5) * 0.4 + Result^.Angle:= Counter mod 64; + Result^.Radius:= 1; + Result^.Health:= 2; + Result^.dY:= (getrandom - _0_8) * _0_03; + Result^.dX:= (getrandom - _0_5) * _0_4 end; gtFirePunch: begin - Result.Radius:= 15; - Result.Tag:= Y + Result^.Radius:= 15; + Result^.Tag:= Y end; gtAirBomb: begin - Result.Radius:= 10; + Result^.Radius:= 10; end; gtBlowTorch: begin - Result.Radius:= cHHRadius; - Result.Timer:= 7500; + Result^.Radius:= cHHRadius; + Result^.Timer:= 7500; end; end; -InsertGearToList(Result) +InsertGearToList(Result); +AddGear:= Result end; procedure DeleteGear(Gear: PGear); var team: PTeam; t: Longword; begin -if Gear.CollIndex < High(Longword) then DeleteCI(Gear); -if Gear.Surf <> nil then SDL_FreeSurface(Gear.Surf); -if Gear.Kind = gtHedgehog then +if Gear^.CollIndex < High(Longword) then DeleteCI(Gear); +if Gear^.Surf <> nil then SDL_FreeSurface(Gear^.Surf); +if Gear^.Kind = gtHedgehog then if CurAmmoGear <> nil then begin {$IFDEF DEBUGFILE}AddFileLog('DeleteGear: Sending gm_Destroy, hh handle = '+inttostr(integer(Gear)));{$ENDIF} - Gear.Message:= gm_Destroy; - CurAmmoGear.Message:= gm_Destroy; + Gear^.Message:= gm_Destroy; + CurAmmoGear^.Message:= gm_Destroy; exit end else begin - if Gear.Y >= cWaterLine then + if not (Gear^.Y < cWaterLine) then begin - t:= max(Gear.Damage, Gear.Health); - AddGear(Round(Gear.X), Round(Gear.Y), gtHealthTag, t).Hedgehog:= Gear.Hedgehog; + t:= max(Gear^.Damage, Gear^.Health); + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtHealthTag, t, 0, 0, 0)^.Hedgehog:= Gear^.Hedgehog; inc(StepDamage, t) end; - team:= PHedgehog(Gear.Hedgehog).Team; - if CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear = Gear then + team:= PHedgehog(Gear^.Hedgehog)^.Team; + if CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear = Gear then FreeActionsList; // to avoid ThinkThread on drawned gear - PHedgehog(Gear.Hedgehog).Gear:= nil; + PHedgehog(Gear^.Hedgehog)^.Gear:= nil; inc(KilledHHs); RecountTeamHealth(team); end; @@ -313,25 +315,25 @@ function CheckNoDamage: boolean; // returns TRUE in case of no damaged hhs var Gear: PGear; begin -Result:= true; +CheckNoDamage:= true; Gear:= GearsList; while Gear <> nil do begin - if Gear.Kind = gtHedgehog then - if Gear.Damage <> 0 then + if Gear^.Kind = gtHedgehog then + if Gear^.Damage <> 0 then begin - Result:= false; - inc(StepDamage, Gear.Damage); - if Gear.Health < Gear.Damage then Gear.Health:= 0 - else dec(Gear.Health, Gear.Damage); - AddGear(Round(Gear.X), round(Gear.Y) - cHHRadius - 12 - PHedgehog(Gear.Hedgehog)^.HealthTag.h, - gtHealthTag, Gear.Damage).Hedgehog:= Gear.Hedgehog; - RenderHealth(PHedgehog(Gear.Hedgehog)^); - RecountTeamHealth(PHedgehog(Gear.Hedgehog)^.Team); - - Gear.Damage:= 0 + CheckNoDamage:= false; + inc(StepDamage, Gear^.Damage); + if Gear^.Health < Gear^.Damage then Gear^.Health:= 0 + else dec(Gear^.Health, Gear^.Damage); + AddGear(hwRound(Gear^.X), hwRound(Gear^.Y) - cHHRadius - 12 - PHedgehog(Gear^.Hedgehog)^.HealthTag^.h, + gtHealthTag, Gear^.Damage, 0, 0, 0)^.Hedgehog:= Gear^.Hedgehog; + RenderHealth(PHedgehog(Gear^.Hedgehog)^); + RecountTeamHealth(PHedgehog(Gear^.Hedgehog)^.Team); + + Gear^.Damage:= 0 end; - Gear:= Gear.NextGear + Gear:= Gear^.NextGear end; end; @@ -360,8 +362,8 @@ while t<>nil do begin Gear:= t; - t:= Gear.NextGear; - if Gear.Active then Gear.doStep(Gear); + t:= Gear^.NextGear; + if Gear^.Active then Gear^.doStep(Gear); end; if AllInactive then @@ -375,19 +377,19 @@ end end; stChDmg: if CheckNoDamage then inc(step) else step:= stDelay; - stChWin: if not CheckForWin then inc(step) else step:= stDelay; + stChWin: if not CheckForWin then inc(step) else step:= stDelay; stSpawn: begin if not isInMultiShoot then SpawnBoxOfSmth; inc(step) end; stNTurn: begin - AwareOfExplosion(0, 0, 0); + //AwareOfExplosion(0, 0, 0); if isInMultiShoot then isInMultiShoot:= false else begin - with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do + with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do if MaxStepDamage < StepDamage then MaxStepDamage:= StepDamage; StepDamage:= 0; - ParseCommand('/nextturn'); + ParseCommand('/nextturn', true); end; step:= Low(step) end; @@ -395,10 +397,10 @@ if TurnTimeLeft > 0 then if CurrentTeam <> nil then - if CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear <> nil then - if ((CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear.State and gstAttacking) = 0) + if CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil then + if ((CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^.State and gstAttacking) = 0) and not isInMultiShoot then dec(TurnTimeLeft); - + inc(GameTicks); {$IFDEF COUNTTICKS} asm @@ -427,10 +429,10 @@ begin AllInactive:= false; t:= GearsList; -while t<>nil do +while t <> nil do begin - t.Active:= true; - t:= t.NextGear + t^.Active:= true; + t:= t^.NextGear end end; @@ -439,64 +441,64 @@ begin AllInactive:= false; t:= GearsList; -while t<>nil do +while t <> nil do begin - if t.Kind = gtHedgehog then t.Active:= true; - t:= t.NextGear + if t^.Kind = gtHedgehog then t^.Active:= true; + t:= t^.NextGear end end; procedure DrawHH(Gear: PGear; Surface: PSDL_Surface); var t: integer; begin -DrawHedgehog(Round(Gear.X) - 14 + WorldDx, Round(Gear.Y) - 18 + WorldDy, - hwSign(Gear.dX), 0, - PHedgehog(Gear.Hedgehog).visStepPos div 2, +DrawHedgehog(hwRound(Gear^.X) - 14 + WorldDx, hwRound(Gear^.Y) - 18 + WorldDy, + hwSign(Gear^.dX), 0, + PHedgehog(Gear^.Hedgehog)^.visStepPos div 2, Surface); -with PHedgehog(Gear.Hedgehog)^ do - if Gear.State = 0 then +with PHedgehog(Gear^.Hedgehog)^ do + if Gear^.State = 0 then begin - t:= round(Gear.Y) - cHHRadius - 10 + WorldDy; - dec(t, HealthTag.h + 2); - DrawCentered(round(Gear.X) + WorldDx, t, HealthTag, Surface); - dec(t, NameTag.h + 2); - DrawCentered(round(Gear.X) + WorldDx, t, NameTag, Surface); - dec(t, Team.NameTag.h + 2); - DrawCentered(round(Gear.X) + WorldDx, t, Team.NameTag, Surface) + t:= hwRound(Gear^.Y) - cHHRadius - 10 + WorldDy; + dec(t, HealthTag^.h + 2); + DrawCentered(hwRound(Gear^.X) + WorldDx, t, HealthTag, Surface); + dec(t, NameTag^.h + 2); + DrawCentered(hwRound(Gear^.X) + WorldDx, t, NameTag, Surface); + dec(t, Team^.NameTag^.h + 2); + DrawCentered(hwRound(Gear^.X) + WorldDx, t, Team^.NameTag, Surface) end else // Current hedgehog begin - if bShowFinger and ((Gear.State and gstHHDriven) <> 0) then - DrawSprite(sprFinger, round(Gear.X) - 16 + WorldDx, round(Gear.Y) - 64 + WorldDy, + if bShowFinger and ((Gear^.State and gstHHDriven) <> 0) then + DrawSprite(sprFinger, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 64 + WorldDy, GameTicks div 32 mod 16, Surface); - if (Gear.State and (gstMoving or gstDrowning or gstFalling)) = 0 then - if (Gear.State and gstHHThinking) <> 0 then - DrawGear(sQuestion, Round(Gear.X) - 10 + WorldDx, Round(Gear.Y) - cHHRadius - 34 + WorldDy, Surface) + if (Gear^.State and (gstMoving or gstDrowning or gstFalling)) = 0 then + if (Gear^.State and gstHHThinking) <> 0 then + DrawGear(sQuestion, hwRound(Gear^.X) - 10 + WorldDx, hwRound(Gear^.Y) - cHHRadius - 34 + WorldDy, Surface) else - if ShowCrosshair and ((Gear.State and gstAttacked) = 0) then - DrawSurfSprite(Round(Gear.X + hwSign(Gear.dX) * Sin(Gear.Angle*pi/cMaxAngle)*60) + WorldDx - 11, - Round(Gear.Y - Cos(Gear.Angle*pi/cMaxAngle)*60) + WorldDy - 12, - 24, (18 + hwSign(Gear.dX) * integer(((Gear.Angle * 72 div cMaxAngle) + 1) div 2) mod 18) mod 18, - Team.CrosshairSurf, Surface); + if ShowCrosshair and ((Gear^.State and gstAttacked) = 0) then + DrawSurfSprite(Round(hwRound(Gear^.X) + hwSign(Gear^.dX) * Sin(Gear^.Angle*pi/cMaxAngle)*60) + WorldDx - 11, + Round(hwRound(Gear^.Y) - Cos(Gear^.Angle*pi/cMaxAngle)*60) + WorldDy - 12, + 24, (18 + hwSign(Gear^.dX) * integer(((Gear^.Angle * 72 div cMaxAngle) + 1) div 2) mod 18) mod 18, + Team^.CrosshairSurf, Surface); end; end; procedure DrawGears(Surface: PSDL_Surface); var Gear: PGear; i: Longword; - roplen: Double; + roplen: hwFloat; procedure DrawRopeLine(X1, Y1, X2, Y2: integer); const nodlen = 5; var i, x, y: integer; - t, k, ladd: Double; + t, k, ladd: hwFloat; begin if (X1 = X2) and (Y1 = Y2) then begin - OutError('WARNING: zero length rope line!'); + OutError('WARNING: zero length rope line!', false); exit end; - if abs(X1 - X2) > abs(Y1 - Y2) then +{ if abs(X1 - X2) > abs(Y1 - Y2) then begin if X1 > X2 then begin @@ -555,21 +557,21 @@ t:= t + k; end; end - end; +} end; begin Gear:= GearsList; while Gear<>nil do begin - case Gear.Kind of - gtCloud: DrawSprite(sprCloud , Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, Gear.State, Surface); - gtAmmo_Bomb: DrawSprite(sprBomb , Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, trunc(Gear.DirAngle), Surface); + case Gear^.Kind of + gtCloud: DrawSprite(sprCloud , hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.State, Surface); + gtAmmo_Bomb: DrawSprite(sprBomb , hwRound(Gear^.X) - 8 + WorldDx, hwRound(Gear^.Y) - 8 + WorldDy, hwRound(Gear^.DirAngle), Surface); gtHedgehog: DrawHH(Gear, Surface); - gtAmmo_Grenade: DrawSprite(sprGrenade , Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, DxDy2Angle32(Gear.dY, Gear.dX), Surface); - gtHealthTag: if Gear.Surf <> nil then DrawCentered(Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, Gear.Surf, Surface); - gtGrave: DrawSpriteFromRect(PHedgehog(Gear.Hedgehog).Team.GraveRect, Round(Gear.X) + WorldDx - 16, Round(Gear.Y) + WorldDy - 16, 32, (GameTicks shr 7) and 7, Surface); - gtUFO: DrawSprite(sprUFO, Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, (GameTicks shr 7) mod 4, Surface); - gtSmokeTrace: if Gear.State < 8 then DrawSprite(sprSmokeTrace, Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, Gear.State, Surface); + gtAmmo_Grenade: DrawSprite(sprGrenade , hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, DxDy2Angle32(Gear^.dY.QWordValue, Gear^.dX.QWordValue), Surface); + gtHealthTag: if Gear^.Surf <> nil then DrawCentered(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Surf, Surface); + gtGrave: DrawSpriteFromRect(PHedgehog(Gear^.Hedgehog)^.Team^.GraveRect, hwRound(Gear^.X) + WorldDx - 16, hwRound(Gear^.Y) + WorldDy - 16, 32, (GameTicks shr 7) and 7, Surface); + gtUFO: DrawSprite(sprUFO, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, (GameTicks shr 7) mod 4, Surface); + gtSmokeTrace: if Gear^.State < 8 then DrawSprite(sprSmokeTrace, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.State, Surface); gtRope: begin roplen:= 0; if RopePoints.Count > 0 then @@ -577,38 +579,38 @@ i:= 0; while i < Pred(RopePoints.Count) do begin - DrawRopeLine(Round(RopePoints.ar[i].X) + WorldDx, Round(RopePoints.ar[i].Y) + WorldDy, - Round(RopePoints.ar[Succ(i)].X) + WorldDx, Round(RopePoints.ar[Succ(i)].Y) + WorldDy); + DrawRopeLine(hwRound(RopePoints.ar[i].X) + WorldDx, hwRound(RopePoints.ar[i].Y) + WorldDy, + hwRound(RopePoints.ar[Succ(i)].X) + WorldDx, hwRound(RopePoints.ar[Succ(i)].Y) + WorldDy); inc(i) end; - DrawRopeLine(Round(RopePoints.ar[i].X) + WorldDx, Round(RopePoints.ar[i].Y) + WorldDy, - Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy); - DrawRopeLine(Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, - Round(PHedgehog(Gear.Hedgehog).Gear.X) + WorldDx, Round(PHedgehog(Gear.Hedgehog).Gear.Y) + WorldDy); - DrawSprite(sprRopeHook, Round(RopePoints.ar[0].X) + WorldDx - 16, Round(RopePoints.ar[0].Y) + WorldDy - 16, RopePoints.HookAngle, Surface); + DrawRopeLine(hwRound(RopePoints.ar[i].X) + WorldDx, hwRound(RopePoints.ar[i].Y) + WorldDy, + hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy); + DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, + hwRound(PHedgehog(Gear^.Hedgehog)^.Gear^.X) + WorldDx, hwRound(PHedgehog(Gear^.Hedgehog)^.Gear^.Y) + WorldDy); + DrawSprite(sprRopeHook, hwRound(RopePoints.ar[0].X) + WorldDx - 16, hwRound(RopePoints.ar[0].Y) + WorldDy - 16, RopePoints.HookAngle, Surface); end else begin - DrawRopeLine(Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, - Round(PHedgehog(Gear.Hedgehog).Gear.X) + WorldDx, Round(PHedgehog(Gear.Hedgehog).Gear.Y) + WorldDy); - DrawSprite(sprRopeHook, Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, DxDy2Angle32(Gear.dY, Gear.dX), Surface); + DrawRopeLine(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, + hwRound(PHedgehog(Gear^.Hedgehog)^.Gear^.X) + WorldDx, hwRound(PHedgehog(Gear^.Hedgehog)^.Gear^.Y) + WorldDy); + DrawSprite(sprRopeHook, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, DxDy2Angle32(Gear^.dY.QWordValue, Gear^.dX.QWordValue), Surface); end; end; - gtExplosion: DrawSprite(sprExplosion50, Round(Gear.X) + WorldDx, Round(Gear.Y) + WorldDy, Gear.State, Surface); - gtMine: if ((Gear.State and gstAttacking) = 0)or((Gear.Timer and $3FF) < 420) - then DrawSprite(sprMineOff , Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, trunc(Gear.DirAngle), Surface) - else DrawSprite(sprMineOn , Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, trunc(Gear.DirAngle), Surface); - gtDynamite: DrawSprite2(sprDynamite, Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 25 + WorldDy, Gear.Tag and 1, Gear.Tag shr 1, Surface); - gtCase: case Gear.Pos of - posCaseAmmo : DrawSprite(sprCase, Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, 0, Surface); - posCaseHealth: DrawSprite(sprFAid, Round(Gear.X) - 24 + WorldDx, Round(Gear.Y) - 24 + WorldDy, (GameTicks shr 6) mod 13, Surface); + gtExplosion: DrawSprite(sprExplosion50, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.State, Surface); + gtMine: if ((Gear^.State and gstAttacking) = 0)or((Gear^.Timer and $3FF) < 420) + then DrawSprite(sprMineOff , hwRound(Gear^.X) - 8 + WorldDx, hwRound(Gear^.Y) - 8 + WorldDy, hwRound(Gear^.DirAngle), Surface) + else DrawSprite(sprMineOn , hwRound(Gear^.X) - 8 + WorldDx, hwRound(Gear^.Y) - 8 + WorldDy, hwRound(Gear^.DirAngle), Surface); + gtDynamite: DrawSprite2(sprDynamite, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 25 + WorldDy, Gear^.Tag and 1, Gear^.Tag shr 1, Surface); + gtCase: case Gear^.Pos of + posCaseAmmo : DrawSprite(sprCase, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, 0, Surface); + posCaseHealth: DrawSprite(sprFAid, hwRound(Gear^.X) - 24 + WorldDx, hwRound(Gear^.Y) - 24 + WorldDy, (GameTicks shr 6) mod 13, Surface); end; - gtClusterBomb: DrawSprite(sprClusterBomb, Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, trunc(Gear.DirAngle), Surface); - gtCluster: DrawSprite(sprClusterParticle, Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy, 0, Surface); - gtFlame: DrawSprite(sprFlame, Round(Gear.X) - 8 + WorldDx, Round(Gear.Y) - 8 + WorldDy,(GameTicks div 128 + Gear.Angle) mod 8, Surface); - gtAirBomb: DrawSprite(sprAirBomb , Round(Gear.X) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, DxDy2Angle32(Gear.dY, Gear.dX), Surface); - gtAirAttack: DrawSprite(sprAirplane, Round(Gear.X) - 60 + WorldDx, Round(Gear.Y) - 25 + WorldDy, 0, Surface); + gtClusterBomb: DrawSprite(sprClusterBomb, hwRound(Gear^.X) - 8 + WorldDx, hwRound(Gear^.Y) - 8 + WorldDy, hwRound(Gear^.DirAngle), Surface); + gtCluster: DrawSprite(sprClusterParticle, hwRound(Gear^.X) - 8 + WorldDx, hwRound(Gear^.Y) - 8 + WorldDy, 0, Surface); + gtFlame: DrawSprite(sprFlame, hwRound(Gear^.X) - 8 + WorldDx, hwRound(Gear^.Y) - 8 + WorldDy,(GameTicks div 128 + Gear^.Angle) mod 8, Surface); + gtAirBomb: DrawSprite(sprAirBomb , hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, DxDy2Angle32(Gear^.dY.QWordValue, Gear^.dX.QWordValue), Surface); + gtAirAttack: DrawSprite(sprAirplane, hwRound(Gear^.X) - 60 + WorldDx, hwRound(Gear^.Y) - 25 + WorldDy, 0, Surface); end; - Gear:= Gear.NextGear + Gear:= Gear^.NextGear end; end; @@ -620,7 +622,7 @@ while tt<>nil do begin t:= tt; - tt:= tt.NextGear; + tt:= tt^.NextGear; Dispose(t) end; end; @@ -631,7 +633,7 @@ AddGear(0, 0, gtATStartGame, 0, 0, 0, 2000); if (GameFlags and gfForts) = 0 then for i:= 0 to 3 do - FindPlace(AddGear(0, 0, gtMine, 0), false, 0, 2048); + FindPlace(AddGear(0, 0, gtMine, 0, 0, 0, 0), false, 0, 2048); end; procedure AddClouds; @@ -639,7 +641,8 @@ begin for i:= 0 to cCloudsNumber do AddGear( - cScreenWidth + i * ((cScreenWidth * 2 + 2304) div cCloudsNumber), -140, gtCloud, random(4), - (0.5-random)*0.1, ((i mod 2) * 2 - 1) * (0.005 + 0.015*random)) +// (0.5-random)*0.1, ((i mod 2) * 2 - 1) * (0.005 + 0.015*random), 0) + 0, 0, 0) end; procedure doMakeExplosion(X, Y, Radius: integer; Mask: LongWord); @@ -649,39 +652,39 @@ TargetPoint.X:= NoPointX; {$IFDEF DEBUGFILE}if Radius > 3 then AddFileLog('Explosion: at (' + inttostr(x) + ',' + inttostr(y) + ')');{$ENDIF} if (Mask and EXPLDontDraw) = 0 then DrawExplosion(X, Y, Radius); -if Radius = 50 then AddGear(X, Y, gtExplosion, 0); -if (Mask and EXPLAutoSound)<>0 then PlaySound(sndExplosion); +if Radius = 50 then AddGear(X, Y, gtExplosion, 0, 0, 0, 0); +if (Mask and EXPLAutoSound)<>0 then PlaySound(sndExplosion, false); if (Mask and EXPLAllDamageInRadius)=0 then Radius:= Radius shl 1; Gear:= GearsList; while Gear <> nil do begin - dmg:= Radius - Round(sqrt(sqr(Gear.X - X) + sqr(Gear.Y - Y))); + dmg:= Radius - hwRound(Distance(Gear^.X - X, Gear^.Y - Y)); if dmg > 0 then begin dmg:= dmg shr 1; - case Gear.Kind of + case Gear^.Kind of gtHedgehog, gtMine, gtCase, gtFlame: begin - if (Mask and EXPLNoDamage) = 0 then inc(Gear.Damage, dmg); - if ((Mask and EXPLDoNotTouchHH) = 0) or (Gear.Kind <> gtHedgehog) then + if (Mask and EXPLNoDamage) = 0 then inc(Gear^.Damage, dmg); + if ((Mask and EXPLDoNotTouchHH) = 0) or (Gear^.Kind <> gtHedgehog) then begin - Gear.dX:= Gear.dX + (dmg / 200 + cHHKick)* hwSign(Gear.X - X); - Gear.dY:= Gear.dY + (dmg / 200 + cHHKick)* hwSign(Gear.Y - Y); - Gear.Active:= true; + Gear^.dX:= Gear^.dX + (_0_005 * dmg + cHHKick)* hwSign(Gear^.X - X); + Gear^.dY:= Gear^.dY + (_0_005 * dmg + cHHKick)* hwSign(Gear^.Y - Y); + Gear^.Active:= true; FollowGear:= Gear end; end; gtGrave: begin - Gear.dY:= - dmg / 250; - Gear.Active:= true; + Gear^.dY:= - _0_004 * dmg; + Gear^.Active:= true; end; end; end; - Gear:= Gear.NextGear + Gear:= Gear^.NextGear end; -uAIMisc.AwareOfExplosion(0, 0, 0) +//uAIMisc.AwareOfExplosion(0, 0, 0) end; procedure AmmoShove(Ammo: PGear; Damage, Power: integer); @@ -690,23 +693,23 @@ hh: PHedgehog; begin t:= CheckGearsCollision(Ammo); -i:= t.Count; -hh:= Ammo.Hedgehog; +i:= t^.Count; +hh:= Ammo^.Hedgehog; while i > 0 do begin dec(i); - if (t.ar[i].State and gstNoDamage) = 0 then - case t.ar[i].Kind of + if (t^.ar[i]^.State and gstNoDamage) = 0 then + case t^.ar[i]^.Kind of gtHedgehog, gtMine, gtCase: begin - inc(t.ar[i].Damage, Damage); - inc(hh.DamageGiven, Damage); - t.ar[i].dX:= Ammo.dX * Power * 0.01; - t.ar[i].dY:= Ammo.dY * Power * 0.01; - t.ar[i].Active:= true; - DeleteCI(t.ar[i]); - FollowGear:= t.ar[i] + inc(t^.ar[i]^.Damage, Damage); + inc(hh^.DamageGiven, Damage); + t^.ar[i]^.dX:= Ammo^.dX * Power * _0_01; + t^.ar[i]^.dY:= Ammo^.dY * Power * _0_01; + t^.ar[i]^.Active:= true; + DeleteCI(t^.ar[i]); + FollowGear:= t^.ar[i] end; end end; @@ -722,12 +725,12 @@ while Team <> nil do begin for i:= 0 to cMaxHHIndex do - with Team.Hedgehogs[i] do + with Team^.Hedgehogs[i] do if Gear <> nil then if (GameFlags and gfForts) = 0 then FindPlace(Gear, false, 0, 2048) else FindPlace(Gear, false, t, t + 1024); inc(t, 1024); - Team:= Team.Next + Team:= Team^.Next end end; @@ -739,15 +742,12 @@ rY:= sqr(rY); while t <> nil do begin - if (t <> Gear) and (t.Kind = Kind) then - if sqr(Gear.X - t.X) / rX + sqr(Gear.Y - t.Y) / rY <= 1 then - begin - Result:= t; - exit - end; - t:= t.NextGear + if (t <> Gear) and (t^.Kind = Kind) then + if not((hwSqr(Gear^.X - t^.X) / rX + hwSqr(Gear^.Y - t^.Y) / rY) > 1) then + exit(t); + t:= t^.NextGear end; -Result:= nil +CheckGearNear:= nil end; procedure AmmoFlameWork(Ammo: PGear); @@ -756,17 +756,17 @@ t:= GearsList; while t <> nil do begin - if (t.Kind = gtHedgehog) and (t.Y < Ammo.Y) then - if sqr(Ammo.X - t.X) + sqr(Ammo.Y - t.Y - cHHRadius) * 2 <= sqr(4) then + if (t^.Kind = gtHedgehog) and (t^.Y < Ammo^.Y) then + if not (hwSqr(Ammo^.X - t^.X) + hwSqr(Ammo^.Y - t^.Y - cHHRadius) * 2 > 2) then begin - inc(t.Damage, 5); - t.dX:= t.dX + (t.X - Ammo.X) * 0.02; - t.dY:= - 0.25; - t.Active:= true; + inc(t^.Damage, 5); + t^.dX:= t^.dX + (t^.X - Ammo^.X) * _0_02; + t^.dY:= - _0_25; + t^.Active:= true; DeleteCI(t); FollowGear:= t end; - t:= t.NextGear + t:= t^.NextGear end; end; @@ -778,41 +778,40 @@ rY:= sqr(rY); while t <> nil do begin - if t.Kind in Kind then - if sqr(mX - t.X) / rX + sqr(mY - t.Y) / rY <= 1 then - begin - Result:= t; - exit - end; - t:= t.NextGear + if t^.Kind in Kind then + if not (hwSqr(mX - t^.X) / rX + hwSqr(mY - t^.Y) / rY > 1) then + exit(t); + t:= t^.NextGear end; -Result:= nil +CheckGearsNear:= nil end; function CountGears(Kind: TGearType): Longword; var t: PGear; + Result: Longword; begin Result:= 0; t:= GearsList; while t <> nil do begin - if t.Kind = Kind then inc(Result); - t:= t.NextGear + if t^.Kind = Kind then inc(Result); + t:= t^.NextGear end; +CountGears:= Result end; procedure SpawnBoxOfSmth; begin if (CountGears(gtCase) >= 5) or (getrandom(cCaseFactor) <> 0) then exit; -FollowGear:= AddGear(0, 0, gtCase, 0); +FollowGear:= AddGear(0, 0, gtCase, 0, 0, 0, 0); case getrandom(2) of 0: begin - FollowGear.Health:= 25; - FollowGear.Pos:= posCaseHealth + FollowGear^.Health:= 25; + FollowGear^.Pos:= posCaseHealth end; 1: begin - FollowGear.Pos:= posCaseAmmo; - FollowGear.State:= Longword(amMineStrike) + FollowGear^.Pos:= posCaseAmmo; + FollowGear^.State:= Longword(amMineStrike) end; end; FindPlace(FollowGear, true, 0, 2048) @@ -822,11 +821,13 @@ function CountNonZeroz(x, y, r: integer): integer; var i: integer; + Result: integer; begin Result:= 0; if (y and $FFFFFC00) <> 0 then exit; for i:= max(x - r, 0) to min(x + r, 2043) do - if Land[y, i] <> 0 then inc(Result) + if Land[y, i] <> 0 then inc(Result); + CountNonZeroz:= Result end; var fx, x: integer; @@ -839,26 +840,26 @@ delta:= 130; repeat repeat - inc(x, Gear.Radius); + inc(x, Gear^.Radius); if x > Right then x:= Left + (x mod (Right - left)); cnt:= 0; - y:= -Gear.Radius * 2; + y:= -Gear^.Radius * 2; while y < 1023 do begin repeat inc(y, 2); - until (y > 1023) or (CountNonZeroz(x, y, Gear.Radius - 1) = 0); + until (y > 1023) or (CountNonZeroz(x, y, Gear^.Radius - 1) = 0); sy:= y; repeat inc(y); - until (y > 1023) or (CountNonZeroz(x, y, Gear.Radius - 1) <> 0); - if (y - sy > Gear.Radius * 2) + until (y > 1023) or (CountNonZeroz(x, y, Gear^.Radius - 1) <> 0); + if (y - sy > Gear^.Radius * 2) and (y < 1023) - and (CheckGearsNear(x, y - Gear.Radius, [gtHedgehog, gtMine, gtCase], 110, 110) = nil) then + and (CheckGearsNear(x, y - Gear^.Radius, [gtHedgehog, gtMine, gtCase], 110, 110) = nil) then begin ar[cnt].X:= x; - if withFall then ar[cnt].Y:= sy + Gear.Radius - else ar[cnt].Y:= y - Gear.Radius; + if withFall then ar[cnt].Y:= sy + Gear^.Radius + else ar[cnt].Y:= y - Gear^.Radius; inc(cnt) end; inc(y, 80) @@ -866,8 +867,8 @@ if cnt > 0 then with ar[GetRandom(cnt)] do begin - Gear.X:= x; - Gear.Y:= y; + Gear^.X:= x; + Gear^.Y:= y; {$IFDEF DEBUGFILE} AddFileLog('Assigned Gear ' + inttostr(integer(Gear)) + ' coordinates (' + inttostr(x) + @@ -875,7 +876,7 @@ {$ENDIF} exit end - until (x - Gear.Radius < fx) and (x + Gear.Radius > fx); + until (x - Gear^.Radius < fx) and (x + Gear^.Radius > fx); dec(Delta, 20) until (Delta < 70); OutError('Couldn''t find place for Gear ' + inttostr(integer(Gear)), false); diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uIO.pas --- a/hedgewars/uIO.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uIO.pas Sun Jan 21 19:51:02 2007 +0000 @@ -77,7 +77,7 @@ case s[1] of '!': begin {$IFDEF DEBUGFILE}AddFileLog('Ping? Pong!');{$ENDIF}isPonged:= true; end; '?': SendIPC('!'); - 'e': ParseCommand(copy(s, 2, Length(s) - 1)); + 'e': ParseCommand(copy(s, 2, Length(s) - 1), true); 'E': OutError(copy(s, 2, Length(s) - 1), true); 'W': OutError(copy(s, 2, Length(s) - 1), false); 'T': case s[2] of @@ -101,12 +101,12 @@ buf: array[0..255] of byte; s: shortstring absolute buf; begin -fds.numsockets:= 0; +fds^.numsockets:= 0; SDLNet_AddSocket(fds, IPCSock); while SDLNet_CheckSockets(fds, 0) > 0 do begin - i:= SDLNet_TCP_Recv(IPCSock, @buf[1], 255); + i:= SDLNet_TCP_Recv(IPCSock, @buf[1], 255 - Length(ss)); if i > 0 then begin buf[0]:= i; @@ -175,7 +175,7 @@ AddCaption('> ' + copy(extcmd[cmdcurpos].str, 2, Pred(extcmd[cmdcurpos].len)), $FFFFFF, capgrpNetSay); inc(cmdcurpos) end; - + if cmdcurpos <= cmdendpos then TryDo(GameTicks <= extcmd[cmdcurpos].Time, 'oops, queue error. in buffer: ' + extcmd[cmdcurpos].cmd + @@ -187,20 +187,20 @@ while (cmdcurpos <= cmdendpos)and(GameTicks = extcmd[cmdcurpos].Time) do begin case extcmd[cmdcurpos].cmd of - 'L': ParseCommand('+left'); - 'l': ParseCommand('-left'); - 'R': ParseCommand('+right'); - 'r': ParseCommand('-right'); - 'U': ParseCommand('+up'); - 'u': ParseCommand('-up'); - 'D': ParseCommand('+down'); - 'd': ParseCommand('-down'); - 'A': ParseCommand('+attack'); - 'a': ParseCommand('-attack'); - 'S': ParseCommand('switch'); - 'j': ParseCommand('ljump'); - 'J': ParseCommand('hjump'); - ',': ParseCommand('skip'); + 'L': ParseCommand('+left', true); + 'l': ParseCommand('-left', true); + 'R': ParseCommand('+right', true); + 'r': ParseCommand('-right', true); + 'U': ParseCommand('+up', true); + 'u': ParseCommand('-up', true); + 'D': ParseCommand('+down', true); + 'd': ParseCommand('-down', true); + 'A': ParseCommand('+attack', true); + 'a': ParseCommand('-attack', true); + 'S': ParseCommand('switch', true); + 'j': ParseCommand('ljump', true); + 'J': ParseCommand('hjump', true); + ',': ParseCommand('skip', true); 'N': begin tmpflag:= false; {$IFDEF DEBUGFILE}AddFileLog('got cmd "N": time '+inttostr(extcmd[cmdcurpos].Time)){$ENDIF} @@ -208,14 +208,14 @@ 'p': begin TargetPoint.X:= SDLNet_Read16(@extcmd[cmdcurpos].X); TargetPoint.Y:= SDLNet_Read16(@extcmd[cmdcurpos].Y); - ParseCommand('put') + ParseCommand('put', true) end; 'P': begin CursorPoint.X:= SDLNet_Read16(@extcmd[cmdcurpos].X) + WorldDx; CursorPoint.Y:= SDLNet_Read16(@extcmd[cmdcurpos].Y) + WorldDy; end; - '1'..'5': ParseCommand('timer ' + extcmd[cmdcurpos].cmd); - #128..char(128 + cMaxSlotIndex): ParseCommand('slot ' + char(byte(extcmd[cmdcurpos].cmd) - 79)) + '1'..'5': ParseCommand('timer ' + extcmd[cmdcurpos].cmd, true); + #128..char(128 + cMaxSlotIndex): ParseCommand('slot ' + char(byte(extcmd[cmdcurpos].cmd) - 79), true) end; inc(cmdcurpos) end; diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uKeys.pas --- a/hedgewars/uKeys.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uKeys.pas Sun Jan 21 19:51:02 2007 +0000 @@ -43,9 +43,11 @@ DefaultBinds, CurrentBinds: TBinds; function KeyNameToCode(name: string): word; +var Result: Word; begin Result:= cKeyMaxIndex; -while (Result > 0) and (KeyNames[Result] <> name) do dec(Result) +while (Result > 0) and (KeyNames[Result] <> name) do dec(Result); +KeyNameToCode:= Result end; procedure ProcessKbd; @@ -56,8 +58,8 @@ begin KbdKeyPressed:= false; Trusted:= (CurrentTeam <> nil) - and (not CurrentTeam.ExtDriven) - and (CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].BotLevel = 0); + and (not CurrentTeam^.ExtDriven) + and (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].BotLevel = 0); pkbd:= SDL_GetKeyState(nil); i:= SDL_GetMouseState(nil, nil); @@ -75,7 +77,7 @@ begin s:= CurrentBinds[i]; s[1]:= '-'; - ParseCommand(s) + ParseCommand(s, true) end; end else if (tkbd[i] = 0) and (pkbd^[i] <> 0) then ParseCommand(CurrentBinds[i], Trusted); diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uLand.pas --- a/hedgewars/uLand.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uLand.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,7 +18,7 @@ unit uLand; interface -uses SDLh, uLandTemplates; +uses SDLh, uLandTemplates, uFloat; {$include options.inc} type TLandArray = packed array[0..1023, 0..2047] of LongWord; TPreview = packed array[0..127, 0..31] of byte; @@ -57,71 +57,72 @@ procedure DrawBezierEdge(var pa: TPixAr; Color: Longword); var x, y, i: integer; - tx, ty, vx, vy, vlen, t: Double; - r1, r2, r3, r4: Double; - x1, y1, x2, y2, cx1, cy1, cx2, cy2, tsq, tcb: Double; + tx, ty, vx, vy, vlen, t: hwFloat; + r1, r2, r3, r4: hwFloat; + x1, y1, x2, y2, cx1, cy1, cx2, cy2, tsq, tcb: hwFloat; begin vx:= 0; vy:= 0; with pa do for i:= 0 to Count-2 do begin - vlen:= sqrt(sqr(ar[i + 1].x - ar[i ].X) + sqr(ar[i + 1].y - ar[i ].y)); - t:= sqrt(sqr(ar[i + 1].x - ar[i + 2].X) + sqr(ar[i + 1].y - ar[i + 2].y)); + vlen:= Distance(ar[i + 1].x - ar[i].X, ar[i + 1].y - ar[i].y); + t:= Distance(ar[i + 1].x - ar[i + 2].X,ar[i + 1].y - ar[i + 2].y); if t nil, true); -SDL_SetColorKey(tmpsurf, SDL_SRCCOLORKEY, SDL_MapRGB(tmpsurf.format, $FF, $FF, $FF)); +SDL_SetColorKey(tmpsurf, SDL_SRCCOLORKEY, SDL_MapRGB(tmpsurf^.format, $FF, $FF, $FF)); SDL_UpperBlit(tmpsurf, nil, Surface, nil); SDL_FreeSurface(tmpsurf) end; @@ -279,7 +283,7 @@ r, rr: TSDL_Rect; x, yd, yu: integer; begin -tmpsurf:= LoadImage(Pathz[ptCurrTheme] + '/Border', false); +tmpsurf:= LoadImage(Pathz[ptCurrTheme] + '/Border', false, true, true); for x:= 0 to 2047 do begin yd:= 1023; @@ -295,7 +299,7 @@ begin rr.x:= x; rr.y:= yd - 15; - r.x:= x mod tmpsurf.w; + r.x:= x mod tmpsurf^.w; r.y:= 16; r.w:= 1; r.h:= 16; @@ -305,7 +309,7 @@ begin rr.x:= x; rr.y:= yu; - r.x:= x mod tmpsurf.w; + r.x:= x mod tmpsurf^.w; r.y:= 0; r.w:= 1; r.h:= min(16, yd - yu + 1); @@ -316,38 +320,35 @@ end; end; -function rndSign(num: Double): Double; -begin -if getrandom(2) = 0 then Result:= num - else Result:= - num -end; - - procedure PointWave(var Template: TEdgeTemplate; var pa: TPixAr); const MAXPASSES = 32; -var ar: array[0..MAXPASSES, 0..9] of Double; +var ar: array[0..MAXPASSES, 0..9] of hwFloat; i, k: integer; - rx, ry, ox, oy: Double; + rx, ry, ox, oy: hwFloat; PassesNum: Longword; begin with Template do begin PassesNum:= PassMin + getrandom(PassDelta); TryDo(PassesNum < MAXPASSES, 'Passes number too big', true); - ar[0, 1]:= WaveFreqMin; - ar[0, 4]:= WaveFreqMin; + ar[0, 1]:= WaveFreqMin * _1div10000; + ar[0, 4]:= WaveFreqMin * _1div10000; for i:= 1 to PassesNum do // initialize random parameters begin ar[i, 0]:= WaveAmplMin + getrandom * WaveAmplDelta; - ar[i, 1]:= ar[i - 1, 1] + (getrandom * 0.7 + 0.3) * WaveFreqDelta; - ar[i, 2]:= getrandom * pi * 2; +// ar[i, 1]:= ar[i - 1, 1] + (getrandom * 0.7 + 0.3) * WaveFreqDelta; + ar[i, 1]:= ar[i - 1, 1] + (getrandom) * WaveFreqDelta; + ar[i, 2]:= getrandom * hwPi * 2; ar[i, 3]:= WaveAmplMin + getrandom * WaveAmplDelta; - ar[i, 4]:= ar[i - 1, 4] + (getrandom * 0.7 + 0.3) * WaveFreqDelta; - ar[i, 5]:= getrandom * pi * 2; +// ar[i, 4]:= ar[i - 1, 4] + (getrandom * 0.7 + 0.3) * WaveFreqDelta; + ar[i, 4]:= ar[i - 1, 4] + (getrandom) * WaveFreqDelta; + ar[i, 5]:= getrandom * hwPi * 2; ar[i, 6]:= ar[i, 1] * (getrandom * 2 - 1); - ar[i, 7]:= ar[i, 1] * rndSign(sqrt(1 - sqr(ar[i, 6]))); +// ar[i, 7]:= ar[i, 1] * rndSign(sqrt(1 - sqr(ar[i, 6]))); + ar[i, 7]:= ar[i, 1] * rndSign((1 - (ar[i, 6]))); ar[i, 8]:= ar[i, 4] * (getrandom * 2 - 1); - ar[i, 9]:= ar[i, 4] * rndSign(sqrt(1 - sqr(ar[i, 8]))); +// ar[i, 9]:= ar[i, 4] * rndSign(sqrt(1 - sqr(ar[i, 8]))); + ar[i, 9]:= ar[i, 4] * rndSign((1 - (ar[i, 8]))); end; end; @@ -359,17 +360,17 @@ begin ox:= rx; oy:= ry; - ry:= ry + ar[i, 0] * sin(ox * ar[i, 6] + oy * ar[i, 7] + ar[i, 2]); - rx:= rx + ar[i, 3] * sin(ox * ar[i, 8] + oy * ar[i, 9] + ar[i, 5]); +// ry:= ry; + ar[i, 0] * sin(ox * ar[i, 6] + oy * ar[i, 7] + ar[i, 2]); +// rx:= rx + ar[i, 3] * sin(ox * ar[i, 8] + oy * ar[i, 9] + ar[i, 5]); end; - pa.ar[k].x:= round(rx); - pa.ar[k].y:= round(ry); + pa.ar[k].x:= hwRound(rx); + pa.ar[k].y:= hwRound(ry); end; end; procedure NormalizePoints(var pa: TPixAr); const brd = 32; -var isUP: boolean; // HACK: transform for Y should be exact as one for X +var isUP: boolean; // HACK: transform for Y should be exact as one for X Left, Right, Top, Bottom, OWidth, Width, OHeight, Height, OLeft: integer; @@ -449,8 +450,8 @@ for i:= 0 to pred(pa.Count) do pa.ar[i]:= BasePoints^[i]; - for i:= 1 to BezPassCnt do - BezierizeEdge(pa, 0.33333334); +// for i:= 1 to BezPassCnt do + BezierizeEdge(pa, _1div3); PointWave(Template, pa); NormalizePoints(pa); @@ -466,7 +467,7 @@ function SelectTemplate: integer; begin -Result:= getrandom(Succ(High(EdgeTemplates))) +SelectTemplate:= getrandom(Succ(High(EdgeTemplates))) end; procedure GenLandSurface; @@ -506,15 +507,15 @@ with PixelFormat^ do LandSurface:= SDL_CreateRGBSurface(SDL_HWSURFACE, 2048, 1024, BitsPerPixel, RMask, GMask, BMask, AMask); SDL_FillRect(LandSurface, nil, 0); -tmpsurf:= LoadImage(Pathz[ptForts] + '/' + p.FortName + 'L', false); +tmpsurf:= LoadImage(Pathz[ptForts] + '/' + p^.FortName + 'L', false, true, true); BlitImageAndGenerateCollisionInfo(0, 0, tmpsurf, LandSurface); SDL_FreeSurface(tmpsurf); -p:= p.Next; +p:= p^.Next; TryDo(p <> nil, 'Only one team on map!', true); -tmpsurf:= LoadImage(Pathz[ptForts] + '/' + p.FortName + 'R', false); +tmpsurf:= LoadImage(Pathz[ptForts] + '/' + p^.FortName + 'R', false, true, true); BlitImageAndGenerateCollisionInfo(1024, 0, tmpsurf, LandSurface); SDL_FreeSurface(tmpsurf); -p:= p.Next; +p:= p^.Next; TryDo(p = nil, 'More than 2 teams on map in forts mode!', true); end; @@ -524,36 +525,37 @@ begin WriteLnToConsole('Loading land from file...'); AddProgress; -LandSurface:= LoadImage(Pathz[ptMapCurrent] + '/map', false); -TryDo((LandSurface.w = 2048) and (LandSurface.h = 1024), 'Map dimensions should be 2048x1024!', true); +LandSurface:= LoadImage(Pathz[ptMapCurrent] + '/map', false, true, true); +TryDo((LandSurface^.w = 2048) and (LandSurface^.h = 1024), 'Map dimensions should be 2048x1024!', true); if SDL_MustLock(LandSurface) then SDLTry(SDL_LockSurface(LandSurface) >= 0, true); -p:= LandSurface.pixels; -case LandSurface.format.BytesPerPixel of +p:= LandSurface^.pixels; +case LandSurface^.format^.BytesPerPixel of 1: OutError('We don''t work with 8 bit surfaces', true); 2: for y:= 0 to 1023 do begin for x:= 0 to 2047 do - if PWord(@p[x * 2])^ <> 0 then Land[y, x]:= COLOR_LAND; - p:= @p[LandSurface.pitch]; + if PWord(@(p^[x * 2]))^ <> 0 then Land[y, x]:= COLOR_LAND; + p:= @(p^[LandSurface^.pitch]); end; 3: for y:= 0 to 1023 do begin for x:= 0 to 2047 do - if (p[x * 3 + 0] <> 0) - or (p[x * 3 + 1] <> 0) - or (p[x * 3 + 2] <> 0) then Land[y, x]:= COLOR_LAND; - p:= @p[LandSurface.pitch]; + if (p^[x * 3 + 0] <> 0) + or (p^[x * 3 + 1] <> 0) + or (p^[x * 3 + 2] <> 0) then Land[y, x]:= COLOR_LAND; + p:= @(p^[LandSurface^.pitch]); end; 4: for y:= 0 to 1023 do begin for x:= 0 to 2047 do - if PLongword(@p[x * 4])^ <> 0 then Land[y, x]:= COLOR_LAND; - p:= @p[LandSurface.pitch]; + if PLongword(@(p^[x * 4]))^ <> 0 then Land[y, x]:= COLOR_LAND; + p:= @(p^[LandSurface^.pitch]); end; end; + if SDL_MustLock(LandSurface) then SDL_UnlockSurface(LandSurface); end; @@ -584,7 +586,7 @@ for yy:= y * 8 to y * 8 + 7 do for xx:= x * 64 + bit * 8 to x * 64 + bit * 8 + 7 do if Land[yy, xx] <> 0 then inc(t); - if t > 8 then Preview[y, x]:= Preview[y, x] or ($80 shr bit) + if t > 8 then Preview[y, x]:= Preview[y, x] or ($80 shr bit) end end end; diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uLandGraphics.pas --- a/hedgewars/uLandGraphics.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uLandGraphics.pas Sun Jan 21 19:51:02 2007 +0000 @@ -1,5 +1,6 @@ unit uLandGraphics; interface +uses uFloat; {$INCLUDE options.inc} type PRangeArray = ^TRangeArray; @@ -9,7 +10,7 @@ procedure DrawExplosion(X, Y, Radius: integer); procedure DrawHLinesExplosions(ar: PRangeArray; Radius: integer; y, dY: integer; Count: Byte); -procedure DrawTunnel(X, Y, dX, dY: Double; ticks, HalfWidth: integer); +procedure DrawTunnel(X, Y, dX, dY: hwFloat; ticks, HalfWidth: integer); procedure FillRoundInLand(X, Y, Radius: integer; Value: Longword); implementation @@ -51,32 +52,32 @@ procedure ClearLandPixel(y, x: integer); var p: PByteArray; begin -p:= @PByteArray(LandSurface.pixels)^[LandSurface.pitch*y]; -case LandSurface.format.BytesPerPixel of +p:= @PByteArray(LandSurface^.pixels)^[LandSurface^.pitch * y]; +case LandSurface^.format^.BytesPerPixel of 1: ;// not supported - 2: PWord(@p[x * 2])^:= 0; + 2: PWord(@(p^[x * 2]))^:= 0; 3: begin - p[x * 3 + 0]:= 0; - p[x * 3 + 1]:= 0; - p[x * 3 + 2]:= 0; + p^[x * 3 + 0]:= 0; + p^[x * 3 + 1]:= 0; + p^[x * 3 + 2]:= 0; end; - 4: PLongword(@p[x * 4])^:= 0; + 4: PLongword(@(p^[x * 4]))^:= 0; end end; procedure SetLandPixel(y, x: integer); var p: PByteArray; begin -p:= @PByteArray(LandSurface.pixels)^[LandSurface.pitch*y]; -case LandSurface.format.BytesPerPixel of +p:= @PByteArray(LandSurface^.pixels)^[LandSurface^.pitch * y]; +case LandSurface^.format^.BytesPerPixel of 1: ;// not supported - 2: PWord(@p[x * 2])^:= cExplosionBorderColor; + 2: PWord(@(p^[x * 2]))^:= cExplosionBorderColor; 3: begin - p[x * 3 + 0]:= cExplosionBorderColor and $FF; - p[x * 3 + 1]:= (cExplosionBorderColor shr 8) and $FF; - p[x * 3 + 2]:= cExplosionBorderColor shr 16; + p^[x * 3 + 0]:= cExplosionBorderColor and $FF; + p^[x * 3 + 1]:= (cExplosionBorderColor shr 8) and $FF; + p^[x * 3 + 2]:= cExplosionBorderColor shr 16; end; - 4: PLongword(@p[x * 4])^:= cExplosionBorderColor; + 4: PLongword(@(p^[x * 4]))^:= cExplosionBorderColor; end end; @@ -148,8 +149,8 @@ end; inc(dx) end; - if (dx = dy) then FillLandCircleLinesEBC(x, y, dx, dy); - + if (dx = dy) then FillLandCircleLinesEBC(x, y, dx, dy); + if SDL_MustLock(LandSurface) then SDL_UnlockSurface(LandSurface); end; @@ -163,18 +164,18 @@ for i:= 0 to Pred(Count) do begin for ty:= max(y - Radius, 0) to min(y + Radius, 1023) do - for tx:= max(0, ar[i].Left - Radius) to min(2047, ar[i].Right + Radius) do + for tx:= max(0, ar^[i].Left - Radius) to min(2047, ar^[i].Right + Radius) do ClearLandPixel(ty, tx); inc(y, dY) end; inc(Radius, 4); -dec(y, Count*dY); +dec(y, Count * dY); for i:= 0 to Pred(Count) do begin for ty:= max(y - Radius, 0) to min(y + Radius, 1023) do - for tx:= max(0, ar[i].Left - Radius) to min(2047, ar[i].Right + Radius) do + for tx:= max(0, ar^[i].Left - Radius) to min(2047, ar^[i].Right + Radius) do if Land[ty, tx] = $FFFFFF then SetLandPixel(ty, tx); inc(y, dY) @@ -187,8 +188,8 @@ // // - (dX, dY) - direction, vector of length = 0.5 // -procedure DrawTunnel(X, Y, dX, dY: Double; ticks, HalfWidth: integer); -var nx, ny: Double; +procedure DrawTunnel(X, Y, dX, dY: hwFloat; ticks, HalfWidth: integer); +var nx, ny: hwFloat; i, t, tx, ty: Longint; begin // (-dY, dX) is (dX, dY) rotated by PI/2 if SDL_MustLock(LandSurface) then @@ -219,8 +220,8 @@ begin X:= X + dX; Y:= Y + dY; - tx:= round(X); - ty:= round(Y); + tx:= hwRound(X); + ty:= hwRound(Y); if ((ty and $FFFFFC00) = 0) and ((tx and $FFFFF800) = 0) then begin Land[ty, tx]:= 0; diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uLandObjects.pas --- a/hedgewars/uLandObjects.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uLandObjects.pas Sun Jan 21 19:51:02 2007 +0000 @@ -71,30 +71,30 @@ if SDL_MustLock(Image) then SDLTry(SDL_LockSurface(Image) >= 0, true); -bpp:= Image.format.BytesPerPixel; +bpp:= Image^.format^.BytesPerPixel; WriteToConsole('('+inttostr(bpp)+') '); -p:= Image.pixels; +p:= Image^.pixels; case bpp of 1: OutError('We don''t work with 8 bit surfaces', true); - 2: for y:= 0 to Pred(Image.h) do + 2: for y:= 0 to Pred(Image^.h) do begin - for x:= 0 to Pred(Image.w) do - if PWord(@p[x * 2])^ <> 0 then Land[cpY + y, cpX + x]:= COLOR_LAND; - p:= @p[Image.pitch]; + for x:= 0 to Pred(Image^.w) do + if PWord(@(p^[x * 2]))^ <> 0 then Land[cpY + y, cpX + x]:= COLOR_LAND; + p:= @(p^[Image^.pitch]); end; - 3: for y:= 0 to Pred(Image.h) do + 3: for y:= 0 to Pred(Image^.h) do begin - for x:= 0 to Pred(Image.w) do - if (p[x * 3 + 0] <> 0) - or (p[x * 3 + 1] <> 0) - or (p[x * 3 + 2] <> 0) then Land[cpY + y, cpX + x]:= COLOR_LAND; - p:= @p[Image.pitch]; + for x:= 0 to Pred(Image^.w) do + if (p^[x * 3 + 0] <> 0) + or (p^[x * 3 + 1] <> 0) + or (p^[x * 3 + 2] <> 0) then Land[cpY + y, cpX + x]:= COLOR_LAND; + p:= @(p^[Image^.pitch]); end; - 4: for y:= 0 to Pred(Image.h) do + 4: for y:= 0 to Pred(Image^.h) do begin - for x:= 0 to Pred(Image.w) do - if PLongword(@p[x * 4])^ <> 0 then Land[cpY + y, cpX + x]:= COLOR_LAND; - p:= @p[Image.pitch]; + for x:= 0 to Pred(Image^.w) do + if PLongword(@(p^[x * 4]))^ <> 0 then Land[cpY + y, cpX + x]:= COLOR_LAND; + p:= @(p^[Image^.pitch]); end; end; if SDL_MustLock(Image) then @@ -104,7 +104,7 @@ procedure AddRect(x1, y1, w1, h1: integer); begin -with Rects[RectCount] do +with Rects^[RectCount] do begin x:= x1; y:= y1; @@ -128,29 +128,34 @@ function CheckIntersect(x1, y1, w1, h1: integer): boolean; var i: Longword; + Result: boolean; begin Result:= false; i:= 0; if RectCount > 0 then repeat - with Rects[i] do + with Rects^[i] do Result:= (x < x1 + w1) and (x1 < x + w) and (y < y1 + h1) and (y1 < y + h); inc(i) - until (i = RectCount) or (Result) + until (i = RectCount) or (Result); +CheckIntersect:= Result end; function AddGirder(gX: integer; Surface: PSDL_Surface): boolean; var tmpsurf: PSDL_Surface; x1, x2, y, k, i: integer; r, rr: TSDL_Rect; + Result: boolean; function CountNonZeroz(x, y: integer): Longword; var i: integer; + Result: Longword; begin Result:= 0; for i:= y to y + 15 do - if Land[i, x] <> 0 then inc(Result) + if Land[i, x] <> 0 then inc(Result); + CountNonZeroz:= Result end; begin @@ -182,7 +187,7 @@ if x1 > 0 then begin Result:= true; - tmpsurf:= LoadImage(Pathz[ptGraphics] + '/Girder', false); + tmpsurf:= LoadImage(Pathz[ptGraphics] + '/Girder', false, true, true); rr.x:= x1; rr.y:= y; while rr.x + 100 < x2 do @@ -199,11 +204,13 @@ AddRect(x1 - 8, y - 32, x2 - x1 + 16, 80); for k:= y to y + 15 do for i:= x1 to x2 do Land[k, i]:= $FFFFFF - end else Result:= false + end else Result:= false; +AddGirder:= Result end; function CheckLand(rect: TSDL_Rect; dX, dY, Color: Longword): boolean; var i: Longword; + Result: boolean; begin Result:= true; inc(rect.x, dX); @@ -222,10 +229,12 @@ inc(i) end; {$WARNINGS ON} +CheckLand:= Result end; function CheckCanPlace(x, y: Longword; var Obj: TThemeObject): boolean; var i: Longword; + Result: boolean; begin with Obj do if CheckLand(inland, x, y, $FFFFFF) then @@ -240,7 +249,8 @@ if Result then Result:= not CheckIntersect(x, y, Width, Height) end else - Result:= false + Result:= false; +CheckCanPlace:= Result end; function TryPut(var Obj: TThemeObject; Surface: PSDL_Surface): boolean; overload; @@ -248,15 +258,13 @@ var x, y: Longword; ar: array[0..MaxPointsIndex] of TPoint; cnt, i: Longword; + Result: boolean; begin cnt:= 0; with Obj do begin if Maxcnt = 0 then - begin - Result:= false; - exit - end; + exit(false); x:= 0; repeat y:= 0; @@ -284,7 +292,8 @@ AddRect(ar[i].x, ar[i].y, Width, Height); dec(Maxcnt) end else Maxcnt:= 0 - end + end; +TryPut:= Result end; function TryPut(var Obj: TSprayObject; Surface: PSDL_Surface): boolean; overload; @@ -293,15 +302,13 @@ ar: array[0..MaxPointsIndex] of TPoint; cnt, i: Longword; r: TSDL_Rect; + Result: boolean; begin cnt:= 0; with Obj do begin if Maxcnt = 0 then - begin - Result:= false; - exit - end; + exit(false); x:= 0; r.x:= 0; r.y:= 0; @@ -338,7 +345,8 @@ AddRect(ar[i].x - 32, ar[i].y - 32, Width + 64, Height + 64); dec(Maxcnt) end else Maxcnt:= 0 - end + end; +TryPut:= Result end; procedure ReadThemeInfo(var ThemeObjects: TThemeObjects; var SprayObjects: TSprayObjects); @@ -348,7 +356,7 @@ begin s:= Pathz[ptCurrTheme] + '/' + cThemeCFGFilename; WriteLnToConsole('Reading objects info...'); -AssignFile(f, s); +Assign(f, s); {$I-} Reset(f); Readln(f, s); // skip color @@ -358,9 +366,9 @@ Readln(f, s); // filename with ThemeObjects.objs[i] do begin - Surf:= LoadImage(Pathz[ptCurrTheme] + '/' + s, false); - Width:= Surf.w; - Height:= Surf.h; + Surf:= LoadImage(Pathz[ptCurrTheme] + '/' + s, false, true, true); + Width:= Surf^.w; + Height:= Surf^.h; with inland do Read(f, x, y, w, h); Read(f, rectcnt); for ii:= 1 to rectcnt do @@ -376,13 +384,13 @@ Readln(f, s); // filename with SprayObjects.objs[i] do begin - Surf:= LoadImage(Pathz[ptCurrTheme] + '/' + s, false); - Width:= Surf.w; - Height:= Surf.h; + Surf:= LoadImage(Pathz[ptCurrTheme] + '/' + s, false, true, true); + Width:= Surf^.w; + Height:= Surf^.h; ReadLn(f, Maxcnt) end; end; -Closefile(f); +Close(f); {$I+} TryDo(IOResult = 0, 'Bad data or cannot access file ' + cThemeCFGFilename, true) end; diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uLandTemplates.pas --- a/hedgewars/uLandTemplates.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uLandTemplates.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,7 +18,7 @@ unit uLandTemplates; interface -uses SDLh; +uses SDLh, uFloat; {$INCLUDE options.inc} type PPointArray = ^TPointArray; @@ -28,8 +28,8 @@ BasePointsCount: Longword; BezPassCnt: Longword; PassMin, PassDelta: Longword; - WaveAmplMin, WaveAmplDelta: Double; - WaveFreqMin, WaveFreqDelta: Double; + WaveAmplMin, WaveAmplDelta: Longword; + WaveFreqMin, WaveFreqDelta: Longword; FillPoints: PPointArray; FillPointsCount: Longword; canMirror, canFlip: boolean; @@ -496,7 +496,7 @@ BezPassCnt: 4; PassMin: 10; PassDelta: 5; WaveAmplMin: 17; WaveAmplDelta: 20; - WaveFreqMin: 0.010; WaveFreqDelta: 0.002; + WaveFreqMin: 0100; WaveFreqDelta: 0020; FillPoints: @Template0FPoints; FillPointsCount: Succ(High(Template0FPoints)); canMirror: false; canFlip: false; @@ -506,7 +506,7 @@ BezPassCnt: 3; PassMin: 10; PassDelta: 2; WaveAmplMin: 25; WaveAmplDelta: 15; - WaveFreqMin: 0.008; WaveFreqDelta: 0.002; + WaveFreqMin: 0080; WaveFreqDelta: 0020; FillPoints: @Template1FPoints; FillPointsCount: Succ(High(Template1FPoints)); canMirror: false; canFlip: false; @@ -516,7 +516,7 @@ BezPassCnt: 3; PassMin: 14; PassDelta: 3; WaveAmplMin: 10; WaveAmplDelta: 10; - WaveFreqMin: 0.010; WaveFreqDelta: 0.002; + WaveFreqMin: 0100; WaveFreqDelta: 0020; FillPoints: @Template2FPoints; FillPointsCount: Succ(High(Template2FPoints)); canMirror: true; canFlip: false; @@ -526,7 +526,7 @@ BezPassCnt: 4; PassMin: 15; PassDelta: 2; WaveAmplMin: 8; WaveAmplDelta: 12; - WaveFreqMin: 0.015; WaveFreqDelta: 0.0015; + WaveFreqMin: 0150; WaveFreqDelta: 0015; FillPoints: @Template3FPoints; FillPointsCount: Succ(High(Template3FPoints)); canMirror: true; canFlip: false; @@ -536,7 +536,7 @@ BezPassCnt: 3; PassMin: 19; PassDelta: 5; WaveAmplMin: 12; WaveAmplDelta: 14; - WaveFreqMin: 0.008; WaveFreqDelta: 0.001; + WaveFreqMin: 0080; WaveFreqDelta: 0010; FillPoints: @Template4FPoints; FillPointsCount: Succ(High(Template4FPoints)); canMirror: true; canFlip: false; @@ -546,7 +546,7 @@ BezPassCnt: 4; PassMin: 15; PassDelta: 1; WaveAmplMin: 15; WaveAmplDelta: 14; - WaveFreqMin: 0.008; WaveFreqDelta: 0.002; + WaveFreqMin: 0080; WaveFreqDelta: 0020; FillPoints: @Template5FPoints; FillPointsCount: Succ(High(Template5FPoints)); canMirror: true; canFlip: false; @@ -556,7 +556,7 @@ BezPassCnt: 3; PassMin: 15; PassDelta: 1; WaveAmplMin: 15; WaveAmplDelta: 10; - WaveFreqMin: 0.010; WaveFreqDelta: 0.0015; + WaveFreqMin: 0100; WaveFreqDelta: 0015; FillPoints: @Template6FPoints; FillPointsCount: Succ(High(Template6FPoints)); canMirror: true; canFlip: false; @@ -566,7 +566,7 @@ BezPassCnt: 3; PassMin: 12; PassDelta: 4; WaveAmplMin: 5; WaveAmplDelta: 15; - WaveFreqMin: 0.015; WaveFreqDelta: 0.002; + WaveFreqMin: 0150; WaveFreqDelta: 0020; FillPoints: @Template7FPoints; FillPointsCount: Succ(High(Template7FPoints)); canMirror: true; canFlip: false; @@ -576,7 +576,7 @@ BezPassCnt: 4; PassMin: 9; PassDelta: 3; WaveAmplMin: 18; WaveAmplDelta: 18; - WaveFreqMin: 0.010; WaveFreqDelta: 0.002; + WaveFreqMin: 0100; WaveFreqDelta: 0020; FillPoints: @Template8FPoints; FillPointsCount: Succ(High(Template8FPoints)); canMirror: true; canFlip: false; @@ -586,7 +586,7 @@ BezPassCnt: 4; PassMin: 17; PassDelta: 3; WaveAmplMin: 10; WaveAmplDelta: 10; - WaveFreqMin: 0.010; WaveFreqDelta: 0.002; + WaveFreqMin: 0100; WaveFreqDelta: 0020; FillPoints: @Template9FPoints; FillPointsCount: Succ(High(Template9FPoints)); canMirror: true; canFlip: false; @@ -596,7 +596,7 @@ BezPassCnt: 4; PassMin: 15; PassDelta: 2; WaveAmplMin: 15; WaveAmplDelta: 10; - WaveFreqMin: 0.008; WaveFreqDelta: 0.002; + WaveFreqMin: 0080; WaveFreqDelta: 0020; FillPoints: @Template10FPoints; FillPointsCount: Succ(High(Template10FPoints)); canMirror: false; canFlip: false; @@ -606,7 +606,7 @@ BezPassCnt: 4; PassMin: 15; PassDelta: 1; WaveAmplMin: 10; WaveAmplDelta: 10; - WaveFreqMin: 0.008; WaveFreqDelta: 0.002; + WaveFreqMin: 0080; WaveFreqDelta: 0020; FillPoints: @Template11FPoints; FillPointsCount: Succ(High(Template11FPoints)); canMirror: true; canFlip: false; @@ -616,7 +616,7 @@ BezPassCnt: 3; PassMin: 10; PassDelta: 1; WaveAmplMin: 15; WaveAmplDelta: 15; - WaveFreqMin: 0.005; WaveFreqDelta: 0.003; + WaveFreqMin: 0050; WaveFreqDelta: 0030; FillPoints: @Template12FPoints; FillPointsCount: Succ(High(Template12FPoints)); canMirror: true; canFlip: false; @@ -626,7 +626,7 @@ BezPassCnt: 5; PassMin: 15; PassDelta: 3; WaveAmplMin: 18; WaveAmplDelta: 15; - WaveFreqMin: 0.0028; WaveFreqDelta: 0.002; + WaveFreqMin: 0028; WaveFreqDelta: 0020; FillPoints: @Template13FPoints; FillPointsCount: Succ(High(Template13FPoints)); canMirror: true; canFlip: false; @@ -636,7 +636,7 @@ BezPassCnt: 4; PassMin: 14; PassDelta: 3; WaveAmplMin: 20; WaveAmplDelta: 15; - WaveFreqMin: 0.003; WaveFreqDelta: 0.002; + WaveFreqMin: 0030; WaveFreqDelta: 0020; FillPoints: @Template14FPoints; FillPointsCount: Succ(High(Template14FPoints)); canMirror: true; canFlip: false; diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uLocale.pas --- a/hedgewars/uLocale.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uLocale.pas Sun Jan 21 19:51:02 2007 +0000 @@ -40,7 +40,7 @@ a, b, c: integer; begin {$I-} -AssignFile(f, FileName); +Assign(f, FileName); reset(f); TryDo(IOResult = 0, 'Cannot load locale "' + FileName + '"', true); while not eof(f) do @@ -61,7 +61,7 @@ 1: if (b >=0) and (b <= ord(High(TMsgStrId))) then trmsg[TMsgStrId(b)]:= s; end; end; -closefile(f) +Close(f) {$I+} end; @@ -69,8 +69,8 @@ var i: integer; begin i:= Pos('%1', fmt); -if i = 0 then Result:= fmt - else Result:= copy(fmt, 1, i - 1) + arg + Format(copy(fmt, i + 2, Length(fmt) - i - 1), arg) +if i = 0 then Format:= fmt + else Format:= copy(fmt, 1, i - 1) + arg + Format(copy(fmt, i + 2, Length(fmt) - i - 1), arg) end; end. diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uMisc.pas --- a/hedgewars/uMisc.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uMisc.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,7 +18,7 @@ unit uMisc; interface -uses uConsts, SDLh; +uses uConsts, SDLh, uFloat; {$INCLUDE options.inc} var isCursorVisible : boolean = false; isTerminated : boolean = false; @@ -37,7 +37,7 @@ cCloudsNumber : integer = 9; cConsoleHeight : integer = 320; - cConsoleYAdd : integer = 0; + cConsoleYAdd : integer = 0; cScreenWidth : integer = 1024; cScreenHeight : integer = 768; cBits : integer = 16; @@ -58,11 +58,6 @@ cColorNearBlack : Longword = 16; cExplosionBorderColor : LongWord = $808080; - cDrownSpeed : Double = 0.06; - cMaxWindSpeed : Double = 0.0005; - cWindSpeed : Double = 0.0001; - cGravity : Double = 0.0005; - cShowFPS : boolean = true; cCaseFactor : Longword = 3; {1..10} cFullScreen : boolean = true; @@ -71,12 +66,16 @@ cInitVolume : integer = 128; cVolumeDelta : integer = 0; cTimerInterval : Longword = 5; - cHasFocus : boolean = true; + cHasFocus : boolean = true; var cSendEmptyPacketTime : LongWord = 2000; cSendCursorPosTime : LongWord = 50; ShowCrosshair : boolean; + cDrownSpeed, + cMaxWindSpeed, + cWindSpeed, + cGravity: hwFloat; flagMakeCapture: boolean = false; @@ -84,14 +83,15 @@ AttackBar: integer = 0; // 0 - none, 1 - just bar at the right-down corner, 2 - like in WWP -function hwSign(r: Double): integer; +function hwSign(r: hwFloat): integer; function Min(a, b: integer): integer; function Max(a, b: integer): integer; -procedure OutError(Msg: String; const isFatalError: boolean=false); +function rndSign(num: hwFloat): hwFloat; +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: Double): shortstring; +function FloatToStr(n: hwFloat): shortstring; function DxDy2Angle32(const _dY, _dX: Extended): integer; function DxDy2AttackAngle(const _dY, _dX: Extended): integer; procedure AdjustColor(var Color: Longword); @@ -101,35 +101,36 @@ {$ENDIF} procedure SetKB(n: Longword); procedure SendKB; -procedure SetLittle(var r: Double); +procedure SetLittle(var r: hwFloat); procedure SendStat(sit: TStatInfoType; s: shortstring); +function Str2PChar(var s: shortstring): PChar; var CursorPoint: TPoint; TargetPoint: TPoint = (X: NoPointX; Y: 0); implementation -uses uConsole, uStore, uIO{$IFDEF FPC}, Math{$ENDIF}; +uses uConsole, uStore, uIO, Math, uRandom; var KBnum: Longword = 0; {$IFDEF DEBUGFILE} var f: textfile; {$ENDIF} -function hwSign(r: Double): integer; +function hwSign(r: hwFloat): integer; begin -if r < 0 then Result:= -1 else Result:= 1 +if r.isNegative then hwSign:= -1 else hwSign:= 1 end; function Min(a, b: integer): integer; begin -if a < b then Result:= a else Result:= b +if a < b then Min:= a else Min:= b end; function Max(a, b: integer): integer; begin -if a > b then Result:= a else Result:= b +if a > b then Max:= a else Max:= b end; -procedure OutError(Msg: String; const isFatalError: boolean=false); +procedure OutError(Msg: String; isFatalError: boolean); begin {$IFDEF DEBUGFILE}AddFileLog(Msg);{$ENDIF} WriteLnToConsole(Msg); @@ -158,17 +159,16 @@ function IntToStr(n: LongInt): shortstring; begin -str(n, Result) +str(n, IntToStr) end; -function FloatToStr(n: Double): shortstring; +function FloatToStr(n: hwFloat): shortstring; begin -//str(n:5:5, Result) -str(n, Result) +FloatToStr:= cstr(n) end; {$IFNDEF FPC} -function arctan2(const Y, X: Double): Double; +function arctan2(const Y, X: hwFloat): hwFloat; asm fld Y fld X @@ -180,13 +180,13 @@ function DxDy2Angle32(const _dY, _dX: Extended): integer; const _16divPI: Extended = 16/pi; begin -Result:= trunc(arctan2(_dY, _dX) * _16divPI) and $1f +DxDy2Angle32:= trunc(arctan2(_dY, _dX) * _16divPI) and $1f end; function DxDy2AttackAngle(const _dY, _dX: Extended): integer; const MaxAngleDivPI: Extended = cMaxAngle/pi; begin -Result:= trunc(arctan2(_dY, _dX) * MaxAngleDivPI) mod cMaxAngle +DxDy2AttackAngle:= trunc(arctan2(_dY, _dX) * MaxAngleDivPI) mod cMaxAngle end; procedure SetKB(n: Longword); @@ -204,9 +204,9 @@ end end; -procedure SetLittle(var r: Double); +procedure SetLittle(var r: hwFloat); begin -if r >= 0 then r:= cLittle else r:= - cLittle +if not r.isNegative then r:= cLittle else r:= - cLittle end; procedure SendStat(sit: TStatInfoType; s: shortstring); @@ -215,6 +215,20 @@ SendIPC('i' + stc[sit] + s) end; +function rndSign(num: hwFloat): hwFloat; +begin +num.isNegative:= getrandom(2) = 0; +rndSign:= num +end; + +function Str2PChar(var s: shortstring): PChar; +const CharArray: array[byte] of Char = ''; +begin +CharArray:= s; +CharArray[Length(s)]:= #0; +Str2PChar:= @CharArray +end; + {$IFDEF DEBUGFILE} procedure AddFileLog(s: shortstring); begin @@ -224,17 +238,23 @@ function RectToStr(Rect: TSDL_Rect): shortstring; begin -Result:= '(x: ' + inttostr(rect.x) + '; y: ' + inttostr(rect.y) + '; w: ' + inttostr(rect.w) + '; h: ' + inttostr(rect.h) + ')' +RectToStr:= '(x: ' + inttostr(rect.x) + '; y: ' + inttostr(rect.y) + '; w: ' + inttostr(rect.w) + '; h: ' + inttostr(rect.h) + ')' end; var i: integer; initialization +cDrownSpeed.QWordValue:= 257698038;// 0.06 +cMaxWindSpeed.QWordValue:= 2147484;// 0.0005 +cWindSpeed.QWordValue:= 429496;// 0.0001 +cGravity:= cMaxWindSpeed; + + {$I-} for i:= 0 to 7 do begin - AssignFile(f, 'debug' + inttostr(i) + '.txt'); + Assign(f, 'debug' + inttostr(i) + '.txt'); rewrite(f); if IOResult = 0 then break end; @@ -243,7 +263,7 @@ finalization writeln(f, '-= halt at ',GameTicks,' ticks =-'); Flush(f); -closefile(f) +close(f) {$ENDIF} end. diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uRandom.pas --- a/hedgewars/uRandom.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uRandom.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,10 +18,11 @@ unit uRandom; interface +uses uFloat; {$INCLUDE options.inc} procedure SetRandomSeed(Seed: shortstring); -function GetRandom: Double; overload; +function GetRandom: hwFloat; overload; function GetRandom(m: LongWord): LongWord; overload; implementation @@ -36,7 +37,7 @@ cirbuf[(n + 9) and $3F]) {n - 55 mod 64} and $7FFFFFFF; {mod 2^31} -Result:= cirbuf[n] +GetNext:= cirbuf[n] end; procedure SetRandomSeed(Seed: shortstring); @@ -55,15 +56,19 @@ for i:= 0 to 1023 do GetNext end; -function GetRandom: Double; +function GetRandom: hwFloat; +var r: hwFloat; begin -Result:= frac( GetNext * 0.00073 + GetNext * 0.00301) +GetNext; +r.isNegative:= false; +r.QWordValue:= GetNext; +GetRandom:= r end; function GetRandom(m: LongWord): LongWord; begin GetNext; -Result:= GetNext mod m +GetRandom:= GetNext mod m end; end. diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uSHA.pas --- a/hedgewars/uSHA.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uSHA.pas Sun Jan 21 19:51:02 2007 +0000 @@ -35,27 +35,27 @@ function rol(x: LongWord; y: Byte): LongWord; begin - Result:= (X shl y) or (X shr (32 - y)) + rol:= (X shl y) or (X shr (32 - y)) end; function Ft(t, b, c, d: LongWord): LongWord; begin case t of - 0..19: Result := (b and c) or ((not b) and d); - 20..39: Result := b xor c xor d; - 40..59: Result := (b and c) or (b and d) or (c and d); - else Result := b xor c xor d; + 0..19: Ft := (b and c) or ((not b) and d); + 20..39: Ft := b xor c xor d; + 40..59: Ft := (b and c) or (b and d) or (c and d); + else Ft := b xor c xor d; end; end; function Kt(t: Byte): LongWord; begin case t of - 0..19: Result := $5A827999; - 20..39: Result := $6ED9EBA1; - 40..59: Result := $8F1BBCDC; + 0..19: Kt := $5A827999; + 20..39: Kt := $6ED9EBA1; + 40..59: Kt := $8F1BBCDC; else - Result := $CA62C1D6 + Kt := $CA62C1D6 end; end; @@ -67,11 +67,11 @@ begin move(Context.H, S, sizeof(S)); for i:= 0 to 15 do - SDLNet_Write32(PLongWordArray(@Context.Buf)[i], @W[i]); - + SDLNet_Write32(PLongWordArray(@Context.Buf)^[i], @W[i]); + for i := 16 to 79 do W[i] := rol(W[i - 3] xor W[i - 8] xor W[i - 14] xor W[i - 16], 1); - + for i := 0 to 79 do begin t:= rol(S[0], 5) + Ft(i, S[1], S[2], S[3]) + S[4] + W[i] + Kt(i); @@ -81,7 +81,7 @@ S[1]:= S[0]; S[0]:= t end; - + for i := 0 to 4 do Context.H[i]:= Context.H[i] + S[i] end; @@ -118,6 +118,7 @@ function SHA1Final(Context: TSHA1Context): TSHA1Digest; var i: LongWord; + Result: TSHA1Digest; begin Context.Length:= Context.Length + Context.CurrLength shl 3; Context.Buf[Context.CurrLength]:= $80; @@ -137,7 +138,8 @@ Context.Buf[i] := (Context.Length shr ((63 - i) * 8)) and $FF; SHA1Hash(Context); move(Context.H, Result, sizeof(TSHA1Digest)); -FillChar(Context, sizeof(Context), 0) +FillChar(Context, sizeof(Context), 0); +SHA1Final:= Result end; end. diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uSound.pas --- a/hedgewars/uSound.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uSound.pas Sun Jan 21 19:51:02 2007 +0000 @@ -24,7 +24,7 @@ procedure InitSound; procedure ReleaseSound; procedure SoundLoad; -procedure PlaySound(snd: TSound; const infinite: boolean = false); +procedure PlaySound(snd: TSound; infinite: boolean); procedure PlayMusic; procedure StopSound(snd: TSound); function ChangeVolume(voldelta: integer): integer; @@ -63,26 +63,26 @@ procedure SoundLoad; var i: TSound; - s: string; + s: array[byte] of char; begin if not isSoundEnabled then exit; for i:= Low(TSound) to High(TSound) do begin s:= Pathz[Soundz[i].Path] + '/' + Soundz[i].FileName; - WriteToConsole(msgLoading + s + ' '); - Soundz[i].id:= Mix_LoadWAV_RW(SDL_RWFromFile(PChar(s), 'rb'), 1); + WriteToConsole(msgLoading + string(s) + ' '); + Soundz[i].id:= Mix_LoadWAV_RW(SDL_RWFromFile(@s, 'rb'), 1); TryDo(Soundz[i].id <> nil, msgFailed, true); WriteLnToConsole(msgOK); end; s:= PathPrefix + '/Music/kahvi140a_alexander_chereshnev-illusion.ogg'; -WriteToConsole(msgLoading + s + ' '); -Mus:= Mix_LoadMUS(PChar(s)); +WriteToConsole(msgLoading + string(s) + ' '); +Mus:= Mix_LoadMUS(@s); TryDo(Mus <> nil, msgFailed, false); WriteLnToConsole(msgOK) end; -procedure PlaySound(snd: TSound; const infinite: boolean = false); +procedure PlaySound(snd: TSound; infinite: boolean); var loops: integer; begin if not isSoundEnabled then exit; @@ -107,16 +107,14 @@ function ChangeVolume(voldelta: integer): integer; begin if not isSoundEnabled then - begin - Result:= 0; - exit - end; + exit(0); + inc(Volume, voldelta); if Volume < 0 then Volume:= 0; Mix_Volume(-1, Volume); Volume:= Mix_Volume(-1, -1); Mix_VolumeMusic(Volume * 3 div 8); -Result:= Volume * 100 div MIX_MAX_VOLUME +ChangeVolume:= Volume * 100 div MIX_MAX_VOLUME end; end. diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uStore.pas --- a/hedgewars/uStore.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uStore.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,7 +18,7 @@ unit uStore; interface -uses uConsts, uTeams, SDLh; +uses uConsts, uTeams, SDLh, uFloat; {$INCLUDE options.inc} procedure StoreInit; @@ -35,10 +35,10 @@ procedure DrawCentered(X, Top: integer; Source, Surface: PSDL_Surface); procedure DrawFromStoreRect(X, Y: integer; Rect: PSDL_Rect; Surface: PSDL_Surface); procedure DrawHedgehog(X, Y: integer; Dir: integer; Pos, Step: LongWord; Surface: PSDL_Surface); -function RenderString(s: string; Color: integer; font: THWFont): PSDL_Surface; +function RenderString(s: string; Color: Longword; font: THWFont): PSDL_Surface; procedure RenderHealth(var Hedgehog: THedgehog); procedure AddProgress; -function LoadImage(filename: string; hasAlpha: boolean; const critical: boolean = true; const setTransparent: boolean = true): PSDL_Surface; +function LoadImage(filename: string; hasAlpha, critical, setTransparent: boolean): PSDL_Surface; var PixelFormat: PSDL_PixelFormat; SDLPrimSurface: PSDL_Surface; @@ -52,7 +52,7 @@ procedure StoreInit; begin -StoreSurface:= SDL_CreateRGBSurface(SDL_HWSURFACE, 576, 1024, cBits, PixelFormat.RMask, PixelFormat.GMask, PixelFormat.BMask, PixelFormat.AMask); +StoreSurface:= SDL_CreateRGBSurface(SDL_HWSURFACE, 576, 1024, cBits, PixelFormat^.RMask, PixelFormat^.GMask, PixelFormat^.BMask, PixelFormat^.AMask); TryDo( StoreSurface <> nil, errmsgCreateSurface + ': store' , true); SDL_FillRect(StoreSurface, nil, 0); @@ -63,53 +63,56 @@ var tmpsurf: PSDL_Surface; rr: TSDL_Rect; begin - tmpsurf:= LoadImage(Filename, false); + tmpsurf:= LoadImage(Filename, false, true, false); rr.x:= X; rr.y:= Y; SDL_UpperBlit(tmpsurf, nil, Surface, @rr); SDL_FreeSurface(tmpsurf); end; -procedure DrawRoundRect(rect: PSDL_Rect; BorderColor, FillColor: Longword; Surface: PSDL_Surface; const Clear: boolean = true); +procedure DrawRoundRect(rect: PSDL_Rect; BorderColor, FillColor: Longword; Surface: PSDL_Surface; Clear: boolean); var r: TSDL_Rect; begin r:= rect^; if Clear then SDL_FillRect(Surface, @r, 0); -r.y:= rect.y + 1; -r.h:= rect.h - 2; +r.y:= rect^.y + 1; +r.h:= rect^.h - 2; SDL_FillRect(Surface, @r, BorderColor); -r.x:= rect.x + 1; -r.w:= rect.w - 2; -r.y:= rect.y; -r.h:= rect.h; +r.x:= rect^.x + 1; +r.w:= rect^.w - 2; +r.y:= rect^.y; +r.h:= rect^.h; SDL_FillRect(Surface, @r, BorderColor); -r.x:= rect.x + 2; -r.y:= rect.y + 1; -r.w:= rect.w - 4; -r.h:= rect.h - 2; +r.x:= rect^.x + 2; +r.y:= rect^.y + 1; +r.w:= rect^.w - 4; +r.h:= rect^.h - 2; SDL_FillRect(Surface, @r, FillColor); -r.x:= rect.x + 1; -r.y:= rect.y + 2; -r.w:= rect.w - 2; -r.h:= rect.h - 4; +r.x:= rect^.x + 1; +r.y:= rect^.y + 2; +r.w:= rect^.w - 2; +r.h:= rect^.h - 4; SDL_FillRect(Surface, @r, FillColor) end; function WriteInRoundRect(Surface: PSDL_Surface; X, Y: integer; Color: LongWord; Font: THWFont; s: string): TSDL_Rect; -var w, h: integer; +var w, h: LongInt; tmpsurf: PSDL_Surface; clr: TSDL_Color; + Result: TSDL_Rect; + ps: array[byte] of char; begin -TTF_SizeUTF8(Fontz[Font].Handle, PChar(s), w, h); +ps:= s; +TTF_SizeUTF8(Fontz[Font].Handle, @ps, w, h); Result.x:= X; Result.y:= Y; Result.w:= w + FontBorder * 2 + 4; Result.h:= h + FontBorder * 2; -DrawRoundRect(@Result, cWhiteColor, cColorNearBlack, Surface); +DrawRoundRect(@Result, cWhiteColor, cColorNearBlack, Surface, true); clr.r:= Color shr 16; clr.g:= (Color shr 8) and $FF; clr.b:= Color and $FF; -tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, PChar(s), clr.value); +tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, @ps, clr.value); Result.x:= X + FontBorder + 2; Result.y:= Y + FontBorder; SDLTry(tmpsurf <> nil, true); @@ -118,7 +121,8 @@ Result.x:= X; Result.y:= Y; Result.w:= w + FontBorder * 2 + 4; -Result.h:= h + FontBorder * 2 +Result.h:= h + FontBorder * 2; +WriteInRoundRect:= Result end; procedure StoreLoad; @@ -141,22 +145,22 @@ while Team<>nil do begin r.w:= 104; - Team.NameTag:= RenderString(Team.TeamName, Team.Color, Font); + Team^.NameTag:= RenderString(Team^.TeamName, Team^.Color, Font); r.w:= cTeamHealthWidth + 5; - r.h:= Team.NameTag.h; - DrawRoundRect(@r, cWhiteColor, cColorNearBlack, StoreSurface); - Team.HealthRect:= r; + r.h:= Team^.NameTag^.h; + DrawRoundRect(@r, cWhiteColor, cColorNearBlack, StoreSurface, true); + Team^.HealthRect:= r; rr:= r; inc(rr.x, 2); dec(rr.w, 4); inc(rr.y, 2); dec(rr.h, 4); - DrawRoundRect(@rr, Team.AdjColor, Team.AdjColor, StoreSurface, false); + DrawRoundRect(@rr, Team^.AdjColor, Team^.AdjColor, StoreSurface, false); inc(r.y, r.h); dec(drY, r.h + 2); - Team.DrawHealthY:= drY; + Team^.DrawHealthY:= drY; for i:= 0 to 7 do - with Team.Hedgehogs[i] do + with Team^.Hedgehogs[i] do if Gear <> nil then - NameTag:= RenderString(Name, Team.Color, fnt16); - Team:= Team.Next + NameTag:= RenderString(Name, Team^.Color, fnt16); + Team:= Team^.Next end; end; @@ -166,19 +170,19 @@ s: string; begin s:= Pathz[ptGraphics] + '/' + cCHFileName; - tmpsurf:= LoadImage(PChar(s), true, true, false); + tmpsurf:= LoadImage(s, true, true, false); Team:= TeamsList; while Team<>nil do begin - Team.CrosshairSurf:= SDL_CreateRGBSurface(SDL_HWSURFACE, tmpsurf.w, tmpsurf.h, cBits, PixelFormat.RMask, PixelFormat.GMask, PixelFormat.BMask, PixelFormat.AMask); - TryDo(Team.CrosshairSurf <> nil, errmsgCreateSurface, true); - SDL_FillRect(Team.CrosshairSurf, nil, Team.AdjColor); - SDL_UpperBlit(tmpsurf, nil, Team.CrosshairSurf, nil); - TryDo(SDL_SetColorKey(Team.CrosshairSurf, SDL_SRCCOLORKEY or SDL_RLEACCEL, 0) = 0, errmsgTransparentSet, true); - Team:= Team.Next + Team^.CrosshairSurf:= SDL_CreateRGBSurface(SDL_HWSURFACE, tmpsurf^.w, tmpsurf^.h, cBits, PixelFormat^.RMask, PixelFormat^.GMask, PixelFormat^.BMask, PixelFormat^.AMask); + TryDo(Team^.CrosshairSurf <> nil, errmsgCreateSurface, true); + SDL_FillRect(Team^.CrosshairSurf, nil, Team^.AdjColor); + SDL_UpperBlit(tmpsurf, nil, Team^.CrosshairSurf, nil); + TryDo(SDL_SetColorKey(Team^.CrosshairSurf, SDL_SRCCOLORKEY or SDL_RLEACCEL, 0) = 0, errmsgTransparentSet, true); + Team:= Team^.Next end; - + SDL_FreeSurface(tmpsurf) end; @@ -190,9 +194,9 @@ while p <> nil do begin for i:= 0 to cMaxHHIndex do - if p.Hedgehogs[i].Gear <> nil then - RenderHealth(p.Hedgehogs[i]); - p:= p.Next + if p^.Hedgehogs[i].Gear <> nil then + RenderHealth(p^.Hedgehogs[i]); + p:= p^.Next end end; @@ -205,13 +209,13 @@ while p <> nil do begin dec(l, 32); - if p.GraveName = '' then p.GraveName:= 'Simple'; - LoadToSurface(Pathz[ptGraves] + '/' + p.GraveName, StoreSurface, l, 512); - p.GraveRect.x:= l; - p.GraveRect.y:= 512; - p.GraveRect.w:= 32; - p.GraveRect.h:= 256; - p:= p.Next + if p^.GraveName = '' then p^.GraveName:= 'Simple'; + LoadToSurface(Pathz[ptGraves] + '/' + p^.GraveName, StoreSurface, l, 512); + p^.GraveRect.x:= l; + p^.GraveRect.y:= 512; + p^.GraveRect.w:= 32; + p^.GraveRect.h:= 256; + p:= p^.Next end end; @@ -220,8 +224,8 @@ begin if SDL_MustLock(SpritesData[sprSky].Surface) then SDLTry(SDL_LockSurface(SpritesData[sprSky].Surface) >= 0, true); - p:= SpritesData[sprSky].Surface.pixels; - case SpritesData[sprSky].Surface.format.BytesPerPixel of + p:= SpritesData[sprSky].Surface^.pixels; + case SpritesData[sprSky].Surface^.format^.BytesPerPixel of 1: cSkyColor:= PByte(p)^; 2: cSkyColor:= PWord(p)^; 3: cSkyColor:= (p^[0]) or (p^[1] shl 8) or (p^[2] shl 16); @@ -237,11 +241,11 @@ begin s:= Pathz[ptCurrTheme] + '/' + cThemeCFGFilename; WriteToConsole(msgLoading + s + ' '); - AssignFile(f, s); + Assign(f, s); {$I-} Reset(f); Readln(f, s); - Closefile(f); + Close(f); {$I+} TryDo(IOResult = 0, msgFailed, true); WriteLnToConsole(msgOK); @@ -249,13 +253,16 @@ AdjustColor(cExplosionBorderColor); end; +var ps: array[byte] of char; + begin for fi:= Low(THWFont) to High(THWFont) do with Fontz[fi] do begin s:= Pathz[ptFonts] + '/' + Name; WriteToConsole(msgLoading + s + '... '); - Handle:= TTF_OpenFont(PChar(s), Height); + ps:= s; + Handle:= TTF_OpenFont(@ps, Height); SDLTry(Handle <> nil, true); TTF_SetFontStyle(Handle, style); WriteLnToConsole(msgOK) @@ -289,20 +296,20 @@ with SpritesData[ii] do begin if AltPath = ptNone then - Surface:= LoadImage(Pathz[Path] + '/' + FileName, hasAlpha) + Surface:= LoadImage(Pathz[Path] + '/' + FileName, hasAlpha, true, true) else begin - Surface:= LoadImage(Pathz[Path] + '/' + FileName, hasAlpha, false); + Surface:= LoadImage(Pathz[Path] + '/' + FileName, hasAlpha, false, true); if Surface = nil then - Surface:= LoadImage(Pathz[AltPath] + '/' + FileName, hasAlpha) + Surface:= LoadImage(Pathz[AltPath] + '/' + FileName, hasAlpha, true, true) end; - if Width = 0 then Width:= Surface.w; - if Height = 0 then Height:= Surface.h + if Width = 0 then Width:= Surface^.w; + if Height = 0 then Height:= Surface^.h end; GetSkyColor; AddProgress; -tmpsurf:= LoadImage(Pathz[ptGraphics] + '/' + cHHFileName, false); +tmpsurf:= LoadImage(Pathz[ptGraphics] + '/' + cHHFileName, false, true, true); TryDo(SDL_SetColorKey(tmpsurf, SDL_SRCCOLORKEY or SDL_RLEACCEL, 0) = 0, errmsgTransparentSet, true); HHSurface:= SDL_DisplayFormat(tmpsurf); SDL_FreeSurface(tmpsurf); @@ -322,8 +329,8 @@ begin rr.x:= X; rr.y:= Y; -rr.w:= r.w; -rr.h:= r.h; +rr.w:= r^.w; +rr.h:= r^.h; if SDL_UpperBlit(SourceSurface, r, DestSurface, @rr) < 0 then begin OutError('Blit: ' + SDL_GetError, true); @@ -362,7 +369,7 @@ var r: TSDL_Rect; begin r.x:= 0; -r.w:= Source.w; +r.w:= Source^.w; r.y:= Frame * Height; r.h:= Height; DrawFromRect(X, Y, @r, Source, Surface) @@ -372,13 +379,15 @@ var clr: TSDL_Color; tmpsurf: PSDL_Surface; r: TSDL_Rect; + ps: array[byte] of Char; begin r.x:= X; r.y:= Y; clr.r:= $FF; clr.g:= $FF; clr.b:= $FF; -tmpsurf:= TTF_RenderUTF8_Solid(Fontz[Font].Handle, PChar(s), clr.value); +ps:= s; +tmpsurf:= TTF_RenderUTF8_Solid(Fontz[Font].Handle, @ps, clr.value); if tmpsurf = nil then begin SetKB(1); @@ -407,10 +416,10 @@ procedure DrawCentered(X, Top: integer; Source, Surface: PSDL_Surface); var r: TSDL_Rect; begin -r.x:= X - Source.w div 2; +r.x:= X - Source^.w div 2; r.y:= Top; -r.w:= Source.w; -r.h:= Source.h; +r.w:= Source^.w; +r.h:= Source^.h; SDL_UpperBlit(Source, nil, Surface, @r) end; @@ -419,7 +428,7 @@ begin r.x:= Step * 32; r.y:= Pos * 32; -if Dir = -1 then r.x:= HHSurface.w - 32 - r.x; +if Dir = -1 then r.x:= HHSurface^.w - 32 - r.x; r.w:= 32; r.h:= 32; DrawFromRect(X, Y, @r, HHSurface, Surface) @@ -435,21 +444,25 @@ SDL_FreeSurface(StoreSurface ) end; -function RenderString(s: string; Color: integer; font: THWFont): PSDL_Surface; -var w, h: integer; +function RenderString(s: string; Color: Longword; font: THWFont): PSDL_Surface; +var w, h: Longint; + ps: array[byte] of Char; + Result: PSDL_Surface; begin -TTF_SizeUTF8(Fontz[font].Handle, PChar(s), w, h); +ps:= s; +TTF_SizeUTF8(Fontz[font].Handle, @ps, w, h); Result:= SDL_CreateRGBSurface(SDL_HWSURFACE, w + FontBorder * 2 + 4, h + FontBorder * 2, - cBits, PixelFormat.RMask, PixelFormat.GMask, PixelFormat.BMask, PixelFormat.AMask); + cBits, PixelFormat^.RMask, PixelFormat^.GMask, PixelFormat^.BMask, PixelFormat^.AMask); TryDo(Result <> nil, 'RenderString: fail to create surface', true); WriteInRoundRect(Result, 0, 0, Color, font, s); -TryDo(SDL_SetColorKey(Result, SDL_SRCCOLORKEY or SDL_RLEACCEL, 0) = 0, errmsgTransparentSet, true) +TryDo(SDL_SetColorKey(Result, SDL_SRCCOLORKEY or SDL_RLEACCEL, 0) = 0, errmsgTransparentSet, true); +RenderString:= Result end; procedure RenderHealth(var Hedgehog: THedgehog); var s: shortstring; begin -str(Hedgehog.Gear.Health, s); +str(Hedgehog.Gear^.Health, s); if Hedgehog.HealthTag <> nil then SDL_FreeSurface(Hedgehog.HealthTag); Hedgehog.HealthTag:= RenderString(s, Hedgehog.Team^.Color, fnt16) end; @@ -463,7 +476,7 @@ if Step = 0 then begin WriteToConsole(msgLoading + 'progress sprite: '); - ProgrSurf:= LoadImage(Pathz[ptGraphics] + '/BigDigits', false); + ProgrSurf:= LoadImage(Pathz[ptGraphics] + '/BigDigits', false, true, true); end; SDL_FillRect(SDLPrimSurface, nil, 0); r.x:= 0; @@ -480,26 +493,33 @@ end; end; -function LoadImage(filename: string; hasAlpha: boolean; const critical: boolean = true; const setTransparent: boolean = true): PSDL_Surface; +function LoadImage(filename: string; hasAlpha: boolean; critical, setTransparent: boolean): PSDL_Surface; var tmpsurf: PSDL_Surface; + ps: array[byte] of char; + Result: PSDL_Surface; begin WriteToConsole(msgLoading + filename + '... '); -tmpsurf:= IMG_Load(PChar(filename + '.' + cBitsStr + '.png')); +ps:= filename + '.' + cBitsStr + '.png'; +tmpsurf:= IMG_Load(@ps); + if tmpsurf = nil then - tmpsurf:= IMG_Load(PChar(filename + '.png')); + begin + ps:= filename + '.png'; + tmpsurf:= IMG_Load(ps); + end; if tmpsurf = nil then if critical then OutError(msgFailed, true) else begin WriteLnToConsole(msgFailed); - Result:= nil; - exit + exit(nil) end; - + if setTransparent then TryDo(SDL_SetColorKey(tmpsurf, SDL_SRCCOLORKEY or SDL_RLEACCEL, 0) = 0, errmsgTransparentSet, true); if hasAlpha then Result:= SDL_DisplayFormatAlpha(tmpsurf) else Result:= SDL_DisplayFormat(tmpsurf); -WriteLnToConsole(msgOK) +WriteLnToConsole(msgOK); +LoadImage:= Result end; end. diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uTeams.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,7 +18,7 @@ unit uTeams; interface -uses SDLh, uConsts, uKeys, uGears, uRandom, uAmmos; +uses SDLh, uConsts, uKeys, uGears, uRandom, uAmmos, uFloat; {$INCLUDE options.inc} type PHedgehog = ^THedgehog; PTeam = ^TTeam; @@ -83,22 +83,21 @@ AliveCount: Longword; s: shortstring; begin -Result:= false; AliveCount:= 0; AliveTeam:= nil; team:= TeamsList; while team <> nil do begin - if team.TeamHealth > 0 then + if team^.TeamHealth > 0 then begin inc(AliveCount); AliveTeam:= team end; - team:= team.Next + team:= team^.Next end; -if AliveCount >= 2 then exit; -Result:= true; +if AliveCount >= 2 then exit(false); +CheckForWin:= true; TurnTimeLeft:= 0; if AliveCount = 0 then @@ -108,7 +107,7 @@ AddGear(0, 0, gtATFinishGame, 0, 0, 0, 2000) end else // win begin - s:= Format(trmsg[sidWinner], AliveTeam.TeamName); + s:= Format(trmsg[sidWinner], AliveTeam^.TeamName); AddCaption(s, $FFFFFF, capgrpGameState); SendStat(siGameResult, s); AddGear(0, 0, gtATFinishGame, 0, 0, 0, 2000) @@ -119,30 +118,31 @@ procedure SwitchHedgehog; var tteam: PTeam; th: integer; + g: PGear; begin FreeActionsList; TargetPoint.X:= NoPointX; TryDo(CurrentTeam <> nil, 'nil Team', true); tteam:= CurrentTeam; -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do if Gear <> nil then begin - Gear.Message:= 0; - Gear.Z:= cHHZ + Gear^.Message:= 0; + Gear^.Z:= cHHZ end; repeat - CurrentTeam:= CurrentTeam.Next; + CurrentTeam:= CurrentTeam^.Next; if CurrentTeam = nil then CurrentTeam:= TeamsList; - th:= CurrentTeam.CurrHedgehog; + th:= CurrentTeam^.CurrHedgehog; repeat - CurrentTeam.CurrHedgehog:= Succ(CurrentTeam.CurrHedgehog) mod (cMaxHHIndex + 1); - until (CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear <> nil) or (CurrentTeam.CurrHedgehog = th) -until (CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear <> nil) or (CurrentTeam = tteam); + CurrentTeam^.CurrHedgehog:= Succ(CurrentTeam^.CurrHedgehog) mod (cMaxHHIndex + 1); + until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) or (CurrentTeam^.CurrHedgehog = th) +until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) or (CurrentTeam = tteam); TryDo(CurrentTeam <> tteam, 'Switch hedgehog: only one team?!', true); -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do begin AttacksNum:= 0; with Gear^ do @@ -156,29 +156,35 @@ FollowGear:= Gear end; ResetKbd; -cWindSpeed:= (GetRandom * 2 - 1) * cMaxWindSpeed; -AddGear(0, 0, gtATSmoothWindCh, 0, 0, 0, 1).Tag:= round(72 * cWindSpeed / cMaxWindSpeed); + +cWindSpeed:= rndSign(GetRandom * cMaxWindSpeed); +addfilelog('SwitchHedgehog 06'); +g:= AddGear(0, 0, gtATSmoothWindCh, 0, 0, 0, 1); +g^.Tag:= hwRound(cWindSpeed * 72 / cMaxWindSpeed); +addfilelog('SwitchHedgehog 07'); {$IFDEF DEBUGFILE}AddFileLog('Wind = '+FloatToStr(cWindSpeed));{$ENDIF} -ApplyAmmoChanges(CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog]); -if CurrentTeam.ExtDriven then SetDefaultBinds - else SetBinds(CurrentTeam.Binds); +ApplyAmmoChanges(CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog]); +if CurrentTeam^.ExtDriven then SetDefaultBinds + else SetBinds(CurrentTeam^.Binds); bShowFinger:= true; TurnTimeLeft:= cHedgehogTurnTime end; function AddTeam: PTeam; +var Result: PTeam; begin New(Result); TryDo(Result <> nil, 'AddTeam: Result = nil', true); FillChar(Result^, sizeof(TTeam), 0); -Result.AttackBar:= 2; -Result.CurrHedgehog:= cMaxHHIndex; +Result^.AttackBar:= 2; +Result^.CurrHedgehog:= cMaxHHIndex; if TeamsList = nil then TeamsList:= Result else begin - Result.Next:= TeamsList; + Result^.Next:= TeamsList; TeamsList:= Result end; -CurrentTeam:= Result +CurrentTeam:= Result; +AddTeam:= Result end; procedure FreeTeamsList; @@ -186,10 +192,10 @@ begin tt:= TeamsList; TeamsList:= nil; -while tt<>nil do +while tt <> nil do begin t:= tt; - tt:= tt.Next; + tt:= tt^.Next; Dispose(t) end; end; @@ -201,7 +207,7 @@ while p <> nil do begin RecountTeamHealth(p); - p:= p.Next + p:= p^.Next end end; @@ -215,10 +221,10 @@ begin th:= 0; for i:= 0 to cMaxHHIndex do - if p.Hedgehogs[i].Gear <> nil then - inc(th, p.Hedgehogs[i].Gear.Health); + if p^.Hedgehogs[i].Gear <> nil then + inc(th, p^.Hedgehogs[i].Gear^.Health); if th > MaxTeamHealth then MaxTeamHealth:= th; - p:= p.Next + p:= p^.Next end; RecountAllTeamsHealth end; @@ -230,14 +236,14 @@ with Hedgehog do begin - if Ammo[CurSlot, CurAmmo].Count = 0 then + if Ammo^[CurSlot, CurAmmo].Count = 0 then begin CurAmmo:= 0; CurSlot:= 0; - while (CurSlot <= cMaxSlotIndex) and (Ammo[CurSlot, CurAmmo].Count = 0) do inc(CurSlot) + while (CurSlot <= cMaxSlotIndex) and (Ammo^[CurSlot, CurAmmo].Count = 0) do inc(CurSlot) end; -with Ammo[CurSlot, CurAmmo] do +with Ammo^[CurSlot, CurAmmo] do begin CurMinAngle:= Ammoz[AmmoType].minAngle; if Ammoz[AmmoType].maxAngle <> 0 then CurMaxAngle:= Ammoz[AmmoType].maxAngle @@ -247,19 +253,19 @@ if Angle < CurMinAngle then Angle:= CurMinAngle; if Angle > CurMaxAngle then Angle:= CurMaxAngle; end; - + s:= trammo[Ammoz[AmmoType].NameId]; if Count <> AMMO_INFINITE then s:= s + ' (' + IntToStr(Count) + ')'; if (Propz and ammoprop_Timerable) <> 0 then s:= s + ', ' + inttostr(Timer div 1000) + ' ' + trammo[sidSeconds]; - AddCaption(s, Team.Color, capgrpAmmoinfo); + AddCaption(s, Team^.Color, capgrpAmmoinfo); if (Propz and ammoprop_NeedTarget) <> 0 then begin - Gear.State:= Gear.State or gstHHChooseTarget; + Gear^.State:= Gear^.State or gstHHChooseTarget; isCursorVisible:= true end else begin - Gear.State:= Gear.State and not gstHHChooseTarget; + Gear^.State:= Gear^.State and not gstHHChooseTarget; isCursorVisible:= false end; ShowCrosshair:= (Propz and ammoprop_NoCrosshair) = 0 @@ -268,11 +274,12 @@ end; function TeamSize(p: PTeam): Longword; -var i: Longword; +var i, Result: Longword; begin Result:= 0; for i:= 0 to cMaxHHIndex do - if p.Hedgehogs[i].Gear <> nil then inc(Result) + if p^.Hedgehogs[i].Gear <> nil then inc(Result); +TeamSize:= Result end; procedure RecountTeamHealth(team: PTeam); @@ -283,7 +290,7 @@ TeamHealthBarWidth:= 0; for i:= 0 to cMaxHHIndex do if Hedgehogs[i].Gear <> nil then - inc(TeamHealthBarWidth, Hedgehogs[i].Gear.Health); + inc(TeamHealthBarWidth, Hedgehogs[i].Gear^.Health); TeamHealth:= TeamHealthBarWidth; if TeamHealthBarWidth > MaxTeamHealth then begin @@ -292,7 +299,7 @@ end else TeamHealthBarWidth:= (TeamHealthBarWidth * cTeamHealthWidth) div MaxTeamHealth end; // FIXME: at the game init, gtTeamHealthSorters are created for each team, and they work simultaneously -AddGear(0, 0, gtTeamHealthSorter, 0) +AddGear(0, 0, gtTeamHealthSorter, 0, 0, 0, 0) end; procedure RestoreTeamsFromSave; @@ -301,8 +308,8 @@ p:= TeamsList; while p <> nil do begin - p.ExtDriven:= false; - p:= p.Next + p^.ExtDriven:= false; + p:= p^.Next end; end; @@ -312,9 +319,9 @@ t:= cMaxSlotAmmoIndex; with CurrentTeam^ do with Hedgehogs[CurrHedgehog] do - while (Ammo[CurSlot, CurAmmo].AmmoType <> weap) and (t >= 0) do + while (Ammo^[CurSlot, CurAmmo].AmmoType <> weap) and (t >= 0) do begin - ParseCommand('/slot ' + chr(49 + Ammoz[TAmmoType(weap)].Slot)); + ParseCommand('/slot ' + chr(49 + Ammoz[TAmmoType(weap)].Slot), true); dec(t) end end; @@ -329,15 +336,15 @@ while p <> nil do begin for i:= 0 to cMaxHHIndex do - if p.Hedgehogs[i].MaxStepDamage > msd then + if p^.Hedgehogs[i].MaxStepDamage > msd then begin - msdhh:= @p.Hedgehogs[i]; - msd:= p.Hedgehogs[i].MaxStepDamage + msdhh:= @(p^.Hedgehogs[i]); + msd:= p^.Hedgehogs[i].MaxStepDamage end; - p:= p.Next + p:= p^.Next end; -if msdhh <> nil then SendStat(siMaxStepDamage, inttostr(msdhh.MaxStepDamage) + ' ' + - msdhh.Name + ' (' + msdhh.Team.TeamName + ')'); +if msdhh <> nil then SendStat(siMaxStepDamage, inttostr(msdhh^.MaxStepDamage) + ' ' + + msdhh^.Name + ' (' + msdhh^.Team^.TeamName + ')'); if KilledHHs > 0 then SendStat(siKilledHHs, inttostr(KilledHHs)); end; diff -r c3ccec3834e8 -r 29bc9c36ad5f hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Thu Jan 18 20:29:28 2007 +0000 +++ b/hedgewars/uWorld.pas Sun Jan 21 19:51:02 2007 +0000 @@ -18,7 +18,7 @@ unit uWorld; interface -uses SDLh, uGears, uConsts; +uses SDLh, uGears, uConsts, uFloat; {$INCLUDE options.inc} const WorldDx: integer = -512; WorldDy: integer = -256; @@ -39,7 +39,7 @@ implementation uses uStore, uMisc, uTeams, uIO, uConsole, uKeys, uLocale, uSound; -const RealTicks: Longword = 0; +const hwFloatTicks: Longword = 0; FPS: Longword = 0; CountTicks: Longword = 0; SoundTimerTicks: Longword = 0; @@ -93,7 +93,7 @@ if CurrentTeam = nil then exit; Slot:= 0; Pos:= -1; -with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do +with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do begin if Ammo = nil then exit; SlotsNum:= 0; @@ -106,7 +106,7 @@ dec(y, 33); DrawSprite(sprAMSlotName, x, y, 0, Surface); for i:= cMaxSlotIndex downto 0 do - if Ammo[i, 0].Count > 0 then + if Ammo^[i, 0].Count > 0 then begin if (CursorPoint.Y >= y - 33) and (CursorPoint.Y < y) then Slot:= i; dec(y, 33); @@ -114,9 +114,9 @@ DrawSprite(sprAMSlot, x, y, 0, Surface); DrawSprite(sprAMSlotKeys, x + 2, y + 1, i, Surface); t:= 0; - while (t <= cMaxSlotAmmoIndex) and (Ammo[i, t].Count > 0) do + while (t <= cMaxSlotAmmoIndex) and (Ammo^[i, t].Count > 0) do begin - DrawSprite(sprAMAmmos, x + t * 33 + 35, y + 1, integer(Ammo[i, t].AmmoType), Surface); + DrawSprite(sprAMAmmos, x + t * 33 + 35, y + 1, integer(Ammo^[i, t].AmmoType), Surface); if (Slot = i) and (CursorPoint.X >= x + t * 33 + 35) and (CursorPoint.X < x + t * 33 + 68) then begin DrawSprite(sprAMSelection, x + t * 33 + 35, y + 1, 0, Surface); @@ -129,15 +129,15 @@ DrawSprite(sprAMBorders, x, y, 0, Surface); if (Pos >= 0) then - if Ammo[Slot, Pos].Count > 0 then + if Ammo^[Slot, Pos].Count > 0 then begin - DXOutText(AMxCurr + 10, cScreenHeight - 68, fnt16, trAmmo[Ammoz[Ammo[Slot, Pos].AmmoType].NameId], Surface); - if Ammo[Slot, Pos].Count < 10 then - DXOutText(AMxCurr + 175, cScreenHeight - 68, fnt16, chr(Ammo[Slot, Pos].Count + 48) + 'x', Surface); + DXOutText(AMxCurr + 10, cScreenHeight - 68, fnt16, trAmmo[Ammoz[Ammo^[Slot, Pos].AmmoType].NameId], Surface); + if Ammo^[Slot, Pos].Count < 10 then + DXOutText(AMxCurr + 175, cScreenHeight - 68, fnt16, chr(Ammo^[Slot, Pos].Count + 48) + 'x', Surface); if bSelected then begin bShowAmmoMenu:= false; - SetWeapon(Ammo[Slot, Pos].AmmoType); + SetWeapon(Ammo^[Slot, Pos].AmmoType); bSelected:= false; exit end; @@ -145,7 +145,7 @@ end; bSelected:= false; -if AMxLeft = AMxCurr then DrawSprite(sprArrow, CursorPoint.X, CursorPoint.Y, (RealTicks shr 6) mod 8, Surface) +if AMxLeft = AMxCurr then DrawSprite(sprArrow, CursorPoint.X, CursorPoint.Y, (hwFloatTicks shr 6) mod 8, Surface) end; procedure MoveCamera; forward; @@ -174,7 +174,7 @@ if not isPaused then MoveCamera; // Sky -inc(RealTicks, Lag); +inc(hwFloatTicks, Lag); if WorldDy > 0 then begin if WorldDy > cScreenHeight then r.h:= cScreenHeight @@ -190,8 +190,8 @@ // Waves {$WARNINGS OFF} -for i:= -1 to cWaterSprCount do DrawSprite(sprWater, i * 256 + ((WorldDx + (RealTicks shr 6) ) and $FF), cWaterLine + WorldDy - 64, 0, Surface); -for i:= -1 to cWaterSprCount do DrawSprite(sprWater, i * 256 + ((WorldDx - (RealTicks shr 6) + 192) and $FF), cWaterLine + WorldDy - 48, 0, Surface); +for i:= -1 to cWaterSprCount do DrawSprite(sprWater, i * 256 + ((WorldDx + (hwFloatTicks shr 6) ) and $FF), cWaterLine + WorldDy - 64, 0, Surface); +for i:= -1 to cWaterSprCount do DrawSprite(sprWater, i * 256 + ((WorldDx - (hwFloatTicks shr 6) + 192) and $FF), cWaterLine + WorldDy - 48, 0, Surface); {$WARNINGS ON} DrawLand(WorldDx, WorldDy, Surface); @@ -210,9 +210,9 @@ // Waves {$WARNINGS OFF} -for i:= -1 to cWaterSprCount do DrawSprite(sprWater, i * 256 + ((WorldDx + (RealTicks shr 6) + 64) and $FF), cWaterLine + WorldDy - 32, 0, Surface); -for i:= -1 to cWaterSprCount do DrawSprite(sprWater, i * 256 + ((WorldDx - (RealTicks shr 6) + 128) and $FF), cWaterLine + WorldDy - 16, 0, Surface); -for i:= -1 to cWaterSprCount do DrawSprite(sprWater, i * 256 + ((WorldDx + (RealTicks shr 6) ) and $FF), cWaterLine + WorldDy , 0, Surface); +for i:= -1 to cWaterSprCount do DrawSprite(sprWater, i * 256 + ((WorldDx + (hwFloatTicks shr 6) + 64) and $FF), cWaterLine + WorldDy - 32, 0, Surface); +for i:= -1 to cWaterSprCount do DrawSprite(sprWater, i * 256 + ((WorldDx - (hwFloatTicks shr 6) + 128) and $FF), cWaterLine + WorldDy - 16, 0, Surface); +for i:= -1 to cWaterSprCount do DrawSprite(sprWater, i * 256 + ((WorldDx + (hwFloatTicks shr 6) ) and $FF), cWaterLine + WorldDy , 0, Surface); {$WARNINGS ON} // Turn time @@ -238,17 +238,17 @@ 1: begin r:= StuffPoz[sPowerBar]; {$WARNINGS OFF} - r.w:= (CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].Gear.Power * 256) div cPowerDivisor; + r.w:= (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^.Power * 256) div cPowerDivisor; {$WARNINGS ON} DrawSpriteFromRect(r, cScreenWidth - 272, cScreenHeight - 48, 16, 0, Surface); end; - 2: with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do + 2: with CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog] do begin - tdx:= hwSign(Gear.dX) * Sin(Gear.Angle*pi/cMaxAngle); - tdy:= - Cos(Gear.Angle*pi/cMaxAngle); - for i:= (Gear.Power * 24) div cPowerDivisor downto 0 do - DrawSprite(sprPower, round(Gear.X + WorldDx + tdx * (24 + i * 2)) - 16, - round(Gear.Y + WorldDy + tdy * (24 + i * 2)) - 12, + tdx:= hwSign(Gear^.dX) * Sin(Gear^.Angle * Pi / cMaxAngle); + tdy:= - Cos(Gear^.Angle * Pi / cMaxAngle); + for i:= (Gear^.Power * 24) div cPowerDivisor downto 0 do + DrawSprite(sprPower, Gear^.X.Round + system.round(WorldDx + tdx * (24 + i * 2)) - 16, + Gear^.Y.Round + system.round(WorldDy + tdy * (24 + i * 2)) - 12, i, Surface) end end; @@ -263,8 +263,8 @@ if Surf <> nil then begin DrawCentered(cScreenWidth div 2, i + cConsoleYAdd, Surf, Surface); - inc(i, Surf.h + 2); - if EndTime <= RealTicks then + inc(i, Surf^.h + 2); + if EndTime <= hwFloatTicks then begin SDL_FreeSurface(Surf); Surf:= nil; @@ -276,26 +276,26 @@ team:= TeamsList; while team <> nil do begin - r.x:= cScreenWidth div 2 - team.NameTag.w - 3; - r.y:= team.DrawHealthY; - r.w:= team.NameTag.w; - r.h:= team.NameTag.h; - SDL_UpperBlit(team.NameTag, nil, Surface, @r); - r:= team.HealthRect; - r.w:= 2 + team.TeamHealthBarWidth; + r.x:= cScreenWidth div 2 - team^.NameTag^.w - 3; + r.y:= team^.DrawHealthY; + r.w:= team^.NameTag^.w; + r.h:= team^.NameTag^.h; + SDL_UpperBlit(team^.NameTag, nil, Surface, @r); + r:= team^.HealthRect; + r.w:= 2 + team^.TeamHealthBarWidth; DrawFromStoreRect(cScreenWidth div 2, - Team.DrawHealthY, + Team^.DrawHealthY, @r, Surface); inc(r.x, cTeamHealthWidth + 2); r.w:= 3; - DrawFromStoreRect(cScreenWidth div 2 + team.TeamHealthBarWidth + 2, - Team.DrawHealthY, + DrawFromStoreRect(cScreenWidth div 2 + team^.TeamHealthBarWidth + 2, + Team^.DrawHealthY, @r, Surface); - team:= team.Next + team:= team^.Next end; // Lag alert -if isInLag then DrawSprite(sprLag, 32, 32 + cConsoleYAdd, (RealTicks shr 7) mod 7, Surface); +if isInLag then DrawSprite(sprLag, 32, 32 + cConsoleYAdd, (hwFloatTicks shr 7) mod 7, Surface); // Wind bar DrawGear(sWindBar, cScreenWidth - 180, cScreenHeight - 30, Surface); @@ -304,7 +304,7 @@ with StuffPoz[sWindR] do begin {$WARNINGS OFF} - r.x:= x + 8 - (RealTicks shr 6) mod 8; + r.x:= x + 8 - (hwFloatTicks shr 6) mod 8; {$WARNINGS ON} r.y:= y; r.w:= WindBarWidth; @@ -317,7 +317,7 @@ with StuffPoz[sWindL] do begin {$WARNINGS OFF} - r.x:= x + (WindBarWidth + RealTicks shr 6) mod 8; + r.x:= x + (WindBarWidth + hwFloatTicks shr 6) mod 8; {$WARNINGS ON} r.y:= y; r.w:= - WindBarWidth; @@ -330,7 +330,7 @@ if (AMxCurr < cScreenWidth) or bShowAmmoMenu then ShowAmmoMenu(Surface); // Cursor -if isCursorVisible then DrawSprite(sprArrow, CursorPoint.X, CursorPoint.Y, (RealTicks shr 6) mod 8, Surface); +if isCursorVisible then DrawSprite(sprArrow, CursorPoint.X, CursorPoint.Y, (hwFloatTicks shr 6) mod 8, Surface); {$IFDEF COUNTTICKS} DXOutText(10, 10, fnt16, inttostr(cntTicks), Surface); @@ -349,7 +349,7 @@ CountTicks:= 0; s:= inttostr(FPS) + ' fps'; if fpsSurface <> nil then SDL_FreeSurface(fpsSurface); - fpsSurface:= TTF_RenderUTF8_Blended(Fontz[fnt16].Handle, PChar(String(s)), $FFFFFF); + fpsSurface:= TTF_RenderUTF8_Blended(Fontz[fnt16].Handle, Str2PChar(s), $FFFFFF); end; r.x:= cScreenWidth - 50; r.y:= 10; @@ -374,14 +374,14 @@ if Captions[Group].Surf <> nil then SDL_FreeSurface(Captions[Group].Surf); Captions[Group].Surf:= RenderString(s, Color, fntBig); -Captions[Group].EndTime:= RealTicks + 1500 +Captions[Group].EndTime:= hwFloatTicks + 1500 end; procedure MoveCamera; const PrevSentPointTime: LongWord = 0; var EdgesDist: integer; begin -if not (CurrentTeam.ExtDriven and isCursorVisible) then SDL_GetMouseState(@CursorPoint.X, @CursorPoint.Y); +if not (CurrentTeam^.ExtDriven and isCursorVisible) then SDL_GetMouseState(@CursorPoint.X, @CursorPoint.Y); if (FollowGear <> nil) then if abs(CursorPoint.X - prevPoint.X) + abs(CursorPoint.Y - prevpoint.Y) > 4 then begin @@ -389,8 +389,8 @@ exit end else begin - CursorPoint.x:= (CursorPoint.x * 7 + (round(FollowGear.X + hwSign(FollowGear.dX) * 100) + WorldDx)) div 8; - CursorPoint.y:= (CursorPoint.y * 7 + (round(FollowGear.Y) + WorldDy)) div 8 + CursorPoint.x:= (CursorPoint.x * 7 + (hwRound(FollowGear^.X + hwSign(FollowGear^.dX) * 100) + WorldDx)) div 8; + CursorPoint.y:= (CursorPoint.y * 7 + (hwRound(FollowGear^.Y) + WorldDy)) div 8 end; if ((CursorPoint.X = prevPoint.X)and(CursorPoint.Y = prevpoint.Y)) then exit; @@ -408,13 +408,13 @@ if isCursorVisible then begin - if (not CurrentTeam.ExtDriven)and(GameTicks >= PrevSentPointTime + cSendCursorPosTime) then + if (not CurrentTeam^.ExtDriven)and(GameTicks >= PrevSentPointTime + cSendCursorPosTime) then begin SendIPCXY('P', CursorPoint.X - WorldDx, CursorPoint.Y - WorldDy); PrevSentPointTime:= GameTicks end; end; - + if isCursorVisible or (FollowGear <> nil) then begin if isCursorVisible then EdgesDist:= cCursorEdgesDist @@ -447,7 +447,7 @@ CursorPoint.X:= (cScreenWidth shr 1); CursorPoint.Y:= (cScreenHeight shr 1); end; - + if cHasFocus then SDL_WarpMouse(CursorPoint.X, CursorPoint.Y); prevPoint:= CursorPoint; if WorldDy < cScreenHeight - cWaterLine - cVisibleWater then WorldDy:= cScreenHeight - cWaterLine - cVisibleWater;