# HG changeset patch # User nemo # Date 1336018858 14400 # Node ID 10a0a31804f303258d9143f21bcf011d2d1b6277 # Parent 0ccdff4ae8e9a4cb0a97ad486721fec27476f512 Switch effects to longint for convenience of tracking ice states. I could add a new Hedgehog value, but since we have this effects list being all useless as booleans anyway... diff -r 0ccdff4ae8e9 -r 10a0a31804f3 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Wed May 02 19:16:12 2012 -0400 +++ b/hedgewars/GSHandlers.inc Thu May 03 00:20:58 2012 -0400 @@ -5089,7 +5089,7 @@ DeleteGear(graves[i]); RenderHealth(resgear^.Hedgehog^); RecountTeamHealth(resgear^.Hedgehog^.Team); - resgear^.Hedgehog^.Effects[heResurrected]:= true; + resgear^.Hedgehog^.Effects[heResurrected]:= 1; // only make hat-less hedgehogs look like zombies, preserve existing hats if resgear^.Hedgehog^.Hat = 'NoHat' then @@ -5420,15 +5420,64 @@ (* WIP. The ice gun will have the following effects. It has been proposed by sheepluva that it take the appearance of a large freezer -spewing ice cubes. The cubes will probably be visual gears only, although if they were gear particles, it could allow for impacting targets in a spray. +spewing ice cubes. The cubes will be visual gears only. The scatter from them and the impact snow dust should help hide imprecisions in things like the GearsNear effect. For now we assume a "ray" like a deagle projected out from the gun. All these effects assume the ray's angle is not changed and that the target type was unchanged over a number of ticks. This is a simplifying assumption for "gun was applying freezing effect to the same target". * When fired at water a layer of ice textured land is added above the water. - * When fired at non-ice land (land and $FF00 and not lfIce) the land is overlaid with a thin layer of ice textured land near that point. For attractiveness, a slope would probably be needed. + * When fired at non-ice land (land and $FF00 and not lfIce) the land is overlaid with a thin layer of ice textured land around that point (say, 1 or 2px into land, 1px above). For attractiveness, a slope would probably be needed. * When fired at a hog (land and $00FF <> 0), while the hog is targetted, the hog's state is set to frozen. As long as the gun is on the hog, a frozen hog sprite creeps up from the feet to the head. If the effect is interrupted before reaching the top, the freezing state is cleared. A frozen hog will animate differently. To be decided, but possibly in a similar fashion to a grave when it comes to explosions. The hog might (possibly) not be damaged by explosions. This might make freezing potentially useful for friendlies in a bad position. It might be better to allow damage though. A frozen hog stays frozen for a certain number of turns. Each turn the frozen overlay becomes fainter, until it fades and the hog animates normally again. *) procedure doStepIceGun(Gear: PGear); +var + HHGear, iter: PGear; + ndX, ndY: hwFloat; + gX, gY: LongInt; begin + with Gear^ do + begin + HHGear := Hedgehog^.Gear; + HedgehogChAngle(HHGear); + ndX:= SignAs(AngleSin(HHGear^.Angle), HHGear^.dX); + ndY:= -AngleCos(HHGear^.Angle); + if (ndX <> dX) or (ndY <> dY) then + begin + Pos:= 0; + Target.X:= NoPointX; + LastDamage:= nil; + X:= HHGear^.X; + Y:= HHGear^.Y; +// unfreeze all semifrozen hogs + iter := GearsList; + while iter <> nil do + begin + if (iter^.Kind = gtHedgehog) and + (iter^.Hedgehog^.Effects[heFrozen] < 0) then + iter^.Hedgehog^.Effects[heFrozen]:= 0; + iter:= iter^.NextGear; + end; + end + else + begin + gX:= hwRound(X); + gY:= hwRound(Y); + X:= X + dX; + Y:= Y + dY; + if Target.X <> NoPointX then + inc(Pos) + else if (gY > cWaterLine) or + (((gX and LAND_WIDTH_MASK = 0) and (gY and LAND_HEIGHT_MASK = 0)) + and ((Land[gY, gX] and $FF00 and not lfIce <> 0) or + (Land[gY, gX] and $00FF <> 0))) then + begin + Target.X:= gX; + Target.Y:= gY; + if Land[gY, gX] and $00FF <> 0 then // locate and tag hogs + begin + //GearsNear(X, Y, gtHedgehog, Radius); + end; + end + end + end; end; diff -r 0ccdff4ae8e9 -r 10a0a31804f3 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Wed May 02 19:16:12 2012 -0400 +++ b/hedgewars/uGears.pas Thu May 03 00:20:58 2012 -0400 @@ -110,7 +110,7 @@ dec(Gear^.Health, dmg); if (Gear^.Hedgehog^.Team = CurrentTeam) and (Gear^.Damage <> Gear^.Karma) - and (not Gear^.Hedgehog^.King) and (not Gear^.Hedgehog^.Effects[hePoisoned]) and (not SuddenDeathDmg) then + and (not Gear^.Hedgehog^.King) and (Gear^.Hedgehog^.Effects[hePoisoned] = 0) and (not SuddenDeathDmg) then Gear^.State:= Gear^.State or gstLoser; spawnHealthTagForHH(Gear, dmg); @@ -141,7 +141,7 @@ if Gear^.Kind = gtHedgehog then begin tmp:= 0; - if Gear^.Hedgehog^.Effects[hePoisoned] then + if Gear^.Hedgehog^.Effects[hePoisoned] <> 0 then begin inc(tmp, ModifyDamage(5, Gear)); if (GameFlags and gfResetHealth) <> 0 then diff -r 0ccdff4ae8e9 -r 10a0a31804f3 hedgewars/uGearsHedgehog.pas --- a/hedgewars/uGearsHedgehog.pas Wed May 02 19:16:12 2012 -0400 +++ b/hedgewars/uGearsHedgehog.pas Thu May 03 00:20:58 2012 -0400 @@ -356,6 +356,7 @@ //amMelonStrike: AddGear(CurWeapon^.Pos, 0, gtAirAttack, 4, _0, _0, 0); amStructure: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtStructure, gstWait, SignAs(_0_02, dX), _0, 3000); amTardis: newGear:= AddGear(hwRound(X), hwRound(Y), gtTardis, 0, _0, _0, 5000); + amIceGun: newGear:= AddGear(hwRound(X), hwRound(Y), gtIceGun, 0, _0, _0, 0); end; case CurAmmoType of @@ -379,7 +380,8 @@ amJetpack, amBirdy, amFlamethrower, amLandGun, amResurrector, amStructure, - amTardis, amPiano: CurAmmoGear:= newGear; + amTardis, amPiano, + amIceGun: CurAmmoGear:= newGear; end; if ((CurAmmoType = amMine) or (CurAmmoType = amSMine)) and (GameFlags and gfInfAttack <> 0) then @@ -611,7 +613,7 @@ end; posCaseHealth: begin inc(HH^.Health, Gear^.Health); - HH^.Hedgehog^.Effects[hePoisoned] := false; + HH^.Hedgehog^.Effects[hePoisoned] := 0; str(Gear^.Health, s); s:= '+' + s; AddCaption(s, HH^.Hedgehog^.Team^.Clan^.Color, capgrpAmmoinfo); @@ -1157,8 +1159,8 @@ if (Gear^.State and gstHHGone) = 0 then begin - Gear^.Hedgehog^.Effects[hePoisoned] := false; - if Gear^.Hedgehog^.Effects[heResurrectable] then + Gear^.Hedgehog^.Effects[hePoisoned] := 0; + if Gear^.Hedgehog^.Effects[heResurrectable] <> 0 then begin ResurrectHedgehog(Gear); end diff -r 0ccdff4ae8e9 -r 10a0a31804f3 hedgewars/uGearsList.pas --- a/hedgewars/uGearsList.pas Wed May 02 19:16:12 2012 -0400 +++ b/hedgewars/uGearsList.pas Thu May 03 00:20:58 2012 -0400 @@ -148,7 +148,7 @@ gear^.Z:= cHHZ; if (GameFlags and gfAISurvival) <> 0 then if gear^.Hedgehog^.BotLevel > 0 then - gear^.Hedgehog^.Effects[heResurrectable] := true; + gear^.Hedgehog^.Effects[heResurrectable] := 0; end; gtShell: begin gear^.Radius:= 4; @@ -541,8 +541,8 @@ inc(KilledHHs); RecountTeamHealth(team); - if (CurrentHedgehog <> nil) and CurrentHedgehog^.Effects[heResurrectable] and - (not Gear^.Hedgehog^.Effects[heResurrectable]) then + if (CurrentHedgehog <> nil) and (CurrentHedgehog^.Effects[heResurrectable] <> 0) and + (Gear^.Hedgehog^.Effects[heResurrectable] = 0) then with CurrentHedgehog^ do begin inc(Team^.stats.AIKills); diff -r 0ccdff4ae8e9 -r 10a0a31804f3 hedgewars/uGearsRender.pas --- a/hedgewars/uGearsRender.pas Wed May 02 19:16:12 2012 -0400 +++ b/hedgewars/uGearsRender.pas Thu May 03 00:20:58 2012 -0400 @@ -232,7 +232,7 @@ HatVisible:= false; - if HH^.Effects[hePoisoned] then + if HH^.Effects[hePoisoned] <> 0 then begin Tint($00, $FF, $40, $40); DrawTextureRotatedF(SpritesData[sprSmokeWhite].texture, 2, 0, 0, sx, sy, 0, 1, 22, 22, (RealTicks shr 36) mod 360); @@ -877,12 +877,12 @@ end end; - if HH^.Effects[hePoisoned] then + if HH^.Effects[hePoisoned] <> 0 then begin Tint($00, $FF, $40, $80); DrawTextureRotatedF(SpritesData[sprSmokeWhite].texture, 1.5, 0, 0, sx, sy, 0, 1, 22, 22, 360 - (RealTicks shr 37) mod 360); end; - if HH^.Effects[heResurrected] then + if HH^.Effects[heResurrected] <> 0 then begin Tint($f5, $db, $35, $20); DrawSprite(sprVampiric, sx - 24, sy - 24, 0); @@ -914,8 +914,10 @@ if Gear^.Target.X <> NoPointX then if Gear^.AmmoType = amBee then DrawSpriteRotatedF(sprTargetBee, Gear^.Target.X + WorldDx, Gear^.Target.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360) - else - DrawSpriteRotatedF(sprTargetP, Gear^.Target.X + WorldDx, Gear^.Target.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360); + else if Gear^.AmmoType = amIceGun then + DrawSprite(sprSnowDust, Gear^.Target.X + WorldDx, Gear^.Target.Y + WorldDy, (RealTicks shr 3) mod 360) + else + DrawSpriteRotatedF(sprTargetP, Gear^.Target.X + WorldDx, Gear^.Target.Y + WorldDy, 0, 0, (RealTicks shr 3) mod 360); case Gear^.Kind of gtGrenade: DrawSpriteRotated(sprBomb, x, y, 0, Gear^.DirAngle); diff -r 0ccdff4ae8e9 -r 10a0a31804f3 hedgewars/uGearsUtils.pas --- a/hedgewars/uGearsUtils.pas Wed May 02 19:16:12 2012 -0400 +++ b/hedgewars/uGearsUtils.pas Thu May 03 00:20:58 2012 -0400 @@ -132,7 +132,7 @@ if Gear^.Kind <> gtFlame then FollowGear:= Gear end; if ((Mask and EXPLPoisoned) <> 0) and (Gear^.Kind = gtHedgehog) and (not Gear^.Invulnerable) then - Gear^.Hedgehog^.Effects[hePoisoned] := true; + Gear^.Hedgehog^.Effects[hePoisoned] := 1; end; end; @@ -371,7 +371,7 @@ and (Gear^.Kind <> gtDEagleShot) and (Gear^.Kind <> gtSineGunShot) then if Gear^.Kind = gtHedgehog then begin - if Gear^.Hedgehog^.Effects[heResurrectable] then + if Gear^.Hedgehog^.Effects[heResurrectable] <> 0 then ResurrectHedgehog(Gear) else begin @@ -449,8 +449,8 @@ gear^.dY := _0; gear^.Damage := 0; gear^.Health := gear^.Hedgehog^.InitialHealth; - gear^.Hedgehog^.Effects[hePoisoned] := false; - if not CurrentHedgehog^.Effects[heResurrectable] then + gear^.Hedgehog^.Effects[hePoisoned] := 0; + if CurrentHedgehog^.Effects[heResurrectable] = 0 then with CurrentHedgehog^ do begin inc(Team^.stats.AIKills); @@ -593,7 +593,7 @@ begin OutError('Can''t find place for Gear', false); if Gear^.Kind = gtHedgehog then - Gear^.Hedgehog^.Effects[heResurrectable] := false; + Gear^.Hedgehog^.Effects[heResurrectable] := 0; DeleteGear(Gear); Gear:= nil end diff -r 0ccdff4ae8e9 -r 10a0a31804f3 hedgewars/uScript.pas --- a/hedgewars/uScript.pas Wed May 02 19:16:12 2012 -0400 +++ b/hedgewars/uScript.pas Thu May 03 00:20:58 2012 -0400 @@ -1103,7 +1103,7 @@ else begin gear := GearByUID(lua_tointeger(L, 1)); if (gear <> nil) and (gear^.Hedgehog <> nil) then - gear^.Hedgehog^.Effects[THogEffect(lua_tointeger(L, 2))]:= lua_toboolean(L, 3); + gear^.Hedgehog^.Effects[THogEffect(lua_tointeger(L, 2))]:= lua_tointeger(L, 3); end; lc_seteffect := 0; end; @@ -1118,9 +1118,9 @@ begin gear:= GearByUID(lua_tointeger(L, 1)); if (gear <> nil) and (gear^.Hedgehog <> nil) then - lua_pushboolean(L, gear^.Hedgehog^.Effects[THogEffect(lua_tointeger(L, 2))]) + lua_pushinteger(L, gear^.Hedgehog^.Effects[THogEffect(lua_tointeger(L, 2))]) else - lua_pushboolean(L, false) + lua_pushinteger(L, 0) end; lc_geteffect:= 1 end; diff -r 0ccdff4ae8e9 -r 10a0a31804f3 hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Wed May 02 19:16:12 2012 -0400 +++ b/hedgewars/uTeams.pas Thu May 03 00:20:58 2012 -0400 @@ -384,7 +384,7 @@ begin Hedgehogs[0].King:= true; Hedgehogs[0].Hat:= 'crown'; - Hedgehogs[0].Effects[hePoisoned] := false; + Hedgehogs[0].Effects[hePoisoned] := 0; h:= Hedgehogs[0].Gear^.Health; Hedgehogs[0].Gear^.Health:= hwRound(int2hwFloat(th)*_0_375); if Hedgehogs[0].Gear^.Health > h then diff -r 0ccdff4ae8e9 -r 10a0a31804f3 hedgewars/uTypes.pas --- a/hedgewars/uTypes.pas Wed May 02 19:16:12 2012 -0400 +++ b/hedgewars/uTypes.pas Thu May 03 00:20:58 2012 -0400 @@ -209,7 +209,7 @@ PrevTexture, NextTexture: PTexture; end; - THogEffect = (heInvulnerable, heResurrectable, hePoisoned, heResurrected); + THogEffect = (heInvulnerable, heResurrectable, hePoisoned, heResurrected, heFrozen); TScreenFade = (sfNone, sfInit, sfToBlack, sfFromBlack, sfToWhite, sfFromWhite); @@ -347,7 +347,7 @@ King: boolean; // Flag for a bunch of hedgehog attributes Unplaced: boolean; // Flag for hog placing mode Timer: Longword; - Effects: array[THogEffect] of boolean; + Effects: array[THogEffect] of LongInt; end; TTeam = record