procedure TForm1.LandBattle(LandOff, LandDef: TDoubleArr;
WallLevel: Double;
WDefK: Double;
Tower, PhalanxDef, CommandorDef: boolean;
PhalanxOff, CommandorOff, Heroic, Desire: boolean;
Morale, Luck: Double);
var i: integer;
OffTotal: Double;
Off1, Off2, Off3: Double;
Def1, Def2, Def3: Double;
defBonusK: Double;
offBonusK: Double;
dmgOff1, dmgOff2, dmgOff3: Double;
dmgDef1, dmgDef2, dmgDef3: Double;
begin
Off1:=0;
Off2:=0;
Off3:=0;
for i:=0 to Length(LandOff)-1 do
begin
case LandUnits[i].OffType of
atSword: Off1:=Off1+LandOff[i]*LandUnits[i].Off;
atSpear: Off2:=Off2+LandOff[i]*LandUnits[i].Off;
atRange: Off3:=Off3+LandOff[i]*LandUnits[i].Off;
end;
end;
offBonusK:=1;
if PhalanxOff then offBonusK:=offBonusK+0.1;
if CommandorOff then offBonusK:=offBonusK+0.2;
if Heroic then offBonusK:=offBonusK+0.1;
if Desire then offBonusK:=offBonusK-0.1;
offBonusK:=offBonusK*Morale;
offBonusK:=offBonusK*(1+Luck);
Off1:=Off1*offBonusK;
Off2:=Off2*offBonusK;
Off3:=Off3*offBonusK;
OffTotal:=Off1+Off2+Off3;
if OffTotal<=0 then exit; //нет оффа, выходим
Def1:=0;
Def2:=0;
Def3:=0;
for i:=0 to Length(LandDef)-1 do
begin
Def1:=Def1+LandDef[i]*LandUnits[i].Def1;
Def2:=Def2+LandDef[i]*LandUnits[i].Def2;
Def3:=Def3+LandDef[i]*LandUnits[i].Def3;
end;
defBonusK:=WDefK;
if Tower then defBonusK:=defBonusK+0.1;
if PhalanxDef then defBonusK:=defBonusK+0.1;
if CommandorDef then defBonusK:=defBonusK+0.2;
Def1:=Def1 * (Off1/OffTotal); //деф от % оффа
Def2:=Def2 * (Off2/OffTotal); //деф от % оффа
Def3:=Def3 * (Off3/OffTotal); //деф от % оффа
Def1:=Def1*defBonusK+(WallLevel+1)*10; //бонус стены + базовой защиты
Def2:=Def2*defBonusK+(WallLevel+1)*10; //бонус стены + базовой защиты
Def3:=Def3*defBonusK+(WallLevel+1)*10; //бонус стены + базовой защиты
if Off1=0 then dmgOff1:=0 else dmgOff1:=Power(Def1, 1.2)*Power(Off1, -0.2) / Off1; //% убитого оффа
if Off2=0 then dmgOff2:=0 else dmgOff2:=Power(Def2, 1.2)*Power(Off2, -0.2) / Off2; //% убитого оффа
if Off3=0 then dmgOff3:=0 else dmgOff3:=Power(Def3, 1.2)*Power(Off3, -0.2) / Off3; //% убитого оффа
if Def1=0 then dmgDef1:=0 else dmgDef1:=Power(Def1, -0.2)*Power(Off1, 1.2) / Def1 * (Off1/OffTotal); //% урона по каждому из типов дефа
if Def2=0 then dmgDef2:=0 else dmgDef2:=Power(Def2, -0.2)*Power(Off2, 1.2) / Def2 * (Off2/OffTotal); //% урона по каждому из типов дефа
if Def3=0 then dmgDef3:=0 else dmgDef3:=Power(Def3, -0.2)*Power(Off3, 1.2) / Def3 * (Off3/OffTotal); //% урона по каждому из типов дефа
for i:=0 to Length(LandOff)-1 do
begin
case LandUnits[i].OffType of
atSword: LandOff[i]:=LandOff[i] - Min(1, dmgOff1) * LandOff[i];
atSpear: LandOff[i]:=LandOff[i] - Min(1, dmgOff2) * LandOff[i];
atRange: LandOff[i]:=LandOff[i] - Min(1, dmgOff3) * LandOff[i];
end;
LandDef[i]:=Max(0, LandDef[i] - Min(LandDef[i]*dmgDef1, LandDef[i]*(Off1/OffTotal))
- Min(LandDef[i]*dmgDef2, LandDef[i]*(Off2/OffTotal))
- Min(LandDef[i]*dmgDef3, LandDef[i]*(Off3/OffTotal)));
end;
end;