Differential D792 Diff 3251 ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Damage.js
Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Damage.js
Engine.LoadHelperScript("DamageBonus.js"); | |||||
Engine.LoadHelperScript("Player.js"); | Engine.LoadHelperScript("Player.js"); | ||||
Engine.LoadHelperScript("Sound.js"); | Engine.LoadHelperScript("Sound.js"); | ||||
Engine.LoadHelperScript("ValueModification.js"); | Engine.LoadHelperScript("ValueModification.js"); | ||||
Engine.LoadComponentScript("interfaces/Attack.js"); | Engine.LoadComponentScript("interfaces/Attack.js"); | ||||
Engine.LoadComponentScript("interfaces/AttackDetection.js"); | Engine.LoadComponentScript("interfaces/AttackDetection.js"); | ||||
Engine.LoadComponentScript("interfaces/AuraManager.js"); | Engine.LoadComponentScript("interfaces/AuraManager.js"); | ||||
Engine.LoadComponentScript("interfaces/Damage.js"); | Engine.LoadComponentScript("interfaces/Damage.js"); | ||||
Engine.LoadComponentScript("interfaces/DamageReceiver.js"); | Engine.LoadComponentScript("interfaces/DamageReceiver.js"); | ||||
Show All 22 Lines | function Test_Generic() | ||||
let damage = 5; | let damage = 5; | ||||
let target = 21; | let target = 21; | ||||
let targetOwner = 7; | let targetOwner = 7; | ||||
let targetPos = new Vector3D(3, 0, 3); | let targetPos = new Vector3D(3, 0, 3); | ||||
let type = "Melee"; | let type = "Melee"; | ||||
let damageTaken = false; | let damageTaken = false; | ||||
cmpAttack.GetAttackStrengths = (type) => ({ "hack": 0, "pierce": 0, "crush": damage }); | cmpAttack.GetAttackStrengths = attackType => ({ "hack": 0, "pierce": 0, "crush": damage }); | ||||
cmpAttack.GetAttackBonus = (type, target) => 1.0; | |||||
let data = { | let data = { | ||||
"attacker": attacker, | "attacker": attacker, | ||||
"target": target, | "target": target, | ||||
"type": "Melee", | "type": "Melee", | ||||
"strengths": { "hack": 0, "pierce": 0, "crush": damage }, | "strengths": { "hack": 0, "pierce": 0, "crush": damage }, | ||||
"multiplier": 1.0, | "multiplier": 1.0, | ||||
"attackerOwner": attackerOwner, | "attackerOwner": attackerOwner, | ||||
"position": targetPos, | "position": targetPos, | ||||
"isSplash": false, | "isSplash": false, | ||||
"projectileId": 9, | "projectileId": 9, | ||||
"direction": new Vector3D(1,0,0) | "direction": new Vector3D(1,0,0) | ||||
}; | }; | ||||
AddMock(atkPlayerEntity, IID_Player, { | AddMock(atkPlayerEntity, IID_Player, { | ||||
"GetEnemies": () => [targetOwner] | "GetEnemies": () => [targetOwner] | ||||
}); | }); | ||||
AddMock(SYSTEM_ENTITY, IID_PlayerManager, { | AddMock(SYSTEM_ENTITY, IID_PlayerManager, { | ||||
"GetPlayerByID": (id) => atkPlayerEntity, | "GetPlayerByID": id => atkPlayerEntity, | ||||
"GetNumPlayers": () => 5 | "GetNumPlayers": () => 5 | ||||
}); | }); | ||||
AddMock(SYSTEM_ENTITY, IID_RangeManager, { | |||||
"ExecuteQueryAroundPos": () => [target], | |||||
"GetElevationAdaptedRange": (pos, rot, max, bonus, a) => max, | |||||
}); | |||||
AddMock(SYSTEM_ENTITY, IID_ProjectileManager, { | AddMock(SYSTEM_ENTITY, IID_ProjectileManager, { | ||||
RemoveProjectile: () => {}, | "RemoveProjectile": () => {}, | ||||
LaunchProjectileAtPoint: (ent, pos, speed, gravity) => {}, | "LaunchProjectileAtPoint": (ent, pos, speed, gravity) => {}, | ||||
}); | }); | ||||
AddMock(target, IID_Position, { | AddMock(target, IID_Position, { | ||||
"GetPosition": () => targetPos, | "GetPosition": () => targetPos, | ||||
"GetPreviousPosition": () => targetPos, | "GetPreviousPosition": () => targetPos, | ||||
"GetPosition2D": () => new Vector2D(3, 3), | "GetPosition2D": () => Vector2D.From(targetPos), | ||||
"IsInWorld": () => true, | "IsInWorld": () => true, | ||||
}); | }); | ||||
AddMock(target, IID_Health, {}); | AddMock(target, IID_Health, {}); | ||||
AddMock(target, IID_DamageReceiver, { | AddMock(target, IID_DamageReceiver, { | ||||
"TakeDamage": (hack, pierce, crush) => { damageTaken = true; return { "killed": false, "change": -crush }; }, | "TakeDamage": (hack, pierce, crush) => { damageTaken = true; return { "killed": false, "change": -crush }; }, | ||||
}); | }); | ||||
Show All 26 Lines | function Test_Generic() | ||||
cmpDamage.CauseDamage(data); | cmpDamage.CauseDamage(data); | ||||
TestDamage(); | TestDamage(); | ||||
type = data.type = "Ranged"; | type = data.type = "Ranged"; | ||||
cmpDamage.CauseDamage(data); | cmpDamage.CauseDamage(data); | ||||
TestDamage(); | TestDamage(); | ||||
data.friendlyFire = false; | |||||
data.range = 10; | |||||
data.shape = "Circular"; | |||||
data.isSplash = true; | |||||
cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_Damage, "MissileHit", 1000, data); | |||||
TestDamage(); | |||||
// Check for damage still being dealt if the attacker dies | // Check for damage still being dealt if the attacker dies | ||||
cmpAttack.PerformAttack("Ranged", target); | cmpAttack.PerformAttack("Ranged", target); | ||||
Engine.DestroyEntity(attacker); | Engine.DestroyEntity(attacker); | ||||
TestDamage(); | TestDamage(); | ||||
atkPlayerEntity = 1; | atkPlayerEntity = 1; | ||||
AddMock(atkPlayerEntity, IID_Player, { | AddMock(atkPlayerEntity, IID_Player, { | ||||
"GetEnemies": () => [2, 3] | "GetEnemies": () => [2, 3] | ||||
Show All 24 Lines | let data = { | ||||
"playersToDamage": [2], | "playersToDamage": [2], | ||||
"type": "Ranged", | "type": "Ranged", | ||||
"attackerOwner": attackerOwner | "attackerOwner": attackerOwner | ||||
}; | }; | ||||
let fallOff = function(x,y) | let fallOff = function(x,y) | ||||
{ | { | ||||
return (1 - x * x / (data.radius * data.radius)) * (1 - 25 * y * y / (data.radius * data.radius)); | return (1 - x * x / (data.radius * data.radius)) * (1 - 25 * y * y / (data.radius * data.radius)); | ||||
} | }; | ||||
let hitEnts = new Set(); | |||||
let cmpDamage = ConstructComponent(SYSTEM_ENTITY, "Damage"); | let cmpDamage = ConstructComponent(SYSTEM_ENTITY, "Damage"); | ||||
AddMock(SYSTEM_ENTITY, IID_RangeManager, { | AddMock(SYSTEM_ENTITY, IID_RangeManager, { | ||||
"ExecuteQueryAroundPos": () => [60, 61, 62], | "ExecuteQueryAroundPos": () => [60, 61, 62], | ||||
}); | }); | ||||
AddMock(60, IID_Position, { | AddMock(60, IID_Position, { | ||||
"GetPosition2D": () => new Vector2D(2.2, -0.4), | "GetPosition2D": () => new Vector2D(2.2, -0.4), | ||||
}); | }); | ||||
AddMock(61, IID_Position, { | AddMock(61, IID_Position, { | ||||
"GetPosition2D": () => new Vector2D(0, 0), | "GetPosition2D": () => new Vector2D(0, 0), | ||||
}); | }); | ||||
AddMock(62, IID_Position, { | AddMock(62, IID_Position, { | ||||
"GetPosition2D": () => new Vector2D(5, 2), | "GetPosition2D": () => new Vector2D(5, 2), | ||||
}); | }); | ||||
AddMock(60, IID_DamageReceiver, { | AddMock(60, IID_DamageReceiver, { | ||||
"TakeDamage": (hack, pierce, crush) => { | "TakeDamage": (hack, pierce, crush) => { | ||||
hitEnts.add(60); | |||||
TS_ASSERT_EQUALS(hack + pierce + crush, 100 * fallOff(2.2, -0.4)); | TS_ASSERT_EQUALS(hack + pierce + crush, 100 * fallOff(2.2, -0.4)); | ||||
return { "killed": false, "change": -(hack + pierce + crush) }; | return { "killed": false, "change": -(hack + pierce + crush) }; | ||||
} | } | ||||
}); | }); | ||||
AddMock(61, IID_DamageReceiver, { | AddMock(61, IID_DamageReceiver, { | ||||
TakeDamage: (hack, pierce, crush) => { | TakeDamage: (hack, pierce, crush) => { | ||||
hitEnts.add(61); | |||||
TS_ASSERT_EQUALS(hack + pierce + crush, 100 * fallOff(0, 0)); | TS_ASSERT_EQUALS(hack + pierce + crush, 100 * fallOff(0, 0)); | ||||
return { "killed": false, "change": -(hack + pierce + crush) }; | return { "killed": false, "change": -(hack + pierce + crush) }; | ||||
} | } | ||||
}); | }); | ||||
AddMock(62, IID_DamageReceiver, { | AddMock(62, IID_DamageReceiver, { | ||||
"TakeDamage": (hack, pierce, crush) => { | "TakeDamage": (hack, pierce, crush) => { | ||||
hitEnts.add(62); | |||||
TS_ASSERT_EQUALS(hack + pierce + crush, 0); | TS_ASSERT_EQUALS(hack + pierce + crush, 0); | ||||
return { "killed": false, "change": -(hack + pierce + crush) }; | return { "killed": false, "change": -(hack + pierce + crush) }; | ||||
} | } | ||||
}); | }); | ||||
cmpDamage.CauseSplashDamage(data); | cmpDamage.CauseSplashDamage(data); | ||||
TS_ASSERT(hitEnts.has(60)); | |||||
TS_ASSERT(hitEnts.has(61)); | |||||
TS_ASSERT(hitEnts.has(62)); | |||||
hitEnts.clear(); | |||||
data.direction = new Vector3D(0.6, 747, 0.8); | data.direction = new Vector3D(0.6, 747, 0.8); | ||||
AddMock(60, IID_DamageReceiver, { | AddMock(60, IID_DamageReceiver, { | ||||
"TakeDamage": (hack, pierce, crush) => { | "TakeDamage": (hack, pierce, crush) => { | ||||
hitEnts.add(60); | |||||
TS_ASSERT_EQUALS(hack + pierce + crush, 100 * fallOff(1, 2)); | TS_ASSERT_EQUALS(hack + pierce + crush, 100 * fallOff(1, 2)); | ||||
return { "killed": false, "change": -(hack + pierce + crush) }; | return { "killed": false, "change": -(hack + pierce + crush) }; | ||||
} | } | ||||
}); | }); | ||||
cmpDamage.CauseSplashDamage(data); | cmpDamage.CauseSplashDamage(data); | ||||
}; | TS_ASSERT(hitEnts.has(60)); | ||||
TS_ASSERT(hitEnts.has(61)); | |||||
TS_ASSERT(hitEnts.has(62)); | |||||
hitEnts.clear(); | |||||
} | |||||
TestLinearSplashDamage(); | TestLinearSplashDamage(); | ||||
function TestCircularSplashDamage() | function TestCircularSplashDamage() | ||||
{ | { | ||||
ResetState(); | ResetState(); | ||||
Engine.PostMessage = (ent, iid, message) => {}; | Engine.PostMessage = (ent, iid, message) => {}; | ||||
const radius = 10; | const radius = 10; | ||||
let fallOff = function(r) | let fallOff = function(r) | ||||
{ | { | ||||
return 1 - r * r / (radius * radius); | return 1 - r * r / (radius * radius); | ||||
} | }; | ||||
let cmpDamage = ConstructComponent(SYSTEM_ENTITY, "Damage"); | let cmpDamage = ConstructComponent(SYSTEM_ENTITY, "Damage"); | ||||
AddMock(SYSTEM_ENTITY, IID_RangeManager, { | AddMock(SYSTEM_ENTITY, IID_RangeManager, { | ||||
"ExecuteQueryAroundPos": () => [60, 61, 62], | "ExecuteQueryAroundPos": () => [60, 61, 62, 64], | ||||
}); | }); | ||||
AddMock(60, IID_Position, { | AddMock(60, IID_Position, { | ||||
"GetPosition2D": () => new Vector2D(3, 4), | "GetPosition2D": () => new Vector2D(3, 4), | ||||
}); | }); | ||||
AddMock(61, IID_Position, { | AddMock(61, IID_Position, { | ||||
"GetPosition2D": () => new Vector2D(0, 0), | "GetPosition2D": () => new Vector2D(0, 0), | ||||
}); | }); | ||||
AddMock(62, IID_Position, { | AddMock(62, IID_Position, { | ||||
"GetPosition2D": () => new Vector2D(3.6, 3.2), | "GetPosition2D": () => new Vector2D(3.6, 3.2), | ||||
}); | }); | ||||
AddMock(63, IID_Position, { | AddMock(63, IID_Position, { | ||||
"GetPosition2D": () => new Vector2D(5, -3), | "GetPosition2D": () => new Vector2D(10, -10), | ||||
}); | }); | ||||
// Target on the frontier of the shape | // Target on the frontier of the shape | ||||
AddMock(64, IID_Position, { | AddMock(64, IID_Position, { | ||||
"GetPosition2D": () => new Vector2D(4, -2), | "GetPosition2D": () => new Vector2D(9, -4), | ||||
}); | }); | ||||
AddMock(60, IID_DamageReceiver, { | AddMock(60, IID_DamageReceiver, { | ||||
"TakeDamage": (hack, pierce, crush) => { | "TakeDamage": (hack, pierce, crush) => { | ||||
TS_ASSERT_EQUALS(hack + pierce + crush, 100 * fallOff(0)); | TS_ASSERT_EQUALS(hack + pierce + crush, 100 * fallOff(0)); | ||||
return { "killed": false, "change": -(hack + pierce + crush) }; | return { "killed": false, "change": -(hack + pierce + crush) }; | ||||
} | } | ||||
}); | }); | ||||
Show All 9 Lines | AddMock(62, IID_DamageReceiver, { | ||||
"TakeDamage": (hack, pierce, crush) => { | "TakeDamage": (hack, pierce, crush) => { | ||||
TS_ASSERT_EQUALS(hack + pierce + crush, 100 * fallOff(1)); | TS_ASSERT_EQUALS(hack + pierce + crush, 100 * fallOff(1)); | ||||
return { "killed": false, "change": -(hack + pierce + crush) }; | return { "killed": false, "change": -(hack + pierce + crush) }; | ||||
} | } | ||||
}); | }); | ||||
AddMock(63, IID_DamageReceiver, { | AddMock(63, IID_DamageReceiver, { | ||||
"TakeDamage": (hack, pierce, crush) => { | "TakeDamage": (hack, pierce, crush) => { | ||||
TS_ASSERT_EQUALS(hack + pierce + crush, 0); | TS_ASSERT(false); | ||||
return { "killed": false, "change": -(hack + pierce + crush) }; | |||||
} | } | ||||
}); | }); | ||||
AddMock(64, IID_DamageReceiver, { | AddMock(64, IID_DamageReceiver, { | ||||
"TakeDamage": (hack, pierce, crush) => { | "TakeDamage": (hack, pierce, crush) => { | ||||
TS_ASSERT_EQUALS(hack + pierce + crush, 0); | TS_ASSERT_EQUALS(hack + pierce + crush, 0); | ||||
return { "killed": false, "change": -(hack + pierce + crush) }; | return { "killed": false, "change": -(hack + pierce + crush) }; | ||||
} | } | ||||
}); | }); | ||||
cmpDamage.CauseSplashDamage({ | cmpDamage.CauseSplashDamage({ | ||||
"attacker": 50, | "attacker": 50, | ||||
"origin": new Vector2D(3, 4), | "origin": new Vector2D(3, 4), | ||||
"radius": radius, | "radius": radius, | ||||
"shape": "Circular", | "shape": "Circular", | ||||
"strengths": { "hack" : 100, "pierce" : 0, "crush": 0 }, | "strengths": { "hack" : 100, "pierce" : 0, "crush": 0 }, | ||||
"playersToDamage": [2], | "playersToDamage": [2], | ||||
"type": "Ranged", | "type": "Ranged", | ||||
"attackerOwner": 1 | "attackerOwner": 1 | ||||
}); | }); | ||||
}; | } | ||||
TestCircularSplashDamage(); | TestCircularSplashDamage(); | ||||
function Test_MissileHit() | |||||
{ | |||||
ResetState(); | |||||
Engine.PostMessage = (ent, iid, message) => {}; | |||||
let cmpDamage = ConstructComponent(SYSTEM_ENTITY, "Damage"); | |||||
let target = 60; | |||||
let targetOwner = 1; | |||||
let targetPos = new Vector3D(3, 10, 0); | |||||
let hitEnts = new Set(); | |||||
AddMock(SYSTEM_ENTITY, IID_Timer, { | |||||
"GetLatestTurnLength": () => 500 | |||||
}); | |||||
const radius = 10; | |||||
let data = { | |||||
"type": "Ranged", | |||||
"attacker": 70, | |||||
"target": 60, | |||||
"strengths": { "hack": 0, "pierce": 100, "crush": 0 }, | |||||
"position": targetPos, | |||||
"direction": new Vector3D(1, 0, 0), | |||||
"projectileId": 9, | |||||
"bonus": undefined, | |||||
"isSplash": false, | |||||
"attackerOwner": 1 | |||||
}; | |||||
AddMock(SYSTEM_ENTITY, IID_PlayerManager, { | |||||
"GetPlayerByID": id => id == 1 ? 10 : 11, | |||||
"GetNumPlayers": () => 2 | |||||
}); | |||||
AddMock(SYSTEM_ENTITY, IID_ProjectileManager, { | |||||
"RemoveProjectile": () => {}, | |||||
"LaunchProjectileAtPoint": (ent, pos, speed, gravity) => {}, | |||||
}); | |||||
AddMock(60, IID_Position, { | |||||
"GetPosition": () => targetPos, | |||||
"GetPreviousPosition": () => targetPos, | |||||
"GetPosition2D": () => Vector2D.From(targetPos), | |||||
"IsInWorld": () => true, | |||||
}); | |||||
AddMock(60, IID_Health, {}); | |||||
AddMock(60, IID_DamageReceiver, { | |||||
"TakeDamage": (hack, pierce, crush) => { | |||||
TS_ASSERT_EQUALS(hack + pierce + crush, 100); | |||||
hitEnts.add(60); | |||||
return { "killed": false, "change": -(hack + pierce + crush) }; | |||||
} | |||||
}); | |||||
AddMock(60, IID_Footprint, { | |||||
"GetShape": () => ({ "type": "circle", "radius": 20 }), | |||||
}); | |||||
AddMock(70, IID_Ownership, { | |||||
"GetOwner": () => 1, | |||||
}); | |||||
AddMock(70, IID_Position, { | |||||
"GetPosition": () => new Vector3D(0, 0, 0), | |||||
"GetRotation": () => new Vector3D(0, 0, 0), | |||||
"IsInWorld": () => true, | |||||
}); | |||||
AddMock(10, IID_Player, { | |||||
"GetEnemies": () => [2] | |||||
}); | |||||
cmpDamage.MissileHit(data, 0); | |||||
TS_ASSERT(hitEnts.has(60)); | |||||
hitEnts.clear(); | |||||
// The main target is not hit but another one is hit. | |||||
AddMock(60, IID_Position, { | |||||
"GetPosition": () => new Vector3D(900, 10, 0), | |||||
"GetPreviousPosition": () => new Vector3D(900, 10, 0), | |||||
"GetPosition2D": () => new Vector2D(900, 0), | |||||
"IsInWorld": () => true, | |||||
}); | |||||
AddMock(60, IID_DamageReceiver, { | |||||
"TakeDamage": (hack, pierce, crush) => { | |||||
TS_ASSERT_EQUALS(false); | |||||
return { "killed": false, "change": -(hack + pierce + crush) }; | |||||
} | |||||
}); | |||||
AddMock(SYSTEM_ENTITY, IID_RangeManager, { | |||||
"ExecuteQueryAroundPos": () => [61] | |||||
}); | |||||
AddMock(61, IID_Position, { | |||||
"GetPosition": () => targetPos, | |||||
"GetPreviousPosition": () => targetPos, | |||||
"GetPosition2D": () => Vector2D.from3D(targetPos), | |||||
"IsInWorld": () => true, | |||||
}); | |||||
AddMock(61, IID_Health, {}); | |||||
AddMock(61, IID_DamageReceiver, { | |||||
"TakeDamage": (hack, pierce, crush) => { | |||||
TS_ASSERT_EQUALS(hack + pierce + crush, 100); | |||||
hitEnts.add(61); | |||||
return { "killed": false, "change": -(hack + pierce + crush) }; | |||||
} | |||||
}); | |||||
AddMock(61, IID_Footprint, { | |||||
"GetShape": () => ({ "type": "circle", "radius": 20 }), | |||||
}); | |||||
cmpDamage.MissileHit(data, 0); | |||||
TS_ASSERT(hitEnts.has(61)); | |||||
hitEnts.clear(); | |||||
// Add a splash damage. | |||||
data.friendlyFire = false; | |||||
data.radius = 10; | |||||
data.shape = "Circular"; | |||||
data.isSplash = true; | |||||
data.splashStrengths = { "hack": 0, "pierce": 0, "crush": 200 }; | |||||
AddMock(SYSTEM_ENTITY, IID_RangeManager, { | |||||
"ExecuteQueryAroundPos": () => [61, 62] | |||||
}); | |||||
let dealtDamage = 0; | |||||
AddMock(61, IID_DamageReceiver, { | |||||
"TakeDamage": (hack, pierce, crush) => { | |||||
dealtDamage += hack + pierce + crush; | |||||
hitEnts.add(61); | |||||
return { "killed": false, "change": -(hack + pierce + crush) }; | |||||
} | |||||
}); | |||||
AddMock(62, IID_Position, { | |||||
"GetPosition": () => new Vector3D(8, 10, 0), | |||||
"GetPreviousPosition": () => new Vector3D(8, 10, 0), | |||||
"GetPosition2D": () => new Vector2D(8, 0), | |||||
"IsInWorld": () => true, | |||||
}); | |||||
AddMock(62, IID_Health, {}); | |||||
AddMock(62, IID_DamageReceiver, { | |||||
"TakeDamage": (hack, pierce, crush) => { | |||||
TS_ASSERT_EQUALS(hack + pierce + crush, 200 * 0.75); | |||||
hitEnts.add(62); | |||||
return { "killed": false, "change": -(hack + pierce + crush) }; | |||||
} | |||||
}); | |||||
AddMock(62, IID_Footprint, { | |||||
"GetShape": () => ({ "type": "circle", "radius": 20 }), | |||||
}); | |||||
cmpDamage.MissileHit(data, 0); | |||||
TS_ASSERT(hitEnts.has(61)); | |||||
TS_ASSERT_EQUALS(dealtDamage, 100 + 200); | |||||
dealtDamage = 0; | |||||
TS_ASSERT(hitEnts.has(62)); | |||||
hitEnts.clear(); | |||||
// Add some hard counters bonus. | |||||
Engine.DestroyEntity(62); | |||||
AddMock(SYSTEM_ENTITY, IID_RangeManager, { | |||||
"ExecuteQueryAroundPos": () => [61] | |||||
}); | |||||
let bonus= { "BonusCav": { "Classes": "Cavalry", "Multiplier": 400 } }; | |||||
let splashBonus = { "BonusCav": { "Classes": "Cavalry", "Multiplier": 10000 } }; | |||||
AddMock(61, IID_Identity, { | |||||
"HasClass": cl => cl == "Cavalry" | |||||
}); | |||||
data.bonus = bonus; | |||||
cmpDamage.MissileHit(data, 0); | |||||
TS_ASSERT(hitEnts.has(61)); | |||||
TS_ASSERT_EQUALS(dealtDamage, 400 * 100 + 200); | |||||
dealtDamage = 0; | |||||
hitEnts.clear(); | |||||
data.splashBonus = splashBonus; | |||||
cmpDamage.MissileHit(data, 0); | |||||
TS_ASSERT(hitEnts.has(61)); | |||||
TS_ASSERT_EQUALS(dealtDamage, 400 * 100 + 10000 * 200); | |||||
dealtDamage = 0; | |||||
hitEnts.clear(); | |||||
data.bonus = undefined; | |||||
cmpDamage.MissileHit(data, 0); | |||||
TS_ASSERT(hitEnts.has(61)); | |||||
TS_ASSERT_EQUALS(dealtDamage, 100 + 10000 * 200); | |||||
dealtDamage = 0; | |||||
hitEnts.clear(); | |||||
data.bonus = null; | |||||
cmpDamage.MissileHit(data, 0); | |||||
TS_ASSERT(hitEnts.has(61)); | |||||
TS_ASSERT_EQUALS(dealtDamage, 100 + 10000 * 200); | |||||
dealtDamage = 0; | |||||
hitEnts.clear(); | |||||
data.bonus = {}; | |||||
cmpDamage.MissileHit(data, 0); | |||||
TS_ASSERT(hitEnts.has(61)); | |||||
TS_ASSERT_EQUALS(dealtDamage, 100 + 10000 * 200); | |||||
dealtDamage = 0; | |||||
hitEnts.clear(); | |||||
} | |||||
Test_MissileHit(); |
Wildfire Games · Phabricator