Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/public/simulation/components/tests/test_Damage.js
Engine.LoadHelperScript("DamageBonus.js"); | Engine.LoadHelperScript("DamageBonus.js"); | ||||
Engine.LoadHelperScript("Attacking.js"); | Engine.LoadHelperScript("Attacking.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/DelayedDamage.js"); | Engine.LoadComponentScript("interfaces/DelayedDamage.js"); | ||||
Engine.LoadComponentScript("interfaces/Foundation.js"); | |||||
Engine.LoadComponentScript("interfaces/Resistance.js"); | Engine.LoadComponentScript("interfaces/Resistance.js"); | ||||
Engine.LoadComponentScript("interfaces/Health.js"); | Engine.LoadComponentScript("interfaces/Health.js"); | ||||
Engine.LoadComponentScript("interfaces/Loot.js"); | Engine.LoadComponentScript("interfaces/Loot.js"); | ||||
Engine.LoadComponentScript("interfaces/Player.js"); | Engine.LoadComponentScript("interfaces/Player.js"); | ||||
Engine.LoadComponentScript("interfaces/Promotion.js"); | Engine.LoadComponentScript("interfaces/Promotion.js"); | ||||
Engine.LoadComponentScript("interfaces/StatusEffectsReceiver.js"); | Engine.LoadComponentScript("interfaces/StatusEffectsReceiver.js"); | ||||
Engine.LoadComponentScript("interfaces/ModifiersManager.js"); | Engine.LoadComponentScript("interfaces/ModifiersManager.js"); | ||||
Engine.LoadComponentScript("interfaces/Timer.js"); | Engine.LoadComponentScript("interfaces/Timer.js"); | ||||
Engine.LoadComponentScript("Attack.js"); | Engine.LoadComponentScript("Attack.js"); | ||||
Engine.LoadComponentScript("DelayedDamage.js"); | Engine.LoadComponentScript("DelayedDamage.js"); | ||||
Engine.LoadComponentScript("Resistance.js"); | |||||
Engine.LoadComponentScript("Timer.js"); | Engine.LoadComponentScript("Timer.js"); | ||||
function Test_Generic() | function Test_Generic() | ||||
{ | { | ||||
ResetState(); | ResetState(); | ||||
let cmpTimer = ConstructComponent(SYSTEM_ENTITY, "Timer"); | let cmpTimer = ConstructComponent(SYSTEM_ENTITY, "Timer"); | ||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | cmpTimer.OnUpdate({ "turnLength": 1 }); | ||||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | function Test_Generic() | ||||
AddMock(target, IID_Position, { | AddMock(target, IID_Position, { | ||||
"GetPosition": () => targetPos, | "GetPosition": () => targetPos, | ||||
"GetPreviousPosition": () => targetPos, | "GetPreviousPosition": () => targetPos, | ||||
"GetPosition2D": () => Vector2D.From(targetPos), | "GetPosition2D": () => Vector2D.From(targetPos), | ||||
"IsInWorld": () => true, | "IsInWorld": () => true, | ||||
}); | }); | ||||
AddMock(target, IID_Health, { | AddMock(target, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, bonusMultiplier) => { | "TakeDamage": (amount, __, ___) => { | ||||
damageTaken = true; | damageTaken = true; | ||||
return { "killed": false, "HPchange": -bonusMultiplier * effectData.Crush }; | return { "killed": false, "HPchange": -amount }; | ||||
}, | }, | ||||
}); | }); | ||||
AddMock(SYSTEM_ENTITY, IID_DelayedDamage, { | AddMock(SYSTEM_ENTITY, IID_DelayedDamage, { | ||||
"MissileHit": () => { | "MissileHit": () => { | ||||
damageTaken = true; | damageTaken = true; | ||||
}, | }, | ||||
}); | }); | ||||
Show All 28 Lines | function Test_Generic() | ||||
function TestDamage() | function TestDamage() | ||||
{ | { | ||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | cmpTimer.OnUpdate({ "turnLength": 1 }); | ||||
TS_ASSERT(damageTaken); | TS_ASSERT(damageTaken); | ||||
damageTaken = false; | damageTaken = false; | ||||
} | } | ||||
Attacking.HandleAttackEffects(data.type, data.attackData, data.target, data.attacker, data.attackerOwner); | let cmpResistance = ConstructComponent(target, "Resistance", {}); | ||||
cmpResistance.HandleAttackEffects(data.type, data.attackData, data.attacker, data.attackerOwner); | |||||
TestDamage(); | TestDamage(); | ||||
data.type = "Ranged"; | data.type = "Ranged"; | ||||
type = data.type; | type = data.type; | ||||
Attacking.HandleAttackEffects(data.type, data.attackData, data.target, data.attacker, data.attackerOwner); | cmpResistance.HandleAttackEffects(data.type, data.attackData, data.attacker, data.attackerOwner); | ||||
TestDamage(); | 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; | ||||
▲ Show 20 Lines • Show All 55 Lines • ▼ Show 20 Lines | function TestLinearSplashDamage() | ||||
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), | ||||
}); | }); | ||||
ConstructComponent(60, "Resistance", {}); | |||||
AddMock(60, IID_Health, { | AddMock(60, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
hitEnts.add(60); | hitEnts.add(60); | ||||
TS_ASSERT_EQUALS(mult * (effectData.Hack + effectData.Pierce + effectData.Crush), 100 * fallOff(2.2, -0.4)); | TS_ASSERT_EQUALS(amount, 100 * fallOff(2.2, -0.4)); | ||||
return { "killed": false, "change": -mult * (effectData.Hack + effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
ConstructComponent(61, "Resistance", {}); | |||||
AddMock(61, IID_Health, { | AddMock(61, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
hitEnts.add(61); | hitEnts.add(61); | ||||
TS_ASSERT_EQUALS(mult * (effectData.Hack + effectData.Pierce + effectData.Crush), 100 * fallOff(0, 0)); | TS_ASSERT_EQUALS(amount, 100 * fallOff(0, 0)); | ||||
return { "killed": false, "change": -mult * (effectData.Hack + effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
ConstructComponent(62, "Resistance", {}); | |||||
AddMock(62, IID_Health, { | AddMock(62, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
hitEnts.add(62); | hitEnts.add(62); | ||||
TS_ASSERT_EQUALS(mult * (effectData.Hack + effectData.Pierce + effectData.Crush), 0); | TS_ASSERT_EQUALS(amount, 0); | ||||
return { "killed": false, "change": -mult * (effectData.Hack + effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
Attacking.CauseDamageOverArea(data); | Attacking.CauseDamageOverArea(data); | ||||
TS_ASSERT(hitEnts.has(60)); | TS_ASSERT(hitEnts.has(60)); | ||||
TS_ASSERT(hitEnts.has(61)); | TS_ASSERT(hitEnts.has(61)); | ||||
TS_ASSERT(hitEnts.has(62)); | TS_ASSERT(hitEnts.has(62)); | ||||
hitEnts.clear(); | hitEnts.clear(); | ||||
data.direction = new Vector3D(0.6, 747, 0.8); | data.direction = new Vector3D(0.6, 747, 0.8); | ||||
AddMock(60, IID_Health, { | AddMock(60, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
hitEnts.add(60); | hitEnts.add(60); | ||||
TS_ASSERT_EQUALS(mult * (effectData.Hack + effectData.Pierce + effectData.Crush), 100 * fallOff(1, 2)); | TS_ASSERT_EQUALS(amount, 100 * fallOff(1, 2)); | ||||
return { "killed": false, "change": -mult * (effectData.Hack + effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
Attacking.CauseDamageOverArea(data); | Attacking.CauseDamageOverArea(data); | ||||
TS_ASSERT(hitEnts.has(60)); | TS_ASSERT(hitEnts.has(60)); | ||||
TS_ASSERT(hitEnts.has(61)); | TS_ASSERT(hitEnts.has(61)); | ||||
TS_ASSERT(hitEnts.has(62)); | TS_ASSERT(hitEnts.has(62)); | ||||
hitEnts.clear(); | hitEnts.clear(); | ||||
▲ Show 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | AddMock(63, IID_Position, { | ||||
"GetPosition2D": () => new Vector2D(10, -10), | "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(9, -4), | "GetPosition2D": () => new Vector2D(9, -4), | ||||
}); | }); | ||||
ConstructComponent(60, "Resistance", {}); | |||||
AddMock(60, IID_Health, { | AddMock(60, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
TS_ASSERT_EQUALS(mult * (effectData.Hack + effectData.Pierce + effectData.Crush), 100 * fallOff(0)); | TS_ASSERT_EQUALS(amount, 100 * fallOff(0)); | ||||
return { "killed": false, "change": -mult * (effectData.Hack + effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
ConstructComponent(61, "Resistance", {}); | |||||
AddMock(61, IID_Health, { | AddMock(61, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
TS_ASSERT_EQUALS(mult * (effectData.Hack + effectData.Pierce + effectData.Crush), 100 * fallOff(5)); | TS_ASSERT_EQUALS(amount, 100 * fallOff(5)); | ||||
return { "killed": false, "change": -mult * (effectData.Hack + effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
ConstructComponent(62, "Resistance", {}); | |||||
AddMock(62, IID_Health, { | AddMock(62, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
TS_ASSERT_EQUALS(mult * (effectData.Hack + effectData.Pierce + effectData.Crush), 100 * fallOff(1)); | TS_ASSERT_EQUALS(amount, 100 * fallOff(1)); | ||||
return { "killed": false, "change": -mult * (effectData.Hack + effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
ConstructComponent(63, "Resistance", {}); | |||||
AddMock(63, IID_Health, { | AddMock(63, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
TS_ASSERT(false); | TS_ASSERT(false); | ||||
} | } | ||||
}); | }); | ||||
ConstructComponent(64, "Resistance", {}); | |||||
let cmphealth = AddMock(64, IID_Health, { | let cmphealth = AddMock(64, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
TS_ASSERT_EQUALS(mult * (effectData.Hack + effectData.Pierce + effectData.Crush), 0); | TS_ASSERT_EQUALS(amount, 0); | ||||
return { "killed": false, "change": -mult * (effectData.Hack + effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
let spy = new Spy(cmphealth, "TakeDamage"); | let spy = new Spy(cmphealth, "TakeDamage"); | ||||
Attacking.CauseDamageOverArea({ | Attacking.CauseDamageOverArea({ | ||||
"type": "Ranged", | "type": "Ranged", | ||||
"attackData": { "Damage": { "Hack": 100, "Pierce": 0, "Crush": 0 } }, | "attackData": { "Damage": { "Hack": 100, "Pierce": 0, "Crush": 0 } }, | ||||
"attacker": 50, | "attacker": 50, | ||||
Show All 22 Lines | function Test_MissileHit() | ||||
let hitEnts = new Set(); | let hitEnts = new Set(); | ||||
AddMock(SYSTEM_ENTITY, IID_Timer, { | AddMock(SYSTEM_ENTITY, IID_Timer, { | ||||
"GetLatestTurnLength": () => 500 | "GetLatestTurnLength": () => 500 | ||||
}); | }); | ||||
const radius = 10; | const radius = 10; | ||||
ConstructComponent(target, "Resistance", {}); | |||||
let data = { | let data = { | ||||
"type": "Ranged", | "type": "Ranged", | ||||
"attackData": { "Damage": { "Hack": 0, "Pierce": 100, "Crush": 0 } }, | "attackData": { "Damage": { "Hack": 0, "Pierce": 100, "Crush": 0 } }, | ||||
"target": 60, | "target": 60, | ||||
"attacker": 70, | "attacker": 70, | ||||
"attackerOwner": 1, | "attackerOwner": 1, | ||||
"position": targetPos, | "position": targetPos, | ||||
"direction": new Vector3D(1, 0, 0), | "direction": new Vector3D(1, 0, 0), | ||||
Show All 13 Lines | function Test_MissileHit() | ||||
AddMock(60, IID_Position, { | AddMock(60, IID_Position, { | ||||
"GetPosition": () => targetPos, | "GetPosition": () => targetPos, | ||||
"GetPreviousPosition": () => targetPos, | "GetPreviousPosition": () => targetPos, | ||||
"GetPosition2D": () => Vector2D.From(targetPos), | "GetPosition2D": () => Vector2D.From(targetPos), | ||||
"IsInWorld": () => true, | "IsInWorld": () => true, | ||||
}); | }); | ||||
ConstructComponent(60, "Resistance", {}); | |||||
AddMock(60, IID_Health, { | AddMock(60, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
hitEnts.add(60); | hitEnts.add(60); | ||||
TS_ASSERT_EQUALS(mult * (effectData.Hack + effectData.Pierce + effectData.Crush), 100); | TS_ASSERT_EQUALS(amount, 100); | ||||
return { "killed": false, "change": -mult * (effectData.Hack + effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
AddMock(60, IID_Footprint, { | AddMock(60, IID_Footprint, { | ||||
"GetShape": () => ({ "type": "circle", "radius": 20 }), | "GetShape": () => ({ "type": "circle", "radius": 20 }), | ||||
}); | }); | ||||
AddMock(70, IID_Ownership, { | AddMock(70, IID_Ownership, { | ||||
Show All 18 Lines | function Test_MissileHit() | ||||
AddMock(60, IID_Position, { | AddMock(60, IID_Position, { | ||||
"GetPosition": () => new Vector3D(900, 10, 0), | "GetPosition": () => new Vector3D(900, 10, 0), | ||||
"GetPreviousPosition": () => new Vector3D(900, 10, 0), | "GetPreviousPosition": () => new Vector3D(900, 10, 0), | ||||
"GetPosition2D": () => new Vector2D(900, 0), | "GetPosition2D": () => new Vector2D(900, 0), | ||||
"IsInWorld": () => true, | "IsInWorld": () => true, | ||||
}); | }); | ||||
ConstructComponent(60, "Resistance", {}); | |||||
AddMock(60, IID_Health, { | AddMock(60, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
TS_ASSERT_EQUALS(false); | TS_ASSERT_EQUALS(false); | ||||
return { "killed": false, "change": -mult * (effectData.Hack + effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
AddMock(SYSTEM_ENTITY, IID_RangeManager, { | AddMock(SYSTEM_ENTITY, IID_RangeManager, { | ||||
"ExecuteQueryAroundPos": () => [61] | "ExecuteQueryAroundPos": () => [61] | ||||
}); | }); | ||||
AddMock(61, IID_Position, { | AddMock(61, IID_Position, { | ||||
"GetPosition": () => targetPos, | "GetPosition": () => targetPos, | ||||
"GetPreviousPosition": () => targetPos, | "GetPreviousPosition": () => targetPos, | ||||
"GetPosition2D": () => Vector2D.from3D(targetPos), | "GetPosition2D": () => Vector2D.from3D(targetPos), | ||||
"IsInWorld": () => true, | "IsInWorld": () => true, | ||||
}); | }); | ||||
ConstructComponent(61, "Resistance", {}); | |||||
AddMock(61, IID_Health, { | AddMock(61, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
hitEnts.add(61); | hitEnts.add(61); | ||||
TS_ASSERT_EQUALS(mult * (effectData.Hack + effectData.Pierce + effectData.Crush), 100); | TS_ASSERT_EQUALS(amount, 100); | ||||
return { "killed": false, "change": -mult * (effectData.Hack + effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
AddMock(61, IID_Footprint, { | AddMock(61, IID_Footprint, { | ||||
"GetShape": () => ({ "type": "circle", "radius": 20 }), | "GetShape": () => ({ "type": "circle", "radius": 20 }), | ||||
}); | }); | ||||
cmpDelayedDamage.MissileHit(data, 0); | cmpDelayedDamage.MissileHit(data, 0); | ||||
TS_ASSERT(hitEnts.has(61)); | TS_ASSERT(hitEnts.has(61)); | ||||
hitEnts.clear(); | hitEnts.clear(); | ||||
// Add a splash damage. | // Add a splash damage. | ||||
data.splash = {}; | data.splash = {}; | ||||
data.splash.friendlyFire = false; | data.splash.friendlyFire = false; | ||||
data.splash.radius = 10; | data.splash.radius = 10; | ||||
data.splash.shape = "Circular"; | data.splash.shape = "Circular"; | ||||
data.splash.attackData = { "Damage": { "Hack": 0, "Pierce": 0, "Crush": 200 } }; | data.splash.attackData = { "Damage": { "Hack": 0, "Pierce": 0, "Crush": 200 } }; | ||||
AddMock(SYSTEM_ENTITY, IID_RangeManager, { | AddMock(SYSTEM_ENTITY, IID_RangeManager, { | ||||
"ExecuteQueryAroundPos": () => [61, 62] | "ExecuteQueryAroundPos": () => [61, 62] | ||||
}); | }); | ||||
let dealtDamage = 0; | let dealtDamage = 0; | ||||
ConstructComponent(61, "Resistance", {}); | |||||
AddMock(61, IID_Health, { | AddMock(61, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
hitEnts.add(61); | hitEnts.add(61); | ||||
dealtDamage += mult * (effectData.Hack + effectData.Pierce + effectData.Crush); | dealtDamage += amount; | ||||
return { "killed": false, "change": -mult * (effectData.Hack + effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
AddMock(62, IID_Position, { | AddMock(62, IID_Position, { | ||||
"GetPosition": () => new Vector3D(8, 10, 0), | "GetPosition": () => new Vector3D(8, 10, 0), | ||||
"GetPreviousPosition": () => new Vector3D(8, 10, 0), | "GetPreviousPosition": () => new Vector3D(8, 10, 0), | ||||
"GetPosition2D": () => new Vector2D(8, 0), | "GetPosition2D": () => new Vector2D(8, 0), | ||||
"IsInWorld": () => true, | "IsInWorld": () => true, | ||||
}); | }); | ||||
ConstructComponent(62, "Resistance", {}); | |||||
AddMock(62, IID_Health, { | AddMock(62, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
hitEnts.add(62); | hitEnts.add(62); | ||||
TS_ASSERT_EQUALS(mult * (effectData.Hack + effectData.Pierce + effectData.Crush), 200 * 0.75); | TS_ASSERT_EQUALS(amount, 200 * 0.75); | ||||
return { "killed": false, "change": -mult * (effectData.Hack + effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
AddMock(62, IID_Footprint, { | AddMock(62, IID_Footprint, { | ||||
"GetShape": () => ({ "type": "circle", "radius": 20 }), | "GetShape": () => ({ "type": "circle", "radius": 20 }), | ||||
}); | }); | ||||
cmpDelayedDamage.MissileHit(data, 0); | cmpDelayedDamage.MissileHit(data, 0); | ||||
▲ Show 20 Lines • Show All 59 Lines • ▼ Show 20 Lines | function Test_MissileHit() | ||||
data.splash.shape = "Circular"; | data.splash.shape = "Circular"; | ||||
data.splash.attackData = { "Damage": { "Pierce": 0, "Crush": 200 } }; | data.splash.attackData = { "Damage": { "Pierce": 0, "Crush": 200 } }; | ||||
AddMock(SYSTEM_ENTITY, IID_RangeManager, { | AddMock(SYSTEM_ENTITY, IID_RangeManager, { | ||||
"ExecuteQueryAroundPos": () => [61, 62] | "ExecuteQueryAroundPos": () => [61, 62] | ||||
}); | }); | ||||
dealtDamage = 0; | dealtDamage = 0; | ||||
ConstructComponent(61, "Resistance", {}); | |||||
AddMock(61, IID_Health, { | AddMock(61, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
hitEnts.add(61); | hitEnts.add(61); | ||||
dealtDamage += mult * (effectData.Pierce + effectData.Crush); | dealtDamage += amount; | ||||
return { "killed": false, "change": -mult * (effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
AddMock(62, IID_Position, { | AddMock(62, IID_Position, { | ||||
"GetPosition": () => new Vector3D(8, 10, 0), | "GetPosition": () => new Vector3D(8, 10, 0), | ||||
"GetPreviousPosition": () => new Vector3D(8, 10, 0), | "GetPreviousPosition": () => new Vector3D(8, 10, 0), | ||||
"GetPosition2D": () => new Vector2D(8, 0), | "GetPosition2D": () => new Vector2D(8, 0), | ||||
"IsInWorld": () => true, | "IsInWorld": () => true, | ||||
}); | }); | ||||
ConstructComponent(62, "Resistance", {}); | |||||
AddMock(62, IID_Health, { | AddMock(62, IID_Health, { | ||||
"TakeDamage": (effectData, __, ___, mult) => { | "TakeDamage": (amount, __, ___) => { | ||||
hitEnts.add(62); | hitEnts.add(62); | ||||
TS_ASSERT_EQUALS(mult * (effectData.Pierce + effectData.Crush), 200 * 0.75); | TS_ASSERT_EQUALS(amount, 200 * 0.75); | ||||
return { "killed": false, "change": -mult * (effectData.Pierce + effectData.Crush) }; | return { "killed": false, "change": -amount }; | ||||
} | } | ||||
}); | }); | ||||
AddMock(62, IID_Footprint, { | AddMock(62, IID_Footprint, { | ||||
"GetShape": () => ({ "type": "circle", "radius": 20 }), | "GetShape": () => ({ "type": "circle", "radius": 20 }), | ||||
}); | }); | ||||
cmpDelayedDamage.MissileHit(data, 0); | cmpDelayedDamage.MissileHit(data, 0); | ||||
TS_ASSERT(hitEnts.has(61)); | TS_ASSERT(hitEnts.has(61)); | ||||
TS_ASSERT_EQUALS(dealtDamage, 100 + 200); | TS_ASSERT_EQUALS(dealtDamage, 100 + 200); | ||||
dealtDamage = 0; | dealtDamage = 0; | ||||
TS_ASSERT(hitEnts.has(62)); | TS_ASSERT(hitEnts.has(62)); | ||||
hitEnts.clear(); | hitEnts.clear(); | ||||
} | } | ||||
Test_MissileHit(); | Test_MissileHit(); |
Wildfire Games · Phabricator