function SpatzStartCombat(iAttackingPlayer, iAttackingUnit, iAttackingUnitDamage, iAttackingUnitFinalDamage, iAttackingUnitMaxHitPoints, iDefendingPlayer, iDefendingUnit, iDefendingUnitDamage, iDefendingUnitFinalDamage, iDefendingUnitMaxHitPoints, bContinuation)
critID = 0;
healID = 0;
synthID = 0;
for row in GameInfo.UnitPromotions() do
if( row.Type == "PROMOTION_CRITICAL_STRIKE" ) then
critID = row.ID;
end
if( row.Type == "PROMOTION_SPONTANEOUS_HEALING" ) then
healID = row.ID;
end
if( row.Type == "PROMOTION_SYNTHESIS" ) then
synthID = row.ID;
end
end
-- If you're just using my mod, these will be promotions #161, 162, and 163
-- print("In StartCombat");
if( iAttackingUnit ~= -1 ) then
aPlayer = Players[iAttackingPlayer];
for pUnit in aPlayer:Units() do
if( pUnit:GetID() == iAttackingUnit ) then
aUnit = pUnit;
end
end
aType = aUnit:GetUnitType();
aName = GameInfo.Units[aType].Type
aCombatClass = GameInfo.Units[aType].CombatClass;
aSTR = math.max(GameInfo.Units[aType].Combat, GameInfo.Units[aType].RangedCombat);
if( aUnit:IsHasPromotion(healID) ) then
-- 10% chance of healing 5 damage
local diceroll = Map.Rand(10, "Spontaneous Healing chance");
if( diceroll == 0 ) then
print("Troll critical heal!");
aUnit:ChangeDamage(-5,aPlayer);
end
end
end
if( iDefendingUnit ~= -1 ) then
dPlayer = Players[iDefendingPlayer];
for pUnit in dPlayer:Units() do
if( pUnit:GetID() == iDefendingUnit ) then
dUnit = pUnit;
end
end
dType = dUnit:GetUnitType();
dName = GameInfo.Units[dType].Type
dCombatClass = GameInfo.Units[dType].CombatClass;
dSTR = math.max(GameInfo.Units[dType].Combat, GameInfo.Units[dType].RangedCombat);
if( dUnit:IsHasPromotion(healID) ) then
-- 10% chance of healing 5 damage
local diceroll = Map.Rand(10, "Spontaneous Healing chance");
if( diceroll == 0 ) then
print("Troll critical heal!");
dUnit:ChangeDamage(-5,dPlayer);
end
end
end
-- The spontaneous healing promotion is the only one that doesn't depend on its opponent. For the others, we need to ensure they don't trigger when fighting a city.
if( iAttackingUnit ~= -1 and iDefendingUnit ~= -1 ) then
if( aUnit:IsHasPromotion(critID) ) then
-- 10% chance of +5 damage
local diceroll = Map.Rand(10, "Critical Strike chance");
if( diceroll == 0 ) then
print("Ranger critical hit!");
dUnit:ChangeDamage(5,dPlayer);
end
end
if( aCombatClass == "UNITCOMBAT_PSI" and dCombatClass ~= "UNITCOMBAT_PSI" ) then
if( dSTR > (1.25*aSTR) ) then
aSTR_new = 1.25*aSTR;
elseif( dSTR < (0.75*aSTR) ) then
aSTR_new = 0.75*aSTR;
else
aSTR_new = dSTR;
end
print("Psi attack change! Old: ",aSTR," New: ",aSTR_new);
aUnit:SetBaseCombatStrength(aSTR_new);
-- aSTR = aSTR_new;
end
-- Now, alter the defending unit.
if( dUnit:IsHasPromotion(critID) ) then
-- 10% chance of +5 damage
local diceroll = Map.Rand(10, "Critical Strike chance");
if( diceroll == 0 ) then
print("Ranger critical hit!");
aUnit:ChangeDamage(5,aPlayer);
end
end
if( dCombatClass == "UNITCOMBAT_PSI" and aCombatClass ~= "UNITCOMBAT_PSI" ) then
if( aSTR > (1.25*dSTR) ) then
dSTR_new = 1.25*dSTR;
elseif( aSTR < (0.75*dSTR) ) then
dSTR_new = 0.75*dSTR;
else
dSTR_new = aSTR;
end
print("Psi defense change! Old: ",dSTR," New: ",dSTR_new);
dUnit:SetBaseCombatStrength(dSTR_new);
end
end
end
Events.RunCombatSim.Add( SpatzStartCombat );