# HG changeset patch # User nemo # Date 1314766728 14400 # Node ID 4454aa0523e7debdba4e858a9e11397321e9566b # Parent 718f98a9df122d73f3ba9add4d1654865199de31 more proper implementation of TARDIS diff -r 718f98a9df12 -r 4454aa0523e7 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Tue Aug 30 12:32:33 2011 -0400 +++ b/hedgewars/GSHandlers.inc Wed Aug 31 00:58:48 2011 -0400 @@ -1226,21 +1226,21 @@ b := false; if abs(LongInt(HHGear^.Angle) - BTPrevAngle) > 7 then - begin + begin Gear^.dX := SignAs(AngleSin(HHGear^.Angle) * _0_5, HHGear^.dX); Gear^.dY := AngleCos(HHGear^.Angle) * ( - _0_5); BTPrevAngle := HHGear^.Angle; b := true - end; + end; if ((HHGear^.State and gstMoving) <> 0) then - begin + begin doStepHedgehogMoving(HHGear); if (HHGear^.State and gstHHDriven) = 0 then Gear^.Timer := 0 - end; + end; if Gear^.Timer mod cHHStepTicks = 0 then - begin + begin b := true; if Gear^.dX.isNegative then HHGear^.Message := (HHGear^.Message and (gmAttack or gmUp or gmDown)) or gmLeft @@ -1248,7 +1248,7 @@ HHGear^.Message := (HHGear^.Message and (gmAttack or gmUp or gmDown)) or gmRight; if ((HHGear^.State and gstMoving) = 0) then - begin + begin HHGear^.State := HHGear^.State and not gstAttacking; prevX := hwRound(HHGear^.X); @@ -1261,24 +1261,24 @@ CheckLandValue(hwRound(HHGear^.X + SignAs(_6, HHGear^.dX)), hwRound(HHGear^.Y), lfIndestructible) then HHGear^.X := HHGear^.X + SignAs(_1, HHGear^.dX); HHGear^.State := HHGear^.State or gstAttacking - end; + end; inc(BTSteps); if BTSteps = 7 then - begin + begin BTSteps := 0; if CheckLandValue(hwRound(HHGear^.X + Gear^.dX * (cHHRadius + cBlowTorchC) + SignAs(_6, Gear^.dX)), hwRound(HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC)), lfIndestructible) then - begin + begin Gear^.X := HHGear^.X + Gear^.dX * (cHHRadius + cBlowTorchC); Gear^.Y := HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC); - end; + end; HHGear^.State := HHGear^.State or gstNoDamage; AmmoShove(Gear, 2, 15); HHGear^.State := HHGear^.State and not gstNoDamage + end; end; - end; if b then DrawTunnel(HHGear^.X - Gear^.dX * cHHRadius, HHGear^.Y - _4 - Gear^.dY * cHHRadius + hwAbs( @@ -1287,12 +1287,12 @@ cHHRadius * 5, cHHRadius * 2 + 7); if (Gear^.Timer = 0) or ((HHGear^.Message and gmAttack) <> 0) then - begin + begin HHGear^.Message := 0; HHGear^.State := HHGear^.State and (not gstNotKickable); DeleteGear(Gear); AfterAttack - end + end end; procedure doStepBlowTorch(Gear: PGear); @@ -2949,10 +2949,8 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepSeductionWork(Gear: PGear); -var - x, y, i: LongInt; +var i: LongInt; hogs: TPGearArray; - d: hwFloat; begin AllInactive := false; hogs := GearsNear(Gear^.X, Gear^.Y, gtHedgehog, Gear^.Radius); @@ -3678,10 +3676,10 @@ AllInactive := false; FollowGear := HHGear; with HHGear^ do - begin + begin State := State and not gstAttacking; Message := Message and not (gmAttack or gmUp or gmPrecise or gmLeft or gmRight) - end + end end; //////////////////////////////////////////////////////////////////////////////// @@ -4902,47 +4900,127 @@ end; //////////////////////////////////////////////////////////////////////////////// -procedure doStepTardis(Gear: PGear); -(*var - i, x, y: LongInt; - dX, dY: hwFloat; - Fire: PGear; - vg: PVisualGear;*) +(* + TARDIS needs + Warp in. Pos = 1 + Pause. Pos = 2 + Hide gear (TARDIS hedgehog was nil) + Warp out. Pos = 3 + ... idle active for some time period ... Pos = 4 + Warp in. Pos = 1 + Pause. Pos = 2 + Restore gear (TARDIS hedgehog was not nil) + Warp out. Pos = 3 +*) + +procedure doStepTardisWarp(Gear: PGear); +var HH: PHedgehog; + i,j,cnt: LongWord; begin - if (Gear^.State and gstTmpFlag) = 0 then dec(Gear^.Timer); - if (Gear^.Timer = 0) and (CurAmmoGear = Gear) then + +HH:= Gear^.Hedgehog; +if Gear^.Pos = 2 then + begin + if (Gear^.Timer = 0) then begin - if (CurrentHedgehog = nil) or (CurrentHedgehog^.Gear = nil) then + if HH^.Gear <> nil then begin - DeleteGear(Gear); - exit + if Gear = CurAmmoGear then CurAmmoGear := nil; + DeleteCI(HH^.Gear); + RemoveGearFromList(HH^.Gear); + HH^.Gear^.Z := cHHZ; + HH^.Gear^.Active := false; + HH^.Gear^.State:= HH^.Gear^.State and not (gstHHDriven or gstAttacking); + HH^.GearHidden:= HH^.Gear; + HH^.Gear:= nil + end + else if HH^.GearHidden <> nil then + begin + HH^.Gear:= HH^.GearHidden; + HH^.GearHidden:= nil; + InsertGearToList(HH^.Gear); + HH^.Gear^.State:= (HH^.Gear^.State or gstAttacked) and not gstHHDriven; + AddGearCI(HH^.Gear); + HH^.Gear^.Active:= true end; - if Gear = CurAmmoGear then CurAmmoGear := nil; - Gear^.Hedgehog:= CurrentHedgehog; - RemoveGearFromList(CurrentHedgehog^.Gear); - CurrentHedgehog^.Gear^.Z := cHHZ; - CurrentHedgehog^.Gear^.Active := false; - CurrentHedgehog^.Gear^.State:= CurrentHedgehog^.Gear^.State and not gstHHDriven; - CurrentHedgehog^.GearHidden:= CurrentHedgehog^.Gear; - CurrentHedgehog^.Gear:= nil; - Gear^.State:= Gear^.State or gstTmpFlag; - Gear^.Timer:= GameTicks + GetRandom(cHedgehogTurnTime*TeamsCount)+cHedgehogTurnTime; - end - else if (((Gear^.State and gstTmpFlag) <> 0) and (Gear^.Timer = GameTicks)) or SuddenDeath then + end; + + inc(Gear^.Timer); + if (Gear^.Timer > 2000) and ((GameTicks mod 2000) = 1000) then + begin + Gear^.Pos:= 3; + end; + end; + +if (Gear^.Pos = 1) and (GameTicks and $1F = 0) and (Gear^.Power < 255) then inc(Gear^.Power); +if (Gear^.Pos = 3) and (GameTicks and $1F = 0) and (Gear^.Power > 0) then dec(Gear^.Power); +if (Gear^.Pos = 1) and (Gear^.Power = 255) and ((GameTicks mod 2000) = 1000) then Gear^.Pos:= 2; +if (Gear^.Pos = 3) and (Gear^.Power = 0) then + begin + Gear^.Pos:= 4; + // This condition might need tweaking + Gear^.Timer:= GetRandom(cHedgehogTurnTime*TeamsCount)+cHedgehogTurnTime + end; + +if (Gear^.Pos = 4) then + begin + cnt:= 0; + for j:= 0 to Pred(HH^.Team^.Clan^.TeamsNumber) do + for i:= 0 to Pred(HH^.Team^.Clan^.Teams[j]^.HedgehogsNumber) do + if (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear <> nil) and + ((HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.State and gstDrowning) = 0) and + (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Health > + HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Damage) then inc(cnt); + if (cnt = 0) or SuddenDeathDmg or (Gear^.Timer = 0) then begin - if Gear^.Hedgehog <> nil then + Gear^.Pos:= 1; + Gear^.Power:= 0; + Gear^.Timer:= 0; + FindPlace(HH^.GearHidden, false, 0, LAND_WIDTH,true); + if HH^.GearHidden <> nil then begin - Gear^.Hedgehog^.Gear:= Gear^.Hedgehog^.GearHidden; - Gear^.Hedgehog^.GearHidden:= nil; - FindPlace(Gear^.Hedgehog^.Gear, false, 0, LAND_WIDTH,true); - InsertGearToList(Gear^.Hedgehog^.Gear); - Gear^.Hedgehog^.Gear^.State:= (Gear^.Hedgehog^.Gear^.State or gstTmpFlag or gstAttacked) and not gstHHDriven; - Gear^.Hedgehog^.Gear^.Timer:= $FF; - Gear^.Hedgehog^.Gear^.doStep:= @doStepHedgehogReturn; - SetAllHHToActive; - end; - DeleteGear(Gear) + Gear^.X:= HH^.GearHidden^.X; + Gear^.Y:= HH^.GearHidden^.Y; + end end + else dec(Gear^.Timer); + end; + +end; + +procedure doStepTardis(Gear: PGear); +var i,j,cnt: LongWord; + HH: PHedgehog; +begin +(* + Conditions for not activating. + 1. Hog is last of his clan + 2. Sudden Death is in play + 3. Hog is a king +*) + HH:= Gear^.Hedgehog; + if (HH^.Gear = nil) or (HH^.King) or (SuddenDeathDmg) then + begin + DeleteGear(gear); + exit + end; + cnt:= 0; + for j:= 0 to Pred(HH^.Team^.Clan^.TeamsNumber) do + for i:= 0 to Pred(HH^.Team^.Clan^.Teams[j]^.HedgehogsNumber) do + if (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear <> nil) and + ((HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.State and gstDrowning) = 0) and + (HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Health > + HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Damage) then inc(cnt); + if cnt < 2 then + begin + DeleteGear(gear); + exit + end; + with HH^.Gear^ do + begin + Message := Message and not gmAttack + end; + Gear^.doStep:= @doStepTardisWarp end; //////////////////////////////////////////////////////////////////////////////// diff -r 718f98a9df12 -r 4454aa0523e7 hedgewars/HHHandlers.inc --- a/hedgewars/HHHandlers.inc Tue Aug 30 12:32:33 2011 -0400 +++ b/hedgewars/HHHandlers.inc Wed Aug 31 00:58:48 2011 -0400 @@ -1093,13 +1093,3 @@ doStepHedgehogDriven(Gear) end; end; - -procedure doStepHedgehogReturn(Gear: PGear); -begin -if (Gear^.Timer > 0) and ((GameTicks mod 20) = 0) then dec(Gear^.Timer) -else if (Gear^.Timer = 0) then - begin - Gear^.doStep:= @doStepHedgehog; - Gear^.State:= Gear^.State and not gstTmpFlag; - end -end; diff -r 718f98a9df12 -r 4454aa0523e7 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Tue Aug 30 12:32:33 2011 -0400 +++ b/hedgewars/uGears.pas Wed Aug 31 00:58:48 2011 -0400 @@ -75,7 +75,6 @@ procedure AfterAttack; forward; procedure HedgehogStep(Gear: PGear); forward; procedure doStepHedgehogMoving(Gear: PGear); forward; -procedure doStepHedgehogReturn(Gear: PGear); forward; procedure HedgehogChAngle(HHGear: PGear); forward; procedure ShotgunShot(Gear: PGear); forward; procedure PickUp(HH, Gear: PGear); forward; @@ -428,6 +427,11 @@ gear^.Elasticity:= _0_3; gear^.Timer:= 0 end; + gtTardis: begin + gear^.Timer:= 0; + gear^.Pos:= 1; + gear^.Z:= cCurrHHZ+1; + end; gtMortar: begin gear^.Radius:= 4; gear^.Elasticity:= _0_2; @@ -1450,7 +1454,11 @@ ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg, dsShove) else Gear^.State:= Gear^.State or gstWinner; - if (Gear^.Kind = gtExplosives) and (Ammo^.Kind = gtBlowtorch) then ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg * 100, dsUnknown); // crank up damage for explosives + blowtorch + if (Gear^.Kind = gtExplosives) and (Ammo^.Kind = gtBlowtorch) then + begin + if (Ammo^.Hedgehog^.Gear <> nil) then Ammo^.Hedgehog^.Gear^.State:= Ammo^.Hedgehog^.Gear^.State and not gstNotKickable; + ApplyDamage(Gear, Ammo^.Hedgehog, tmpDmg * 100, dsUnknown); // crank up damage for explosives + blowtorch + end; DeleteCI(Gear); if (Gear^.Kind = gtHedgehog) and Gear^.Hedgehog^.King then diff -r 718f98a9df12 -r 4454aa0523e7 hedgewars/uGearsRender.pas --- a/hedgewars/uGearsRender.pas Tue Aug 30 12:32:33 2011 -0400 +++ b/hedgewars/uGearsRender.pas Wed Aug 31 00:58:48 2011 -0400 @@ -227,13 +227,6 @@ Tint($FF, $FF, $FF, $FF) end; - if (CurAmmoGear <> nil) and - (CurrentHedgehog^.Gear <> nil) and - (CurrentHedgehog^.Gear = Gear) and - (CurAmmoGear^.Kind = gtTardis) then Tint($FF, $FF, $FF, CurAmmoGear^.Timer div 20) - // probably will need a new flag for this - else if (Gear^.State and gstTmpFlag <> 0) then Tint($FF, $FF, $FF, $FF-Gear^.Timer); - if ((Gear^.State and gstWinner) <> 0) and ((CurAmmoGear = nil) or (CurAmmoGear^.Kind <> gtPickHammer)) then begin @@ -1088,6 +1081,15 @@ //DrawRotatedF(sprFlake, x-SpritesData[sprFlake].Width div 2, y-SpritesData[sprFlake].Height div 2, Gear^.Timer, 1, Gear^.DirAngle); end; gtStructure: DrawSprite(sprTarget, x - 16, y - 16, 0); + gtTardis: if Gear^.Pos <> 4 then + begin + if (Gear^.Pos = 1) or (Gear^.Pos = 3) then + Tint($FF, $FF, $FF, max($00, round(Gear^.Power * (1-abs(0.5 - (GameTicks mod 2000) / 2000))))); + DrawSprite(sprTardis, x-24, y-63,0); + if (Gear^.Pos = 1) or (Gear^.Pos = 3) then + Tint($FF, $FF, $FF, $FF) + end; + end; if Gear^.RenderTimer and (Gear^.Tex <> nil) then DrawCentered(x + 8, y + 8, Gear^.Tex); diff -r 718f98a9df12 -r 4454aa0523e7 hedgewars/uTypes.pas --- a/hedgewars/uTypes.pas Tue Aug 30 12:32:33 2011 -0400 +++ b/hedgewars/uTypes.pas Wed Aug 31 00:58:48 2011 -0400 @@ -82,7 +82,7 @@ sprSMineOff, sprSMineOn, sprHandSMine, sprHammer, sprHandResurrector, sprCross, sprAirDrill, sprNapalmBomb, sprBulletHit, sprSnowball, sprHandSnowball, sprSnow, - sprSDFlake, sprSDWater, sprSDCloud, sprSDSplash, sprSDDroplet + sprSDFlake, sprSDWater, sprSDCloud, sprSDSplash, sprSDDroplet, sprTardis ); // Gears that interact with other Gears and/or Land diff -r 718f98a9df12 -r 4454aa0523e7 hedgewars/uVariables.pas --- a/hedgewars/uVariables.pas Tue Aug 30 12:32:33 2011 -0400 +++ b/hedgewars/uVariables.pas Wed Aug 31 00:58:48 2011 -0400 @@ -614,7 +614,9 @@ (FileName: 'SDSplash'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil; Width: 80; Height: 50; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSDSplash (FileName: 'SDDroplet'; Path: ptCurrTheme; AltPath: ptSuddenDeath; Texture: nil; Surface: nil; - Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true)// sprSDDroplet + Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprSDDroplet + (FileName: 'TARDIS'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; + Width: 0; Height: 0; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: true; getImageDimensions: true)// sprTardis ); diff -r 718f98a9df12 -r 4454aa0523e7 share/hedgewars/Data/Graphics/AmmoMenu/Ammos.png Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos.png has changed diff -r 718f98a9df12 -r 4454aa0523e7 share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw.png Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw.png has changed diff -r 718f98a9df12 -r 4454aa0523e7 share/hedgewars/Data/Graphics/TARDIS.png Binary file share/hedgewars/Data/Graphics/TARDIS.png has changed