Cast to long to avoid overflow when multiplying by the health (part 2)
This commit is contained in:
@@ -198,7 +198,8 @@ namespace OpenRA.Mods.Common.AI
|
|||||||
if (sumOfMaxHp == 0)
|
if (sumOfMaxHp == 0)
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
|
|
||||||
return (sumOfHp * normalizeByValue) / sumOfMaxHp;
|
// Cast to long to avoid overflow when multiplying by the health
|
||||||
|
return (int)((long)sumOfHp * normalizeByValue / sumOfMaxHp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static float RelativePower(IEnumerable<Actor> own, IEnumerable<Actor> enemy)
|
static float RelativePower(IEnumerable<Actor> own, IEnumerable<Actor> enemy)
|
||||||
|
|||||||
@@ -58,7 +58,9 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
var capturesInfo = activeCaptures.Info;
|
var capturesInfo = activeCaptures.Info;
|
||||||
var lowEnoughHealth = health.HP <= capturable.Info.CaptureThreshold * health.MaxHP / 100;
|
|
||||||
|
// Cast to long to avoid overflow when multiplying by the health
|
||||||
|
var lowEnoughHealth = health.HP <= (int)(capturable.Info.CaptureThreshold * (long)health.MaxHP / 100);
|
||||||
if (!capturesInfo.Sabotage || lowEnoughHealth || actor.Owner.NonCombatant)
|
if (!capturesInfo.Sabotage || lowEnoughHealth || actor.Owner.NonCombatant)
|
||||||
{
|
{
|
||||||
var oldOwner = actor.Owner;
|
var oldOwner = actor.Owner;
|
||||||
@@ -80,7 +82,8 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var damage = health.MaxHP * capturesInfo.SabotageHPRemoval / 100;
|
// Cast to long to avoid overflow when multiplying by the health
|
||||||
|
var damage = (int)((long)health.MaxHP * capturesInfo.SabotageHPRemoval / 100);
|
||||||
actor.InflictDamage(self, new Damage(damage));
|
actor.InflictDamage(self, new Damage(damage));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,9 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
{
|
{
|
||||||
var unitCost = self.Info.TraitInfo<ValuedInfo>().Cost;
|
var unitCost = self.Info.TraitInfo<ValuedInfo>().Cost;
|
||||||
var hpToRepair = repairsUnits.Info.HpPerStep;
|
var hpToRepair = repairsUnits.Info.HpPerStep;
|
||||||
var cost = Math.Max(1, (hpToRepair * unitCost * repairsUnits.Info.ValuePercentage) / (health.MaxHP * 100));
|
|
||||||
|
// Cast to long to avoid overflow when multiplying by the health
|
||||||
|
var cost = Math.Max(1, (int)(((long)hpToRepair * unitCost * repairsUnits.Info.ValuePercentage) / (health.MaxHP * 100L)));
|
||||||
|
|
||||||
if (!played)
|
if (!played)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -115,7 +115,9 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
// The cost is the same regardless of the amount of people repairing
|
// The cost is the same regardless of the amount of people repairing
|
||||||
var hpToRepair = Math.Min(Info.RepairStep, health.MaxHP - health.HP);
|
var hpToRepair = Math.Min(Info.RepairStep, health.MaxHP - health.HP);
|
||||||
var cost = Math.Max(1, (hpToRepair * Info.RepairPercent * buildingValue) / (health.MaxHP * 100));
|
|
||||||
|
// Cast to long to avoid overflow when multiplying by the health
|
||||||
|
var cost = Math.Max(1, (int)(((long)hpToRepair * Info.RepairPercent * buildingValue) / (health.MaxHP * 100L)));
|
||||||
|
|
||||||
// TakeCash will return false if the player can't pay, and will stop him from contributing this Tick
|
// TakeCash will return false if the player can't pay, and will stop him from contributing this Tick
|
||||||
var activePlayers = Repairers.Count(player => player.PlayerActor.Trait<PlayerResources>().TakeCash(cost, true));
|
var activePlayers = Repairers.Count(player => player.PlayerActor.Trait<PlayerResources>().TakeCash(cost, true));
|
||||||
|
|||||||
@@ -69,7 +69,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (totalTiles == 0)
|
if (totalTiles == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
damageThreshold = (Info.DamageThreshold * health.MaxHP + (100 - Info.DamageThreshold) * safeTiles * health.MaxHP / totalTiles) / 100;
|
// Cast to long to avoid overflow when multiplying by the health
|
||||||
|
damageThreshold = (int)((Info.DamageThreshold * (long)health.MaxHP + (100 - Info.DamageThreshold) * safeTiles * (long)health.MaxHP / totalTiles) / 100);
|
||||||
|
|
||||||
// Actors start with maximum damage applied
|
// Actors start with maximum damage applied
|
||||||
var delta = health.HP - damageThreshold;
|
var delta = health.HP - damageThreshold;
|
||||||
|
|||||||
@@ -43,7 +43,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
Info = info;
|
Info = info;
|
||||||
MaxHP = info.HP > 0 ? info.HP : 1;
|
MaxHP = info.HP > 0 ? info.HP : 1;
|
||||||
|
|
||||||
hp = init.Contains<HealthInit>() ? init.Get<HealthInit, int>() * MaxHP / 100 : MaxHP;
|
// Cast to long to avoid overflow when multiplying by the health
|
||||||
|
hp = init.Contains<HealthInit>() ? (int)(init.Get<HealthInit, int>() * (long)MaxHP / 100) : MaxHP;
|
||||||
|
|
||||||
DisplayHP = hp;
|
DisplayHP = hp;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user