# HG changeset patch # User unc0rr # Date 1223994834 0 # Node ID 405ad07cf8754e99f21de7ced7e20a4037a8716a # Parent aa7aefec5c1b5b0926d2c9908ed05e801eb1dd5d Add more support for handling disconnects while playing (not fully tested) diff -r aa7aefec5c1b -r 405ad07cf875 hedgewars/uAIMisc.pas --- a/hedgewars/uAIMisc.pas Mon Oct 13 19:04:27 2008 +0000 +++ b/hedgewars/uAIMisc.pas Tue Oct 14 14:33:54 2008 +0000 @@ -78,28 +78,29 @@ e:= 0; for t:= 0 to Pred(TeamsCount) do with TeamsArray[t]^ do - begin - for i:= 0 to cMaxHHIndex do - if (Hedgehogs[i].Gear <> nil) - and (Hedgehogs[i].Gear <> ThinkingHH) then + if not hasGone then begin - with Targets.ar[Targets.Count], Hedgehogs[i] do - begin - Point.X:= hwRound(Gear^.X); - Point.Y:= hwRound(Gear^.Y); - if Clan <> CurrentTeam^.Clan then + for i:= 0 to cMaxHHIndex do + if (Hedgehogs[i].Gear <> nil) + and (Hedgehogs[i].Gear <> ThinkingHH) then begin - Score:= Gear^.Health; - inc(e) - end else - begin - Score:= -Gear^.Health; - inc(f) - end - end; - inc(Targets.Count) + with Targets.ar[Targets.Count], Hedgehogs[i] do + begin + Point.X:= hwRound(Gear^.X); + Point.Y:= hwRound(Gear^.Y); + if Clan <> CurrentTeam^.Clan then + begin + Score:= Gear^.Health; + inc(e) + end else + begin + Score:= -Gear^.Health; + inc(f) + end + end; + inc(Targets.Count) + end; end; - end; if e > f then friendlyfactor:= 300 + (e - f) * 30 else friendlyfactor:= max(30, 300 - f * 80 div e) @@ -124,21 +125,27 @@ MyClan:= PHedgehog(ThinkingHH^.Hedgehog)^.Team^.Clan; Gear:= GearsList; while Gear <> nil do - begin - case Gear^.Kind of - gtCase: AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 33, 25); - gtMine: if (Gear^.State and gstAttacking) = 0 then AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 50, -50) - else AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 100, -50); // mine is on - gtDynamite: AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 150, -75); - gtHedgehog: begin - if Gear^.Damage >= Gear^.Health then AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 60, -25) else - if isAfterAttack and (ThinkingHH^.Hedgehog <> Gear^.Hedgehog) then - if (MyClan = PHedgehog(Gear^.Hedgehog)^.Team^.Clan) then AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 150, -3) // hedgehog-friend - else AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 100, 3) - end; - end; - Gear:= Gear^.NextGear - end; + begin + case Gear^.Kind of + gtCase: AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 33, 25); + gtMine: if (Gear^.State and gstAttacking) = 0 then + AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 50, -50) + else + AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 100, -50); // mine is on + gtDynamite: AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 150, -75); + gtHedgehog: begin + if Gear^.Damage >= Gear^.Health then + AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 60, -25) + else + if isAfterAttack and (ThinkingHH^.Hedgehog <> Gear^.Hedgehog) then + if (MyClan = PHedgehog(Gear^.Hedgehog)^.Team^.Clan) then + AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 150, -3) // hedgehog-friend + else + AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 100, 3) + end; + end; + Gear:= Gear^.NextGear + end; if isAfterAttack and (KnownExplosion.Radius > 0) then with KnownExplosion do AddBonus(X, Y, Radius + 10, -Radius); @@ -157,13 +164,13 @@ begin Result:= 0; for i:= 0 to Pred(bonuses.Count) do - with bonuses.ar[i] do - begin - r:= hwRound(Distance(Gear^.X - int2hwFloat(X), Gear^.Y - int2hwFloat(Y))); - if r < Radius then - inc(Result, Score * (Radius - r)) - end; - RatePlace:= Result + with bonuses.ar[i] do + begin + r:= hwRound(Distance(Gear^.X - int2hwFloat(X), Gear^.Y - int2hwFloat(Y))); + if r < Radius then + inc(Result, Score * (Radius - r)) + end; + RatePlace:= Result end; function TestColl(x, y, r: LongInt): boolean; diff -r aa7aefec5c1b -r 405ad07cf875 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Mon Oct 13 19:04:27 2008 +0000 +++ b/hedgewars/uGears.pas Tue Oct 14 14:33:54 2008 +0000 @@ -446,11 +446,11 @@ AllInactive:= true; t:= GearsList; while t <> nil do - begin - Gear:= t; - t:= Gear^.NextGear; - if Gear^.Active then Gear^.doStep(Gear); - end; + begin + Gear:= t; + t:= Gear^.NextGear; + if Gear^.Active then Gear^.doStep(Gear); + end; if AllInactive then case step of diff -r aa7aefec5c1b -r 405ad07cf875 hedgewars/uIO.pas --- a/hedgewars/uIO.pas Mon Oct 13 19:04:27 2008 +0000 +++ b/hedgewars/uIO.pas Tue Oct 14 14:33:54 2008 +0000 @@ -273,7 +273,7 @@ inttostr(headcmd^.Time) + ')', true); -isInLag:= (headcmd = nil) and tmpflag +isInLag:= (headcmd = nil) and tmpflag and not CurrentTeam^.hasGone end; end. diff -r aa7aefec5c1b -r 405ad07cf875 hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Mon Oct 13 19:04:27 2008 +0000 +++ b/hedgewars/uTeams.pas Tue Oct 14 14:33:54 2008 +0000 @@ -329,18 +329,21 @@ var i: LongInt; begin with team^ do - begin - NewTeamHealthBarWidth:= 0; - for i:= 0 to cMaxHHIndex do - if Hedgehogs[i].Gear <> nil then - inc(NewTeamHealthBarWidth, Hedgehogs[i].Gear^.Health); - TeamHealth:= NewTeamHealthBarWidth; - if NewTeamHealthBarWidth > MaxTeamHealth then - begin - MaxTeamHealth:= NewTeamHealthBarWidth; - RecountAllTeamsHealth; - end else NewTeamHealthBarWidth:= (NewTeamHealthBarWidth * cTeamHealthWidth) div MaxTeamHealth - end; + begin + NewTeamHealthBarWidth:= 0; + + if not hasGone then + for i:= 0 to cMaxHHIndex do + if Hedgehogs[i].Gear <> nil then + inc(NewTeamHealthBarWidth, Hedgehogs[i].Gear^.Health); + + TeamHealth:= NewTeamHealthBarWidth; + if NewTeamHealthBarWidth > MaxTeamHealth then + begin + MaxTeamHealth:= NewTeamHealthBarWidth; + RecountAllTeamsHealth; + end else NewTeamHealthBarWidth:= (NewTeamHealthBarWidth * cTeamHealthWidth) div MaxTeamHealth + end; RecountClanHealth(team^.Clan);