# HG changeset patch # User unc0rr # Date 1152651845 0 # Node ID d2b737858ff7aebff6a556e7817e74dd348ad786 # Parent 42257fee61aed59b4a9f1b96bd119b8d66bb61ed - New First Aid powerup - New power progressbar - Less powerful Desert Eagle - Bots can use Desert Eagle - Set TurnTimeLeft to 0 when hh damaged - Bots can handle situation when ammo is over - Bots can go in different directions to reach good position, not just only go left or right - Small fixes for FillLand (use all the array) - Fixes for world geometry, get rid of one variable - Added missed in previous commit files - New test map diff -r 42257fee61ae -r d2b737858ff7 Fonts_LICENSE.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Fonts_LICENSE.txt Tue Jul 11 21:04:05 2006 +0000 @@ -0,0 +1,48 @@ +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. + +Bitstream Vera Fonts Copyright +------------------------------ + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is +a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute the +Font Software, including without limitation the rights to use, copy, merge, +publish, distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to the +following conditions: + +The above copyright and trademark notices and this permission notice shall +be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular +the designs of glyphs or characters in the Fonts may be modified and +additional glyphs or characters may be added to the Fonts, only if the fonts +are renamed to names not containing either the words "Bitstream" or the word +"Vera". + +This License becomes null and void to the extent applicable to Fonts or Font +Software that has been modified and is distributed under the "Bitstream +Vera" names. + +The Font Software may be sold as part of a larger software package but no +copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, +TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME +FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING +ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE +FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font Software +without prior written authorization from the Gnome Foundation or Bitstream +Inc., respectively. For further information, contact: fonts at gnome dot +org. diff -r 42257fee61ae -r d2b737858ff7 README.txt --- a/README.txt Sat Jul 08 21:40:03 2006 +0000 +++ b/README.txt Tue Jul 11 21:04:05 2006 +0000 @@ -5,12 +5,11 @@ images in Data/Graphics, sounds in Data/Sounds, themes "avematan", "bubbles", "tibet" -fort "Barrelhouse" -(c) 2004, 2005 Andrey Korotaev +Copyright 2004, 2005 Andrey Korotaev Fonts -(c) 1995 Gavin Helf , +See Fonts_LICENSE.txt Images in Data/Front, Data/Graphics/Graves, themes "ethereal", "norsk", "wood", "xtheme" -(c) 2005 Alexey Andreev \ No newline at end of file +Copyright 2005 Alexey Andreev \ No newline at end of file diff -r 42257fee61ae -r d2b737858ff7 hedgewars/CMakeLists.txt --- a/hedgewars/CMakeLists.txt Sat Jul 08 21:40:03 2006 +0000 +++ b/hedgewars/CMakeLists.txt Tue Jul 11 21:04:05 2006 +0000 @@ -1,3 +1,5 @@ +add_subdirectory(Data) + set(dcc32_tryexe dcc32.exe) set(ppc386_tryexe ppc386) set(hwengine_project "hwengine.dpr") @@ -28,7 +30,7 @@ message("Minimum required version of FreePascal is 1.9.2") else (ppc386_ver LESS "010902") set(pascal_compiler ${ppc386_executable}) - set(pascal_compiler_flags "-B -Sd -Xs -OG -Or -O2 -Cs2000000"${hwengine_project}) + set(pascal_compiler_flags "-B -Sd -Xs -OG -O3 -Cs2000000"${hwengine_project}) endif (ppc386_ver LESS "010902") endif (ppc386_version) endif (dcc32version) diff -r 42257fee61ae -r d2b737858ff7 hedgewars/Data/CMakeLists.txt diff -r 42257fee61ae -r d2b737858ff7 hedgewars/Data/Graphics/FirstAid.png Binary file hedgewars/Data/Graphics/FirstAid.png has changed diff -r 42257fee61ae -r d2b737858ff7 hedgewars/Data/Graphics/Power.png Binary file hedgewars/Data/Graphics/Power.png has changed diff -r 42257fee61ae -r d2b737858ff7 hedgewars/Data/Maps/test2/map.png Binary file hedgewars/Data/Maps/test2/map.png has changed diff -r 42257fee61ae -r d2b737858ff7 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Sat Jul 08 21:40:03 2006 +0000 +++ b/hedgewars/GSHandlers.inc Tue Jul 11 21:04:05 2006 +0000 @@ -73,7 +73,7 @@ begin AllInactive:= false; Gear.Y:= Gear.Y + cDrownSpeed; -if round(Gear.Y) > Gear.Radius + cWaterLine + 48 + cVisibleWater then DeleteGear(Gear) +if round(Gear.Y) > Gear.Radius + cWaterLine + cVisibleWater then DeleteGear(Gear) end; //////////////////////////////////////////////////////////////////////////////// @@ -252,9 +252,10 @@ CheckCollision(Gear); if (Gear.State and gstCollision) <> 0 then begin - AmmoShove(Gear, 25); + AmmoShove(Gear, 25, 25); doMakeExplosion(round(Gear.X), round(Gear.Y), 25, EXPLNoDamage or EXPLDoNotTouchHH); DeleteGear(Gear); + AfterAttack; exit end; dec(i) @@ -279,7 +280,7 @@ y:= round(Gear.Y); if ((y and $FFFFFC00) = 0) and ((x and $FFFFF800) = 0) and (Land[y, x] <> 0) then inc(Gear.Damage); - AmmoShove(Gear, 12); + AmmoShove(Gear, 7, 20); dec(i) until (i = 0) or (Gear.Damage > Gear.Health); if Gear.Damage > 0 then @@ -491,9 +492,9 @@ HHGear.dY:= HHGear.Y - HHGear.dY; if TestCollisionXwithGear(HHGear, Sign(HHGear.dX)) then - HHGear.dX:= -0.9 * HHGear.dX; + HHGear.dX:= -0.6 * HHGear.dX; if TestCollisionYwithGear(HHGear, Sign(HHGear.dY)) then - HHGear.dY:= -0.9 * HHGear.dY; + HHGear.dY:= -0.6 * HHGear.dY; if (Gear.Message and gm_Attack) <> 0 then if (Gear.State and gsttmpFlag) <> 0 then DeleteMe else diff -r 42257fee61ae -r d2b737858ff7 hedgewars/HHHandlers.inc --- a/hedgewars/HHHandlers.inc Sat Jul 08 21:40:03 2006 +0000 +++ b/hedgewars/HHHandlers.inc Tue Jul 11 21:04:05 2006 +0000 @@ -63,7 +63,7 @@ amUFO: FollowGear:= AddGear(round(X), round(Y), gtUFO, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor); amShotgun: begin PlaySound(sndShotgunReload); - FollowGear:= AddGear(round(X), round(Y), gtShotgunShot, 0, xx * 0.5, yy * 0.5); + CurAmmoGear:= AddGear(round(X), round(Y), gtShotgunShot, 0, xx * 0.5, yy * 0.5); end; amDEagle: begin FollowGear:= AddGear(round(X), round(Y), gtDEagleShot, 0, xx * 0.5, yy * 0.5); @@ -135,6 +135,7 @@ DeleteCI(Gear); if (TurnTimeLeft = 0) or (Gear.Damage > 0) then begin + TurnTimeLeft:= 0; if ((Gear.State and (gstMoving or gstFalling)) = 0) and (CurAmmoGear = nil) then Gear.dX:= 0.0000001 * Sign(Gear.dX); Gear.State:= Gear.State and not gstHHDriven; @@ -180,7 +181,7 @@ if ((Gear.State and gstAttacking) <> 0) and ((Gear.Message and gm_Attack) = 0) then begin Attack(Gear); - StepTicks:= 40 + StepTicks:= cHHStepTicks end; if (Gear.State and gstFalling) <> 0 then diff -r 42257fee61ae -r d2b737858ff7 hedgewars/uAI.pas --- a/hedgewars/uAI.pas Sat Jul 08 21:40:03 2006 +0000 +++ b/hedgewars/uAI.pas Tue Jul 11 21:04:05 2006 +0000 @@ -43,6 +43,7 @@ var BestActions: TActions; ThinkThread: PSDL_Thread = nil; StopThinking: boolean; + CanUseAmmo: array [TAmmoType] of boolean; procedure FreeActionsList; begin @@ -65,13 +66,11 @@ for i:= 0 to Pred(Targets.Count) do if Targets.ar[i].Score >= 0 then begin - if (CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog].AttacksNum > 0) - then with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do - a:= Ammo[CurSlot, CurAmmo].AmmoType - else a:= Low(TAmmoType); + with CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog] do + a:= Ammo[CurSlot, CurAmmo].AmmoType; aa:= a; repeat - if Assigned(AmmoTests[a]) then + if CanUseAmmo[a] then begin Score:= AmmoTests[a](Me, Targets.ar[i].Point, Time, Angle, Power, ExplX, ExplY, ExplR); if Actions.Score + Score + Targets.ar[i].Score > BestActions.Score then @@ -105,31 +104,79 @@ end; procedure Walk(Me: PGear); +const FallTicksForBranching = cHHRadius * 2 + 8; + cBranchStackSize = 8; + +type TStackEntry = record + WastedTicks: Longword; + MadeActions: TActions; + Hedgehog: TGear; + end; + +var Stack: record + Count: Longword; + States: array[0..Pred(cBranchStackSize)] of TStackEntry; + end; + + procedure Push(Ticks: Longword; const Actions: TActions; const Me: TGear; Dir: integer); + begin + if Stack.Count < cBranchStackSize then + with Stack.States[Stack.Count] do + begin + WastedTicks:= Ticks; + MadeActions:= Actions; + Hedgehog:= Me; + Hedgehog.Message:= Dir; + inc(Stack.Count) + end + end; + + procedure Pop(out Ticks: Longword; out Actions: TActions; out Me: TGear); + begin + dec(Stack.Count); + with Stack.States[Stack.Count] do + begin + Ticks:= WastedTicks; + Actions:= MadeActions; + Me:= Hedgehog + end + end; + + var Actions: TActions; - BackMe: TGear; - Dir, steps, maxsteps: integer; - BestRate, Rate: integer; + ticks, maxticks, steps: Longword; + BaseRate, BestRate, Rate: integer; + GoInfo: TGoInfo; begin -Actions.Score:= 0; Actions.Count:= 0; Actions.Pos:= 0; -BestActions.Count:= 0; -if (Me.State and gstAttacked) = 0 then maxsteps:= (TurnTimeLeft - 4000) div cHHStepTicks - else maxsteps:= TurnTimeLeft div cHHStepTicks; -BackMe:= Me^; +Actions.Score:= 0; +Stack.Count:= 0; + +Push(0, Actions, Me^, aia_Left); +Push(0, Actions, Me^, aia_Right); + +if (Me.State and gstAttacked) = 0 then maxticks:= TurnTimeLeft - 5000 + else maxticks:= TurnTimeLeft; + if (Me.State and gstAttacked) = 0 then TestAmmos(Actions, Me); BestRate:= RatePlace(Me); -for Dir:= aia_Left to aia_Right do +BaseRate:= max(BestRate, 0); + +while (Stack.Count > 0) and not StopThinking do begin - Me.Message:= Dir; + Pop(ticks, Actions, Me^); + AddAction(Actions, Me.Message, aim_push, 250); + AddAction(Actions, aia_WaitX, round(Me.X), 0); + AddAction(Actions, Me.Message, aim_release, 0); steps:= 0; - while HHGo(Me) and (steps < maxsteps) do + + while HHGo(Me, GoInfo) do begin + inc(ticks, GoInfo.Ticks); + if ticks > maxticks then break; inc(steps); - Actions.Count:= 0; - AddAction(Actions, Dir, aim_push, 250); - AddAction(Actions, aia_WaitX, round(Me.X), 0); - AddAction(Actions, Dir, aim_release, 0); + Actions.actions[Actions.Count - 2].Param:= round(Me.X); Rate:= RatePlace(Me); if Rate > BestRate then begin @@ -137,14 +184,15 @@ BestRate:= Rate; Me.State:= Me.State or gstAttacked // we have better place, go there and don't use ammo end - else if Rate < BestRate then - if BestRate > 0 then exit - else break; + else if Rate < BestRate then break; if ((Me.State and gstAttacked) = 0) and ((steps mod 4) = 0) then TestAmmos(Actions, Me); - if StopThinking then exit; + if GoInfo.FallTicks >= FallTicksForBranching then + Push(ticks, Actions, Me^, Me^.Message xor 3); // aia_Left xor 3 = aia_Right + if StopThinking then exit end; - Me^:= BackMe + + if BestRate > BaseRate then exit end end; @@ -172,8 +220,7 @@ FillBonuses(true); WalkMe:= BackMe; Walk(@WalkMe) - end; - AwareOfExplosion(0, 0, 0) + end end; Me.State:= Me.State and not gstHHThinking; @@ -181,6 +228,7 @@ end; procedure StartThink(Me: PGear); +var a: TAmmoType; begin if ((Me.State and gstAttacking) <> 0) or isInMultiShoot then exit; Me.State:= Me.State or gstHHThinking; @@ -188,6 +236,8 @@ ThinkingHH:= Me; FillTargets; FillBonuses((Me.State and gstAttacked) <> 0); +for a:= Low(TAmmoType) to High(TAmmoType) do + CanUseAmmo[a]:= Assigned(AmmoTests[a]) and HHHasAmmo(PHedgehog(Me.Hedgehog), a); {$IFDEF DEBUGFILE}AddFileLog('Enter Think Thread');{$ENDIF} ThinkThread:= SDL_CreateThread(@Think, Me) end; @@ -199,8 +249,8 @@ and ((Gear.State and gstHHDriven) <> 0) and (TurnTimeLeft < 29990) and ((Gear.State and gstHHThinking) = 0) then - if (BestActions.Pos = BestActions.Count) then StartThink(Gear) - else ProcessAction(BestActions, Gear) + if (BestActions.Pos >= BestActions.Count) then StartThink(Gear) + else ProcessAction(BestActions, Gear) end; end. diff -r 42257fee61ae -r d2b737858ff7 hedgewars/uAIActions.pas --- a/hedgewars/uAIActions.pas Sat Jul 08 21:40:03 2006 +0000 +++ b/hedgewars/uAIActions.pas Tue Jul 11 21:04:05 2006 +0000 @@ -34,7 +34,7 @@ unit uAIActions; interface uses uGears; -const MAXACTIONS = 32; +const MAXACTIONS = 96; aia_none = 0; aia_Left = 1; aia_Right = 2; diff -r 42257fee61ae -r d2b737858ff7 hedgewars/uAIAmmoTests.pas --- a/hedgewars/uAIAmmoTests.pas Sat Jul 08 21:40:03 2006 +0000 +++ b/hedgewars/uAIAmmoTests.pas Tue Jul 11 21:04:05 2006 +0000 @@ -38,6 +38,7 @@ function TestBazooka(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; function TestGrenade(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; function TestShotgun(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; +function TestDesertEagle(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; type TAmmoTestProc = function (Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; const AmmoTests: array[TAmmoType] of TAmmoTestProc = @@ -50,12 +51,12 @@ {amSkip} nil, {amRope} nil, {amMine} nil, -{amDEagle} nil, +{amDEagle} TestDesertEagle, {amDynamite} nil ); implementation -uses uMisc, uAIMisc; +uses uMisc, uAIMisc, uLand; const BadTurn = Low(integer); function Metric(x1, y1, x2, y2: integer): integer; @@ -199,4 +200,33 @@ Result:= BadTurn end; +function TestDesertEagle(Me: PGear; Targ: TPoint; out Time: Longword; out Angle, Power: integer; out ExplX, ExplY, ExplR: integer): integer; +var Vx, Vy, x, y, t: real; + d: Longword; +begin +if abs(Me.X - Targ.X) + abs(Me.Y - Targ.Y) < 80 then + begin + Result:= BadTurn; + exit + end; +Time:= 0; +Power:= 1; +ExplR:= 0; +t:= sqrt(sqr(Targ.X - Me.X) + sqr(Targ.Y - Me.Y)) * 2; +Vx:= (Targ.X - Me.X) / t; +Vy:= (Targ.Y - Me.Y) / t; +x:= Me.X; +y:= Me.Y; +Angle:= DxDy2AttackAngle(Vx, -Vy); +d:= 0; +repeat + x:= x + vX; + y:= y + vY; + if ((round(x) and $FFFFF800) = 0)and((round(y) and $FFFFFC00) = 0) + and (Land[round(y), round(x)] <> 0) then inc(d); +until (abs(Targ.X - x) + abs(Targ.Y - y) < 2) or (x < 0) or (y < 0) or (x > 2048) or (y > 1024) or (d > 200); +if abs(Targ.X - x) + abs(Targ.Y - y) < 2 then Result:= max(0, (4 - d div 50) * 7 * 1024) + else Result:= Low(integer) +end; + end. diff -r 42257fee61ae -r d2b737858ff7 hedgewars/uAIMisc.pas --- a/hedgewars/uAIMisc.pas Sat Jul 08 21:40:03 2006 +0000 +++ b/hedgewars/uAIMisc.pas Tue Jul 11 21:04:05 2006 +0000 @@ -43,6 +43,10 @@ Count: Longword; ar: array[0..cMaxHHIndex*5] of TTarget; end; + TGoInfo = record + Ticks: Longword; + FallTicks: Longword; + end; procedure FillTargets; procedure FillBonuses(isAfterAttack: boolean); @@ -51,7 +55,7 @@ function DxDy2AttackAngle(const _dY, _dX: Extended): integer; function TestColl(x, y, r: integer): boolean; function RateExplosion(Me: PGear; x, y, r: integer): integer; -function HHGo(Gear: PGear): boolean; +function HHGo(Gear: PGear; out GoInfo: TGoInfo): boolean; var ThinkingHH: PGear; Targets: TTargets; @@ -212,23 +216,34 @@ Result:= Result * 1024 end; -function HHGo(Gear: PGear): boolean; +function HHGo(Gear: PGear; out GoInfo: TGoInfo): boolean; var pX, pY: integer; begin Result:= false; +GoInfo.Ticks:= 0; +GoInfo.FallTicks:= 0; repeat pX:= round(Gear.X); pY:= round(Gear.Y); if pY + cHHRadius >= cWaterLine then exit; if (Gear.State and gstFalling) <> 0 then begin + inc(GoInfo.Ticks); Gear.dY:= Gear.dY + cGravity; - if Gear.dY > 0.40 then exit; + if Gear.dY > 0.40 then + begin + Goinfo.FallTicks:= 0; + exit + end; Gear.Y:= Gear.Y + Gear.dY; + if round(Gear.Y) > pY then inc(GoInfo.FallTicks); if TestCollisionYwithGear(Gear, 1) then begin + inc(GoInfo.Ticks, 300); Gear.State:= Gear.State and not (gstFalling or gstHHJumping); - Gear.dY:= 0 + Gear.dY:= 0; + Result:= true; + exit end; continue end; @@ -265,7 +280,11 @@ or TestCollisionYwithGear(Gear, -1)) then Gear.Y:= Gear.Y - 1; end; - if not TestCollisionXwithGear(Gear, Sign(Gear.dX)) then Gear.X:= Gear.X + Gear.dX; + if not TestCollisionXwithGear(Gear, Sign(Gear.dX)) then + begin + Gear.X:= Gear.X + Gear.dX; + inc(GoInfo.Ticks, cHHStepTicks) + end; if not TestCollisionYwithGear(Gear, 1) then begin Gear.Y:= Gear.Y + 1; @@ -297,11 +316,11 @@ end end end; -if (pX <> round(Gear.X))and ((Gear.State and gstFalling) = 0) then +if (pX <> round(Gear.X)) and ((Gear.State and gstFalling) = 0) then begin Result:= true; exit - end; + end until (pX = round(Gear.X)) and (pY = round(Gear.Y)) and ((Gear.State and gstFalling) = 0); end; diff -r 42257fee61ae -r d2b737858ff7 hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Sat Jul 08 21:40:03 2006 +0000 +++ b/hedgewars/uConsts.pas Tue Jul 11 21:04:05 2006 +0000 @@ -244,7 +244,7 @@ (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: 32; Height: 32; hasAlpha: false),// sprFAid + (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 ); @@ -336,7 +336,7 @@ TimeAfterTurn: 3000), (Name: 'Desert Eagle'; Ammo: (Propz: 0; - Count: AMMO_INFINITE; + Count: 3; NumPerTurn: 3; Timer: 0; AmmoType: amDEagle); diff -r 42257fee61ae -r d2b737858ff7 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Sat Jul 08 21:40:03 2006 +0000 +++ b/hedgewars/uGears.pas Tue Jul 11 21:04:05 2006 +0000 @@ -89,7 +89,7 @@ procedure DeleteGear(Gear: PGear); forward; procedure doMakeExplosion(X, Y, Radius: integer; Mask: LongWord); forward; -procedure AmmoShove(Ammo: PGear; Power: integer); forward; +procedure AmmoShove(Ammo: PGear; Damage, Power: integer); forward; function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: integer): PGear; forward; procedure SpawnBoxOfSmth; forward; procedure AfterAttack; forward; @@ -196,7 +196,7 @@ Result.Timer:= 3000; end; gtCase: begin - Result.Radius:= 14; + Result.Radius:= 16; Result.Elasticity:= 0.6 end; gtDEagleShot: begin @@ -497,7 +497,7 @@ 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) - 16 + WorldDx, Round(Gear.Y) - 16 + WorldDy, (GameTicks shr 6) and $F, Surface); + posCaseHealth: DrawSprite(sprFAid, Round(Gear.X) - 24 + WorldDx, Round(Gear.Y) - 24 + WorldDy, (GameTicks shr 6) mod 13, Surface); end; end; Gear:= Gear.NextGear @@ -569,7 +569,7 @@ end end; -procedure AmmoShove(Ammo: PGear; Power: integer); +procedure AmmoShove(Ammo: PGear; Damage, Power: integer); var t: PGearArray; i: integer; Gear: PGear; @@ -583,7 +583,7 @@ gtHedgehog, gtMine, gtCase: begin - inc(t.ar[i].Damage, Power); + inc(t.ar[i].Damage, Damage); t.ar[i].dX:= Ammo.dX * Power * 0.01; t.ar[i].dY:= Ammo.dY * Power * 0.01; t.ar[i].Active:= true; diff -r 42257fee61ae -r d2b737858ff7 hedgewars/uLand.pas --- a/hedgewars/uLand.pas Sat Jul 08 21:40:03 2006 +0000 +++ b/hedgewars/uLand.pas Tue Jul 11 21:04:05 2006 +0000 @@ -203,6 +203,7 @@ procedure Push(_xl, _xr, _y, _dir: integer); begin + TryDo(Stack.Count <= 8192, 'FillLand: stack overflow', true); _y:= _y + _dir; if (_y < 0) or (_y > 1023) then exit; with Stack.points[Stack.Count] do @@ -212,8 +213,7 @@ y:= _y; dir:= _dir end; - inc(Stack.Count); - TryDo(Stack.Count < 8192, 'stack overflow', true) + inc(Stack.Count) end; procedure Pop(out _xl, _xr, _y, _dir: integer); diff -r 42257fee61ae -r d2b737858ff7 hedgewars/uMisc.pas --- a/hedgewars/uMisc.pas Sat Jul 08 21:40:03 2006 +0000 +++ b/hedgewars/uMisc.pas Tue Jul 11 21:04:05 2006 +0000 @@ -48,7 +48,6 @@ TurnTimeLeft : Longword = 0; cHedgehogTurnTime: Longword = 30000; - cLandYShift : integer = 1088; cCloudsNumber : integer = 9; cConsoleHeight : integer = 320; cConsoleYAdd : integer = 0; @@ -59,7 +58,7 @@ cBitsStr : string[2] = '16'; cWaterLine : integer = 1024; - cVisibleWater : integer = 64; + cVisibleWater : integer = 128; cScreenEdgesDist : integer = 240; cTeamHealthWidth : integer = 128; diff -r 42257fee61ae -r d2b737858ff7 hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Sat Jul 08 21:40:03 2006 +0000 +++ b/hedgewars/uTeams.pas Tue Jul 11 21:04:05 2006 +0000 @@ -77,6 +77,7 @@ procedure SwitchHedgehog; procedure InitTeams; procedure OnUsedAmmo(Ammo: PHHAmmo); +function HHHasAmmo(Hedgehog: PHedgehog; Ammo: TAmmoType): boolean; function TeamSize(p: PTeam): Longword; procedure RecountTeamHealth(team: PTeam); procedure RestoreTeamsFromSave; @@ -286,6 +287,20 @@ end end; +function HHHasAmmo(Hedgehog: PHedgehog; Ammo: TAmmoType): boolean; +var slot, ami: integer; +begin +Slot:= Ammoz[Ammo].Slot; +ami:= 0; +Result:= false; +while (not Result) and (ami <= cMaxSlotAmmoIndex) do + begin + with Hedgehog.Ammo[Slot, ami] do + if (AmmoType = Ammo) and (Count > 0) then Result:= true; + inc(ami) + end +end; + function TeamSize(p: PTeam): Longword; var i: Longword; begin diff -r 42257fee61ae -r d2b737858ff7 hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Sat Jul 08 21:40:03 2006 +0000 +++ b/hedgewars/uWorld.pas Tue Jul 11 21:04:05 2006 +0000 @@ -69,7 +69,6 @@ procedure InitWorld; begin -cLandYShift:= cWaterLine + 64; cWaterSprCount:= 1 + cScreenWidth div (SpritesData[sprWater].Width); cScreenEdgesDist:= Min(cScreenWidth div 4, cScreenHeight div 4); SDL_WarpMouse(cScreenWidth div 2, cScreenHeight div 2); @@ -190,8 +189,8 @@ tdx:= Sign(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 * (32 + i * 2)) - 16, - round(Gear.Y + WorldDy + tdy * (32 + i * 2)) - 12, + DrawSprite(sprPower, round(Gear.X + WorldDx + tdx * (24 + i * 2)) - 16, + round(Gear.Y + WorldDy + tdy * (24 + i * 2)) - 12, i, Surface) end end; @@ -383,7 +382,7 @@ end; SDL_WarpMouse(CursorPoint.X, CursorPoint.Y); prevPoint:= CursorPoint; -if WorldDy < cScreenHeight - cLandYShift - cVisibleWater then WorldDy:= cScreenHeight - cLandYShift - cVisibleWater; +if WorldDy < cScreenHeight - cWaterLine - cVisibleWater then WorldDy:= cScreenHeight - cWaterLine - cVisibleWater; if WorldDy > 2048 then WorldDy:= 2048; if WorldDx < -2048 then WorldDx:= -2048; if WorldDx > cScreenWidth then WorldDx:= cScreenWidth;