Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/public/simulation/components/tests/test_Attack.js
Engine.LoadHelperScript("DamageBonus.js"); | Engine.LoadHelperScript("DamageBonus.js"); | ||||
Engine.LoadHelperScript("DamageTypes.js"); | Engine.LoadHelperScript("DamageTypes.js"); | ||||
Engine.LoadHelperScript("Player.js"); | Engine.LoadHelperScript("Player.js"); | ||||
Engine.LoadHelperScript("ValueModification.js"); | Engine.LoadHelperScript("ValueModification.js"); | ||||
Engine.LoadComponentScript("interfaces/Attack.js"); | Engine.LoadComponentScript("interfaces/Attack.js"); | ||||
Engine.LoadComponentScript("interfaces/DamageReceiver.js"); | |||||
Engine.LoadComponentScript("interfaces/AuraManager.js"); | Engine.LoadComponentScript("interfaces/AuraManager.js"); | ||||
Engine.LoadComponentScript("interfaces/Auras.js"); | Engine.LoadComponentScript("interfaces/Auras.js"); | ||||
Engine.LoadComponentScript("interfaces/Capturable.js"); | Engine.LoadComponentScript("interfaces/Capturable.js"); | ||||
Engine.LoadComponentScript("interfaces/Formation.js"); | Engine.LoadComponentScript("interfaces/Formation.js"); | ||||
Engine.LoadComponentScript("interfaces/Foundation.js"); | |||||
Engine.LoadComponentScript("interfaces/Health.js"); | Engine.LoadComponentScript("interfaces/Health.js"); | ||||
Engine.LoadComponentScript("interfaces/TechnologyManager.js"); | Engine.LoadComponentScript("interfaces/TechnologyManager.js"); | ||||
Engine.LoadComponentScript("Attack.js"); | Engine.LoadComponentScript("Attack.js"); | ||||
Engine.LoadComponentScript("Armour.js"); | |||||
let entityID = 903; | let entityID = 903; | ||||
function attackComponentTest(defenderClass, isEnemy, test_function) | function attackComponentTest(defenderClass, isEnemy, test_function) | ||||
{ | { | ||||
ResetState(); | ResetState(); | ||||
{ | { | ||||
let playerEnt1 = 5; | let playerEnt1 = 5; | ||||
AddMock(SYSTEM_ENTITY, IID_PlayerManager, { | AddMock(SYSTEM_ENTITY, IID_PlayerManager, { | ||||
"GetPlayerByID": () => playerEnt1 | "GetPlayerByID": () => playerEnt1 | ||||
}); | }); | ||||
AddMock(playerEnt1, IID_Player, { | AddMock(playerEnt1, IID_Player, { | ||||
"GetPlayerID": () => 1, | "GetPlayerID": () => 1 | ||||
"IsEnemy": () => isEnemy | }); | ||||
AddMock(SYSTEM_ENTITY, IID_ObstructionManager, { | |||||
"DistanceToTarget": (ent, target) => 10 | |||||
}); | }); | ||||
} | } | ||||
let attacker = entityID; | let attacker = entityID; | ||||
AddMock(attacker, IID_Position, { | AddMock(attacker, IID_Position, { | ||||
"IsInWorld": () => true, | "IsInWorld": () => true, | ||||
"GetTurretParent": () => INVALID_ENTITY, | |||||
"GetHeightOffset": () => 5, | "GetHeightOffset": () => 5, | ||||
"GetPosition2D": () => new Vector2D(1, 2) | "GetPosition2D": () => new Vector2D(1, 2) | ||||
}); | }); | ||||
AddMock(attacker, IID_Ownership, { | AddMock(attacker, IID_Ownership, { | ||||
"GetOwner": () => 1 | "GetOwner": () => 1 | ||||
}); | }); | ||||
let cmpAttack = ConstructComponent(attacker, "Attack", { | let cmpAttack = ConstructComponent(attacker, "Attack", { | ||||
"Melee": { | "Melee": { | ||||
"Damage": { | "Damage": { | ||||
"Hack": 11, | "Hack": 11, | ||||
"Pierce": 5, | "Pierce": 5, | ||||
"Crush": 0 | "Crush": 0 | ||||
}, | }, | ||||
"MinRange": 3, | "MinRange": 3, | ||||
"MaxRange": 5, | "MaxRange": 5, | ||||
"PrepareTime": 0, | |||||
"RepeatTime": 1000, | |||||
"PreferredClasses": { | "PreferredClasses": { | ||||
"_string": "FemaleCitizen" | "_string": "FemaleCitizen" | ||||
}, | }, | ||||
"RestrictedClasses": { | "RestrictedClasses": { | ||||
"_string": "Elephant Archer" | "_string": "Elephant Archer" | ||||
}, | }, | ||||
"Bonuses": | "Bonuses": | ||||
{ | { | ||||
Show All 37 Lines | "Ranged": { | ||||
"BonusCav": { | "BonusCav": { | ||||
"Classes": "Cavalry", | "Classes": "Cavalry", | ||||
"Multiplier": 3 | "Multiplier": 3 | ||||
} | } | ||||
} | } | ||||
} | } | ||||
}, | }, | ||||
"Capture": { | "Capture": { | ||||
"Value": 8, | "Damage": { | ||||
"Capture": 30 | |||||
}, | |||||
"MaxRange": 10, | "MaxRange": 10, | ||||
"PrepareTime": 0, | |||||
"RepeatTime": 1000 | |||||
}, | }, | ||||
"Slaughter": {} | "Slaughter": { | ||||
"Damage": { | |||||
"Hack": 100, | |||||
"Pierce": 0, | |||||
"Crush": 0 | |||||
}, | |||||
"MaxRange": 5, | |||||
"PrepareTime": 0, | |||||
"RepeatTime": 1000, | |||||
"RestrictedClasses": { | |||||
"_string": "!Domestic" | |||||
}, | |||||
} | |||||
}); | }); | ||||
let defender = ++entityID; | let defender = ++entityID; | ||||
AddMock(defender, IID_Identity, { | AddMock(defender, IID_Identity, { | ||||
"GetClassesList": () => [defenderClass], | "GetClassesList": () => [defenderClass], | ||||
"HasClass": className => className == defenderClass | "HasClass": className => className == defenderClass | ||||
}); | }); | ||||
// TODO reuse the actual armour function | |||||
ConstructComponent(defender, "Armour", { | |||||
"Hack": 1, | |||||
"Pierce": 1, | |||||
"Crush": 1, | |||||
"Capture": 1 | |||||
}); | |||||
AddMock(defender, IID_Ownership, { | AddMock(defender, IID_Ownership, { | ||||
"GetOwner": () => 1 | "GetOwner": () => 1 | ||||
}); | }); | ||||
AddMock(defender, IID_Position, { | AddMock(defender, IID_Position, { | ||||
"IsInWorld": () => true, | "IsInWorld": () => true, | ||||
"GetHeightOffset": () => 0 | "GetHeightOffset": () => 0 | ||||
}); | }); | ||||
AddMock(defender, IID_Health, { | AddMock(defender, IID_Health, { | ||||
"GetHitpoints": () => 100 | "GetHitpoints": () => 100, | ||||
"GetMax": () => 100, | |||||
"GetMaxHitpoints": () => 100, | |||||
"CanAttack": () => isEnemy || defenderClass == "Domestic" | |||||
}); | }); | ||||
test_function(attacker, cmpAttack, defender); | test_function(attacker, cmpAttack, defender); | ||||
} | } | ||||
// Validate template getter functions | // Validate template getter functions | ||||
attackComponentTest(undefined, true, (attacker, cmpAttack, defender) => { | attackComponentTest(undefined, true, (attacker, cmpAttack, defender) => { | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(), ["Melee", "Ranged", "Capture"]); | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(), ["Melee", "Ranged", "Capture", "Slaughter"]); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes([]), ["Melee", "Ranged", "Capture"]); | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes([]), ["Melee", "Ranged", "Capture", "Slaughter"]); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["Melee", "Ranged", "Capture"]), ["Melee", "Ranged", "Capture"]); | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["Melee", "Ranged", "Capture"]), ["Melee", "Ranged", "Capture"]); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["Melee", "Ranged"]), ["Melee", "Ranged"]); | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["Melee", "Ranged"]), ["Melee", "Ranged"]); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["Capture"]), ["Capture"]); | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["Capture"]), ["Capture"]); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["Melee", "!Melee"]), []); | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["Melee", "!Melee"]), []); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["!Melee"]), ["Ranged", "Capture"]); | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["!Melee"]), ["Ranged", "Capture", "Slaughter"]); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["!Melee", "!Ranged"]), ["Capture"]); | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["!Melee", "!Ranged"]), ["Capture", "Slaughter"]); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["Capture", "!Ranged"]), ["Capture"]); | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["Capture", "!Ranged"]), ["Capture"]); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["Capture", "Melee", "!Ranged"]), ["Melee", "Capture"]); | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackTypes(["Capture", "Melee", "!Ranged"]), ["Melee", "Capture"]); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetPreferredClasses("Melee"), ["FemaleCitizen"]); | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetPreferredClasses("Melee"), ["FemaleCitizen"]); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetRestrictedClasses("Melee"), ["Elephant", "Archer"]); | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetRestrictedClasses("Melee"), ["Elephant", "Archer"]); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetFullAttackRange(), { "min": 0, "max": 80 }); | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetFullAttackRange(), { "min": 0, "max": 80 }); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackStrengths("Capture"), { "value": 8 }); | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackStrengths("Capture"), { | ||||
"Hack": 0, | |||||
"Pierce": 0, | |||||
"Crush": 0, | |||||
"Capture": 30 | |||||
}); | |||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackStrengths("Ranged"), { | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackStrengths("Ranged"), { | ||||
"Hack": 0, | "Hack": 0, | ||||
"Pierce": 10, | "Pierce": 10, | ||||
"Crush": 0 | "Crush": 0, | ||||
"Capture": 0 | |||||
}); | }); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackStrengths("Ranged.Splash"), { | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetAttackStrengths("Ranged.Splash"), { | ||||
"Hack": 0.0, | "Hack": 0.0, | ||||
"Pierce": 15.0, | "Pierce": 15.0, | ||||
"Crush": 35.0 | "Crush": 35.0, | ||||
"Capture": 0 | |||||
}); | }); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetTimers("Ranged"), { | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetTimers("Ranged"), { | ||||
"prepare": 300, | "prepare": 300, | ||||
"repeat": 500 | "repeat": 500 | ||||
}); | }); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetTimers("Capture"), { | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetTimers("Capture"), { | ||||
"prepare": 0, | "prepare": 0, | ||||
"repeat": 1000 | "repeat": 1000 | ||||
}); | }); | ||||
TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetSplashDamage("Ranged"), { | TS_ASSERT_UNEVAL_EQUALS(cmpAttack.GetSplashDamage("Ranged"), { | ||||
"damage": { | "damage": { | ||||
"Hack": 0, | "Hack": 0, | ||||
"Pierce": 15, | "Pierce": 15, | ||||
"Crush": 35, | "Crush": 35, | ||||
"Capture": 0 | |||||
}, | }, | ||||
"friendlyFire": false, | "friendlyFire": false, | ||||
"shape": "Circular" | "shape": "Circular" | ||||
}); | }); | ||||
}); | }); | ||||
for (let className of ["Infantry", "Cavalry"]) | for (let className of ["Infantry", "Cavalry"]) | ||||
attackComponentTest(className, true, (attacker, cmpAttack, defender) => { | attackComponentTest(className, true, (attacker, cmpAttack, defender) => { | ||||
Show All 14 Lines | |||||
attackComponentTest("Elephant", true, (attacker, cmpAttack, defender) => { | attackComponentTest("Elephant", true, (attacker, cmpAttack, defender) => { | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender), false); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender), false); | ||||
}); | }); | ||||
function testGetBestAttackAgainst(defenderClass, bestAttack, isBuilding = false) | function testGetBestAttackAgainst(defenderClass, bestAttack, isBuilding = false) | ||||
{ | { | ||||
attackComponentTest(defenderClass, true, (attacker, cmpAttack, defender) => { | attackComponentTest(defenderClass, true, (attacker, cmpAttack, defender) => { | ||||
AddMock(SYSTEM_ENTITY, IID_ObstructionManager, { | |||||
"DistanceToTarget": (ent, target) => 10 | |||||
}); | |||||
if (isBuilding) | if (isBuilding) | ||||
AddMock(defender, IID_Capturable, { | AddMock(defender, IID_Capturable, { | ||||
"CanCapture": playerID => { | "CanCapture": playerID => { | ||||
TS_ASSERT_EQUALS(playerID, 1); | TS_ASSERT_EQUALS(playerID, 1); | ||||
return true; | return true; | ||||
} | }, | ||||
"CanAttack": playerID => { | |||||
TS_ASSERT_EQUALS(playerID, 1); | |||||
return true; | |||||
}, | |||||
"GetMax": () => 100 | |||||
}); | }); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender), true); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender), true); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, []), true); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, []), true); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Ranged"]), true); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Ranged"]), true); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["!Melee"]), true); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["!Melee"]), true); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Capture"]), isBuilding); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Capture"]), isBuilding); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Slaughter"]), defenderClass == "Domestic"); | |||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["!Slaughter"]), true); | |||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Melee", "Capture"]), defenderClass != "Archer"); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Melee", "Capture"]), defenderClass != "Archer"); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Ranged", "Capture"]), true); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Ranged", "Capture"]), true); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["!Ranged", "!Melee"]), isBuilding || defenderClass == "Domestic"); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["!Ranged", "!Melee"]), isBuilding || defenderClass == "Domestic"); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Melee", "!Melee"]), false); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Melee", "!Melee"]), false); | ||||
let allowCapturing = [true]; | TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender), bestAttack); | ||||
if (!isBuilding) | TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, []), bestAttack); | ||||
allowCapturing.push(false); | TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["Slaughter"]), bestAttack); | ||||
for (let ac of allowCapturing) | TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["!Slaughter"]), bestAttack == "Slaughter" ? "Ranged" : bestAttack); | ||||
TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ac), bestAttack); | TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["Ranged"]), "Ranged"); | ||||
TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["!Melee"]), bestAttack); | |||||
TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["Capture"]), bestAttack); | |||||
TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["Melee", "Capture"]), isBuilding ? "Capture" : defenderClass == "Archer" ? "Ranged" : "Melee"); | |||||
TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["Ranged", "Capture"]), isBuilding ? "Capture" : "Ranged"); | |||||
TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["!Ranged", "!Melee"]), isBuilding ? "Capture" : defenderClass == "Domestic" ? "Slaughter" : bestAttack); | |||||
TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["Melee", "!Melee"]), bestAttack); | |||||
}); | }); | ||||
attackComponentTest(defenderClass, false, (attacker, cmpAttack, defender) => { | attackComponentTest(defenderClass, false, (attacker, cmpAttack, defender) => { | ||||
if (isBuilding) | if (isBuilding) | ||||
AddMock(defender, IID_Capturable, { | AddMock(defender, IID_Capturable, { | ||||
"CanCapture": playerID => { | "CanCapture": playerID => { | ||||
TS_ASSERT_EQUALS(playerID, 1); | TS_ASSERT_EQUALS(playerID, 1); | ||||
return true; | return true; | ||||
}, | |||||
"CanAttack": playerID => { | |||||
TS_ASSERT_EQUALS(playerID, 1); | |||||
return true; | |||||
} | } | ||||
}); | }); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender), isBuilding || defenderClass == "Domestic"); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender), isBuilding || defenderClass == "Domestic"); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, []), isBuilding || defenderClass == "Domestic"); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, []), isBuilding || defenderClass == "Domestic"); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Ranged"]), false); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Ranged"]), defenderClass == "Domestic"); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["!Melee"]), isBuilding || defenderClass == "Domestic"); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["!Melee"]), isBuilding || defenderClass == "Domestic"); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Capture"]), isBuilding); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Capture"]), isBuilding); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Melee", "Capture"]), isBuilding); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Slaughter"]), defenderClass == "Domestic"); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Ranged", "Capture"]), isBuilding); | |||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["!Ranged", "!Melee"]), isBuilding || defenderClass == "Domestic"); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["!Ranged", "!Melee"]), isBuilding || defenderClass == "Domestic"); | ||||
TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Melee", "!Melee"]), false); | TS_ASSERT_EQUALS(cmpAttack.CanAttack(defender, ["Melee", "!Melee"]), false); | ||||
let allowCapturing = [true]; | TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender), isBuilding ? "Capture" : defenderClass == "Domestic" ? "Slaughter" : undefined); | ||||
if (!isBuilding) | TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, []), isBuilding ? "Capture" : defenderClass == "Domestic" ? "Slaughter" : undefined); | ||||
allowCapturing.push(false); | TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["Slaughter"]), isBuilding ? "Capture" : defenderClass == "Domestic" ? "Slaughter" : undefined); | ||||
TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["!Slaughter"]), isBuilding ? "Capture" : defenderClass == "Domestic" ? "Ranged" : undefined); | |||||
let attack; | TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["Ranged"]), isBuilding ? "Capture" : defenderClass == "Domestic" ? "Ranged" : undefined); | ||||
if (defenderClass == "Domestic") | TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["!Melee"]), isBuilding ? "Capture" : defenderClass == "Domestic" ? "Slaughter" : undefined); | ||||
attack = "Slaughter"; | TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["Capture"]), isBuilding ? "Capture" : defenderClass == "Domestic" ? "Slaughter" : undefined); | ||||
else if (defenderClass == "Structure") | TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["Melee", "Capture"]), isBuilding ? "Capture" : defenderClass == "Domestic" ? "Melee" : undefined); | ||||
attack = "Capture"; | TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["Ranged", "Capture"]), isBuilding ? "Capture" : defenderClass == "Domestic" ? "Ranged" : undefined); | ||||
TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["!Ranged", "!Melee"]), isBuilding ? "Capture" : defenderClass == "Domestic" ? "Slaughter" : undefined); | |||||
for (let ac of allowCapturing) | TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ["Melee", "!Melee"]), isBuilding ? "Capture" : defenderClass == "Domestic" ? "Slaughter" : undefined); | ||||
TS_ASSERT_EQUALS(cmpAttack.GetBestAttackAgainst(defender, ac), bestAttack); | |||||
}); | }); | ||||
} | } | ||||
testGetBestAttackAgainst("FemaleCitizen", "Melee"); | testGetBestAttackAgainst("FemaleCitizen", "Ranged"); | ||||
testGetBestAttackAgainst("Archer", "Ranged"); | testGetBestAttackAgainst("Archer", "Ranged"); | ||||
testGetBestAttackAgainst("Domestic", "Slaughter"); | testGetBestAttackAgainst("Domestic", "Slaughter"); | ||||
testGetBestAttackAgainst("Structure", "Capture", true); | testGetBestAttackAgainst("Structure", "Capture", true); | ||||
function testPredictTimeToTarget(selfPosition, horizSpeed, targetPosition, targetVelocity) | function testPredictTimeToTarget(selfPosition, horizSpeed, targetPosition, targetVelocity) | ||||
{ | { | ||||
ResetState(); | ResetState(); | ||||
let cmpAttack = ConstructComponent(1, "Attack", {}); | let cmpAttack = ConstructComponent(1, "Attack", {}); | ||||
Show All 29 Lines |
Wildfire Games · Phabricator