# HG changeset patch # User nemo # Date 1383970287 18000 # Node ID 4054960f837aa1e9bca540e98a2c2d66adfe35f1 # Parent 7d925e82e572f743394d294f9874815939113e39# Parent 50a001b1964ea2b91a4ef3966cc4f11fcbc4c28d merge diff -r 50a001b1964e -r 4054960f837a hedgewars/uGears.pas --- a/hedgewars/uGears.pas Fri Nov 08 12:00:47 2013 +0400 +++ b/hedgewars/uGears.pas Fri Nov 08 23:11:27 2013 -0500 @@ -78,7 +78,7 @@ begin if (not isInMultiShoot) then inc(Gear^.Damage, Gear^.Karma); - if (Gear^.Damage <> 0) and (not Gear^.Invulnerable) then + if (Gear^.Damage <> 0) and ((Gear^.Hedgehog^.Effects[heInvulnerable] = 0)) then begin CheckNoDamage:= false; @@ -510,7 +510,7 @@ if (Gear <> nil) then begin if (GameFlags and gfInvulnerable) = 0 then - Gear^.Invulnerable:= false; + Gear^.Hedgehog^.Effects[heInvulnerable]:= 0; end; end; t:= GearsList; @@ -564,7 +564,7 @@ end; procedure AddMiscGears; -var i,rx, ry: Longword; +var p,i,j,rx, ry: Longword; rdx, rdy: hwFloat; Gear: PGear; begin @@ -599,11 +599,13 @@ Gear:= GearsList; if (GameFlags and gfInvulnerable) <> 0 then - while Gear <> nil do - begin - Gear^.Invulnerable:= true; // this is only checked on hogs right now, so no need for gear type check - Gear:= Gear^.NextGear - end; + for p:= 0 to Pred(ClansCount) do + with ClansArray[p]^ do + for j:= 0 to Pred(TeamsNumber) do + with Teams[j]^ do + for i:= 0 to cMaxHHIndex do + with Hedgehogs[i] do + Effects[heInvulnerable]:= 1; if (GameFlags and gfLaserSight) <> 0 then cLaserSighting:= true; diff -r 50a001b1964e -r 4054960f837a hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Fri Nov 08 12:00:47 2013 +0400 +++ b/hedgewars/uGearsHandlersMess.pas Fri Nov 08 23:11:27 2013 -0500 @@ -208,7 +208,7 @@ if (gi^.Kind = gtHedgehog) then begin d := r - hwRound(Distance(gi^.X - x, gi^.Y - y)); - if (d > 1) and (not gi^.Invulnerable) and (GetRandom(2) = 0) then + if (d > 1) and ((gi^.Hedgehog^.Effects[heInvulnerable] = 0)) and (GetRandom(2) = 0) then begin if (CurrentHedgehog^.Gear = gi) then PlaySoundV(sndOops, gi^.Hedgehog^.Team^.voicepack) @@ -2826,7 +2826,7 @@ dmg:= dmgBase - max(hwRound(Distance(tdX, tdY)),gi^.Radius); if (dmg > 1) then dmg:= ModifyDamage(min(dmg div 2, cakeDmg), gi); if (dmg > 1) then - if (CurrentHedgehog^.Gear = gi) and (not gi^.Invulnerable) then + if (CurrentHedgehog^.Gear = gi) and ((gi^.Hedgehog^.Effects[heInvulnerable] = 0)) then gi^.State := gi^.State or gstLoser else gi^.State := gi^.State or gstWinner; @@ -4734,7 +4734,7 @@ if (tmp^.Kind = gtHedgehog) or (tmp^.Kind = gtMine) or (tmp^.Kind = gtExplosives) then begin //tmp^.State:= tmp^.State or gstFlatened; - if not tmp^.Invulnerable then + if (tmp^.Hedgehog^.Effects[heInvulnerable] = 0) then ApplyDamage(tmp, CurrentHedgehog, tmp^.Health div 3, dsUnknown); //DrawTunnel(tmp^.X, tmp^.Y - _1, _0, _0_5, cHHRadius * 6, cHHRadius * 3); tmp2:= AddGear(hwRound(tmp^.X), hwRound(tmp^.Y), gtHammerHit, 0, _0, _0, 0); @@ -5075,7 +5075,7 @@ while t <> nil do begin if (t^.Kind = gtHedgehog) and (t^.Hedgehog^.Team^.Clan = HH^.Team^.Clan) then - t^.Invulnerable:= true; + t^.Hedgehog^.Effects[heInvulnerable]:= 1; t:= t^.NextGear; end; end; diff -r 50a001b1964e -r 4054960f837a hedgewars/uGearsHandlersRope.pas --- a/hedgewars/uGearsHandlersRope.pas Fri Nov 08 12:00:47 2013 +0400 +++ b/hedgewars/uGearsHandlersRope.pas Fri Nov 08 23:11:27 2013 -0500 @@ -157,7 +157,7 @@ ropeDx := HHGear^.X - Gear^.X; ropeDy := HHGear^.Y - Gear^.Y; - if TestCollisionYwithGear(HHGear, 1) = 0 then + if not TestCollisionYwithXYShift(HHGear, 0, 1, 1) then begin // depending on the rope vector we know which X-side to check for collision @@ -168,7 +168,7 @@ cd:= 1; // apply gravity if there is no obstacle - if not TestCollisionXwithGear(HHGear, cd) then + if not (TestCollisionXwithXYShift(HHGear, _2*cd, 0, cd, true)) then HHGear^.dY := HHGear^.dY + cGravity * 16; if (GameFlags and gfMoreWind) <> 0 then @@ -193,13 +193,13 @@ ty := HHGear^.Y; if ((Gear^.Message and gmDown) <> 0) and (Gear^.Elasticity < Gear^.Friction) then - if not (TestCollisionXwithGear(HHGear, hwSign(ropeDx)) - or ((ropeDy.QWordValue <> 0) and TestCollisionYwithXYShift(HHGear, 0, 1, hwSign(ropeDy)))) then + if not (TestCollisionXwithXYShift(HHGear, _2*hwSign(ropeDx), 0, hwSign(ropeDx), true) + or ((ropeDy.QWordValue <> 0) and TestCollisionYwithXYShift(HHGear, 0, 1*hwSign(ropeDy), hwSign(ropeDy)))) then Gear^.Elasticity := Gear^.Elasticity + _1_2; if ((Gear^.Message and gmUp) <> 0) and (Gear^.Elasticity > _30) then - if not (TestCollisionXwithGear(HHGear, -hwSign(ropeDx)) - or ((ropeDy.QWordValue <> 0) and TestCollisionYwithXYShift(HHGear, 0, 1, -hwSign(ropeDy)))) then + if not (TestCollisionXwithXYShift(HHGear, -_2*hwSign(ropeDx), 0, -hwSign(ropeDx), true) + or ((ropeDy.QWordValue <> 0) and TestCollisionYwithXYShift(HHGear, 0, 1*-hwSign(ropeDy), -hwSign(ropeDy)))) then Gear^.Elasticity := Gear^.Elasticity - _1_2; HHGear^.X := Gear^.X + mdX * Gear^.Elasticity; @@ -315,12 +315,12 @@ end; haveCollision := false; - if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then + if TestCollisionXwithXYShift(HHGear, _2*hwSign(HHGear^.dX), 0, hwSign(HHGear^.dX), true) then begin HHGear^.dX := -_0_6 * HHGear^.dX; haveCollision := true end; - if TestCollisionYwithXYShift(HHGear, 0, 1, hwSign(HHGear^.dY)) then + if TestCollisionYwithXYShift(HHGear, 0, 1*hwSign(HHGear^.dY), hwSign(HHGear^.dY)) then begin HHGear^.dY := -_0_6 * HHGear^.dY; haveCollision := true diff -r 50a001b1964e -r 4054960f837a hedgewars/uGearsHedgehog.pas --- a/hedgewars/uGearsHedgehog.pas Fri Nov 08 12:00:47 2013 +0400 +++ b/hedgewars/uGearsHedgehog.pas Fri Nov 08 23:11:27 2013 -0500 @@ -377,7 +377,7 @@ PlaySound(sndHellishImpact4); cDamageModifier:= _1_5 end; - amInvulnerable: Invulnerable:= true; + amInvulnerable: Effects[heInvulnerable]:= 1; amExtraTime: begin PlaySound(sndSwitchHog); TurnTimeLeft:= TurnTimeLeft + 30000 diff -r 50a001b1964e -r 4054960f837a hedgewars/uGearsRender.pas --- a/hedgewars/uGearsRender.pas Fri Nov 08 12:00:47 2013 +0400 +++ b/hedgewars/uGearsRender.pas Fri Nov 08 23:11:27 2013 -0500 @@ -948,7 +948,7 @@ DrawSprite(sprVampiric, sx - 24, sy - 24, 0); end; - if Gear^.Invulnerable then + if (Gear^.Hedgehog^.Effects[heInvulnerable] <> 0) then begin Tint($FF, $FF, $FF, max($40, round($FF * abs(1 - ((RealTicks div 2 + Gear^.uid * 491) mod 1500) / 750)))); DrawSprite(sprInvulnerable, sx - 24, sy - 24, 0); diff -r 50a001b1964e -r 4054960f837a hedgewars/uGearsUtils.pas --- a/hedgewars/uGearsUtils.pas Fri Nov 08 12:00:47 2013 +0400 +++ b/hedgewars/uGearsUtils.pas Fri Nov 08 23:11:27 2013 -0500 @@ -135,7 +135,7 @@ //AddFileLog('Damage: ' + inttostr(dmg)); if (Mask and EXPLNoDamage) = 0 then begin - if not Gear^.Invulnerable then + if Gear^.Hedgehog^.Effects[heInvulnerable] = 0 then ApplyDamage(Gear, AttackingHog, dmg, dsExplosion) else Gear^.State:= Gear^.State or gstWinner; @@ -148,12 +148,12 @@ Gear^.State:= (Gear^.State or gstMoving) and (not gstLoser); if Gear^.Kind = gtKnife then Gear^.State:= Gear^.State and (not gstCollision); - if not Gear^.Invulnerable then + if Gear^.Hedgehog^.Effects[heInvulnerable] = 0 then Gear^.State:= (Gear^.State or gstMoving) and (not gstWinner); Gear^.Active:= true; if Gear^.Kind <> gtFlame then FollowGear:= Gear end; - if ((Mask and EXPLPoisoned) <> 0) and (Gear^.Kind = gtHedgehog) and (not Gear^.Invulnerable) and ((Gear^.State and gstHHDeath) = 0) then + if ((Mask and EXPLPoisoned) <> 0) and (Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog^.Effects[heInvulnerable] = 0) and (Gear^.State and gstHHDeath = 0) then Gear^.Hedgehog^.Effects[hePoisoned] := 1; end; @@ -249,9 +249,8 @@ end; end end; - if ((GameFlags and gfKarma) <> 0) and - ((GameFlags and gfInvulnerable) = 0) - and (not CurrentHedgehog^.Gear^.Invulnerable) then + if (GameFlags and gfKarma <> 0) and (GameFlags and gfInvulnerable = 0) and + (CurrentHedgehog^.Effects[heInvulnerable] = 0) then begin // this cannot just use Damage or it interrupts shotgun and gets you called stupid inc(CurrentHedgehog^.Gear^.Karma, tmpDmg); CurrentHedgehog^.Gear^.LastDamage := CurrentHedgehog; @@ -322,7 +321,7 @@ particle^.dX := particle^.dX + (Gear^.dX.QWordValue / 21474836480); end; - if (Gear^.Invulnerable) then + if ((Gear^.Hedgehog^.Effects[heInvulnerable] <> 0)) then exit; //if _0_6 < Gear^.dY then @@ -823,7 +822,7 @@ end; if dmg > 0 then begin - if (not t^.Invulnerable) then + if t^.Hedgehog^.Effects[heInvulnerable] = 0 then ApplyDamage(t, Gear^.Hedgehog, dmg, dsBullet) else Gear^.State:= Gear^.State or gstWinner; @@ -919,7 +918,7 @@ Ammo^.Timer:= 0; exit; end; - if (not Gear^.Invulnerable) then + if Gear^.Hedgehog^.Effects[heInvulnerable] = 0 then begin if (Ammo^.Kind = gtKnife) and (tmpDmg > 0) then for j:= 1 to max(1,min(3,tmpDmg div 5)) do diff -r 50a001b1964e -r 4054960f837a hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Fri Nov 08 12:00:47 2013 +0400 +++ b/hedgewars/uTeams.pas Fri Nov 08 23:11:27 2013 -0500 @@ -528,7 +528,7 @@ if Gear <> nil then begin - Gear^.Invulnerable:= false; + Gear^.Hedgehog^.Effects[heInvulnerable]:= 0; Gear^.Damage:= Gear^.Health; Gear^.State:= (Gear^.State or gstHHGone) and (not gstHHDriven) end diff -r 50a001b1964e -r 4054960f837a hedgewars/uTypes.pas --- a/hedgewars/uTypes.pas Fri Nov 08 12:00:47 2013 +0400 +++ b/hedgewars/uTypes.pas Fri Nov 08 23:11:27 2013 -0500 @@ -258,7 +258,6 @@ ImpactSound: TSound; // first sound, others have to be after it in the sounds def. nImpactSounds: Word; // count of ImpactSounds. // Don't use these if you want to take damage normally, otherwise health/damage are commonly used for other purposes - Invulnerable: Boolean; Health, Damage, Karma: LongInt; // DirAngle is a "real" - if you don't need it for rotation of sprite in uGearsRender, you can use it for any visual-only value DirAngle: real; diff -r 50a001b1964e -r 4054960f837a share/hedgewars/Data/Maps/TrophyRace/map.lua --- a/share/hedgewars/Data/Maps/TrophyRace/map.lua Fri Nov 08 12:00:47 2013 +0400 +++ b/share/hedgewars/Data/Maps/TrophyRace/map.lua Fri Nov 08 23:11:27 2013 -0500 @@ -74,31 +74,49 @@ SetAmmo(amSkip, 9, 1, 0) end +function killHog() + SetHealth(CurrentHedgehog, 0) + SetEffect(CurrentHedgehog, heInvulnerable, 0) + x, y = GetGearPosition(CurrentHedgehog) + AddGear(x, y, gtShell, 0, 0, 0, 0) + worsttime = 99999 + worsthog = nil + lasthog = nil +end + +function onHogAttack() + if TurnTimeLeft == 0 then + killHog() + end +end + +function onNewTurn() + if lasthog ~= nil then + SetGearPosition(lasthog, p , 0) + if not reached then + end + end + startTime = 0 + reached = false + if CurrentHedgehog ~= nil then + SetGearVelocity(CurrentHedgehog, 1, 0) + SetGearPosition(CurrentHedgehog, start_area[1] + start_area[3] / 2, start_area[2] + start_area[4] / 2) + ParseCommand("setweap " .. string.char(amRope)) + lasthog = CurrentHedgehog + end +end + function onGameTick() if startTime == 0 and TurnTimeLeft < maxtime then startTime = GameTime end if CurrentHedgehog ~= nil and TurnTimeLeft == 1 then - SetHealth(CurrentHedgehog, 0) - x, y = GetGearPosition(CurrentHedgehog) - AddGear(x, y, gtShell, 0, 0, 0, 0) - worsttime = 99999 - worsthog = nil - elseif TurnTimeLeft == maxtime-1 and CurrentHedgehog ~= nil then - if lasthog ~= nil then - SetGearPosition(lasthog, p , 0) - end - reached = false - SetGearVelocity(CurrentHedgehog, 1, 0) - SetGearPosition(CurrentHedgehog, start_area[1] + start_area[3] / 2, start_area[2] + start_area[4] / 2) - ParseCommand("setweap " .. string.char(amRope)) - lasthog = CurrentHedgehog + killHog() elseif CurrentHedgehog ~= nil then x, y = GetGearPosition(CurrentHedgehog) if not reached and x > goal_area[1] and x < goal_area[1] + goal_area[3] and y > goal_area[2] and y < goal_area[2] + goal_area[4] then -- hog is within goal rectangle reached = true local ttime = GameTime-startTime - startTime = 0 --give it a sound;) if ttime < besttime then PlaySound (sndHomerun) @@ -135,13 +153,15 @@ if clan == ClansCount -1 then -- Time for elimination - worst hog is out and the worst hog vars are reset. - SetHealth(worsthog, 0) - --Place a grenade to make inactive slowest hog active - x, y = GetGearPosition(worsthog) - AddGear(x, y, gtShell, 0, 0, 0, 0) - worsttime = 0 - worsthog = nil + if worsthog ~= nil then + SetHealth(worsthog, 0) + --Place a grenade to make inactive slowest hog active + x, y = GetGearPosition(worsthog) + AddGear(x, y, gtShell, 0, 0, 0, 0) + worsttime = 0 + worsthog = nil end + end for i=0, ClansCount -1 do local tt = "" .. (clantimes[i] / 1000) .. " s" @@ -175,7 +195,7 @@ --end function onAchievementsDeclaration() - for team,time in pairs(realBestTimes) do - DeclareAchievement("rope race", team, "TrophyRace", time) + for team,time in pairs(bestTimes) do + DeclareAchievement("rope race", team, "TrophyRace", time) end end