hedgewars/uAIMisc.pas
changeset 1352 405ad07cf875
parent 1141 44d4d6aaecb5
child 1519 7b6adbe5266a
equal deleted inserted replaced
1351:aa7aefec5c1b 1352:405ad07cf875
    76 Targets.Count:= 0;
    76 Targets.Count:= 0;
    77 f:= 0;
    77 f:= 0;
    78 e:= 0;
    78 e:= 0;
    79 for t:= 0 to Pred(TeamsCount) do
    79 for t:= 0 to Pred(TeamsCount) do
    80 	with TeamsArray[t]^ do
    80 	with TeamsArray[t]^ do
    81 	begin
    81 		if not hasGone then
    82 	for i:= 0 to cMaxHHIndex do
       
    83 		if (Hedgehogs[i].Gear <> nil)
       
    84 			and (Hedgehogs[i].Gear <> ThinkingHH) then
       
    85 			begin
    82 			begin
    86 			with Targets.ar[Targets.Count], Hedgehogs[i] do
    83 			for i:= 0 to cMaxHHIndex do
    87 				begin
    84 				if (Hedgehogs[i].Gear <> nil)
    88 				Point.X:= hwRound(Gear^.X);
    85 				and (Hedgehogs[i].Gear <> ThinkingHH) then
    89 				Point.Y:= hwRound(Gear^.Y);
       
    90 				if Clan <> CurrentTeam^.Clan then
       
    91 					begin
    86 					begin
    92 					Score:=  Gear^.Health;
    87 					with Targets.ar[Targets.Count], Hedgehogs[i] do
    93 					inc(e)
    88 						begin
    94 					end else
    89 						Point.X:= hwRound(Gear^.X);
    95 					begin
    90 						Point.Y:= hwRound(Gear^.Y);
    96 					Score:= -Gear^.Health;
    91 						if Clan <> CurrentTeam^.Clan then
    97 					inc(f)
    92 							begin
    98 					end
    93 							Score:=  Gear^.Health;
    99 				end;
    94 							inc(e)
   100 			inc(Targets.Count)
    95 							end else
       
    96 							begin
       
    97 							Score:= -Gear^.Health;
       
    98 							inc(f)
       
    99 							end
       
   100 						end;
       
   101 					inc(Targets.Count)
       
   102 					end;
   101 			end;
   103 			end;
   102 	end;
       
   103 
   104 
   104 if e > f then friendlyfactor:= 300 + (e - f) * 30
   105 if e > f then friendlyfactor:= 300 + (e - f) * 30
   105 else friendlyfactor:= max(30, 300 - f * 80 div e)
   106 else friendlyfactor:= max(30, 300 - f * 80 div e)
   106 end;
   107 end;
   107 
   108 
   122 begin
   123 begin
   123 bonuses.Count:= 0;
   124 bonuses.Count:= 0;
   124 MyClan:= PHedgehog(ThinkingHH^.Hedgehog)^.Team^.Clan;
   125 MyClan:= PHedgehog(ThinkingHH^.Hedgehog)^.Team^.Clan;
   125 Gear:= GearsList;
   126 Gear:= GearsList;
   126 while Gear <> nil do
   127 while Gear <> nil do
   127       begin
   128 	begin
   128       case Gear^.Kind of
   129 	case Gear^.Kind of
   129            gtCase: AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 33, 25);
   130 		gtCase: AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 33, 25);
   130            gtMine: if (Gear^.State and gstAttacking) = 0 then AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 50, -50)
   131 		gtMine: if (Gear^.State and gstAttacking) = 0 then
   131                                                         else AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 100, -50); // mine is on
   132 				AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 50, -50)
   132            gtDynamite: AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 150, -75);
   133 			else
   133            gtHedgehog: begin
   134 				AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 100, -50); // mine is on
   134                        if Gear^.Damage >= Gear^.Health then AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 60, -25) else
   135 		gtDynamite: AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 150, -75);
   135                           if isAfterAttack and (ThinkingHH^.Hedgehog <> Gear^.Hedgehog) then
   136 		gtHedgehog: begin
   136                              if (MyClan = PHedgehog(Gear^.Hedgehog)^.Team^.Clan) then AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 150, -3) // hedgehog-friend
   137 					if Gear^.Damage >= Gear^.Health then
   137                                                                                  else AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 100, 3)
   138 						AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 60, -25)
   138                        end;
   139 					else
   139            end;
   140 						if isAfterAttack and (ThinkingHH^.Hedgehog <> Gear^.Hedgehog) then
   140       Gear:= Gear^.NextGear
   141 							if (MyClan = PHedgehog(Gear^.Hedgehog)^.Team^.Clan) then
   141       end;
   142 								AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 150, -3) // hedgehog-friend
       
   143 							else
       
   144 								AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 100, 3)
       
   145 					end;
       
   146 		end;
       
   147 	Gear:= Gear^.NextGear
       
   148 	end;
   142 if isAfterAttack and (KnownExplosion.Radius > 0) then
   149 if isAfterAttack and (KnownExplosion.Radius > 0) then
   143    with KnownExplosion do
   150    with KnownExplosion do
   144         AddBonus(X, Y, Radius + 10, -Radius);
   151         AddBonus(X, Y, Radius + 10, -Radius);
   145 end;
   152 end;
   146 
   153 
   155 var i, r: LongInt;
   162 var i, r: LongInt;
   156     Result: LongInt;
   163     Result: LongInt;
   157 begin
   164 begin
   158 Result:= 0;
   165 Result:= 0;
   159 for i:= 0 to Pred(bonuses.Count) do
   166 for i:= 0 to Pred(bonuses.Count) do
   160     with bonuses.ar[i] do
   167 	with bonuses.ar[i] do
   161          begin
   168 		begin
   162          r:= hwRound(Distance(Gear^.X - int2hwFloat(X), Gear^.Y - int2hwFloat(Y)));
   169 		r:= hwRound(Distance(Gear^.X - int2hwFloat(X), Gear^.Y - int2hwFloat(Y)));
   163          if r < Radius then
   170 		if r < Radius then
   164             inc(Result, Score * (Radius - r))
   171 			inc(Result, Score * (Radius - r))
   165          end;
   172 		end;
   166     RatePlace:= Result
   173 	RatePlace:= Result
   167 end;
   174 end;
   168 
   175 
   169 function TestColl(x, y, r: LongInt): boolean;
   176 function TestColl(x, y, r: LongInt): boolean;
   170 var b: boolean;
   177 var b: boolean;
   171 begin
   178 begin