Differential D2296 Diff 11295 binaries/data/mods/public/simulation/components/tests/test_StatusEffectsReceiver.js
Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/public/simulation/components/tests/test_StatusEffectsReceiver.js
Engine.LoadHelperScript("MultiKeyMap.js"); | |||||
Engine.LoadHelperScript("Player.js"); | |||||
Engine.LoadHelperScript("ValueModification.js"); | |||||
Engine.LoadComponentScript("interfaces/Health.js"); | |||||
Engine.LoadComponentScript("interfaces/ModifiersManager.js"); | |||||
Engine.LoadComponentScript("interfaces/StatusEffectsReceiver.js"); | Engine.LoadComponentScript("interfaces/StatusEffectsReceiver.js"); | ||||
Engine.LoadComponentScript("interfaces/Timer.js"); | Engine.LoadComponentScript("interfaces/Timer.js"); | ||||
Engine.LoadComponentScript("Health.js"); | |||||
Engine.LoadComponentScript("ModifiersManager.js"); | |||||
Engine.LoadComponentScript("StatusEffectsReceiver.js"); | Engine.LoadComponentScript("StatusEffectsReceiver.js"); | ||||
Engine.LoadComponentScript("Timer.js"); | Engine.LoadComponentScript("Timer.js"); | ||||
var target = 42; | var target = 42; | ||||
var cmpStatusReceiver; | var cmpStatusReceiver; | ||||
var cmpTimer; | var cmpTimer; | ||||
var dealtDamage; | var dealtDamage; | ||||
var enemyEntity = 4; | var enemyEntity = 4; | ||||
▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | function testMultipleEffects() | ||||
let Attacking = { | let Attacking = { | ||||
"HandleAttackEffects": (_, attackData) => { | "HandleAttackEffects": (_, attackData) => { | ||||
if (attackData.Damage.Burn) dealtDamage += attackData.Damage.Burn; | if (attackData.Damage.Burn) dealtDamage += attackData.Damage.Burn; | ||||
if (attackData.Damage.Poison) dealtDamage += attackData.Damage.Poison; | if (attackData.Damage.Poison) dealtDamage += attackData.Damage.Poison; | ||||
}, | }, | ||||
}; | }; | ||||
Engine.RegisterGlobal("Attacking", Attacking); | Engine.RegisterGlobal("Attacking", Attacking); | ||||
// damage scheduled: 0, 1, 2, 10 sec | // Damage scheduled: 0, 1, 2, 10 seconds. | ||||
cmpStatusReceiver.ApplyStatus({ | cmpStatusReceiver.ApplyStatus({ | ||||
"Burn": { | "Burn": { | ||||
"Duration": 20000, | "Duration": 20000, | ||||
"Interval": 10000, | "Interval": 10000, | ||||
"Damage": { | "Damage": { | ||||
"Burn": 10 | "Burn": 10 | ||||
} | } | ||||
}, | }, | ||||
Show All 25 Lines | |||||
{ | { | ||||
setup(); | setup(); | ||||
let statusName = "Poison"; | let statusName = "Poison"; | ||||
let Attacking = { | let Attacking = { | ||||
"HandleAttackEffects": (_, attackData) => { dealtDamage += attackData.Damage[statusName]; } | "HandleAttackEffects": (_, attackData) => { dealtDamage += attackData.Damage[statusName]; } | ||||
}; | }; | ||||
Engine.RegisterGlobal("Attacking", Attacking); | Engine.RegisterGlobal("Attacking", Attacking); | ||||
// damage scheduled: 0, 10, 20 sec | // Damage scheduled: 0, 10, 20 seconds. | ||||
cmpStatusReceiver.AddStatus(statusName, { | cmpStatusReceiver.AddStatus(statusName, { | ||||
"Duration": 20000, | "Duration": 20000, | ||||
"Interval": 10000, | "Interval": 10000, | ||||
"Damage": { | "Damage": { | ||||
[statusName]: 1 | [statusName]: 1 | ||||
} | } | ||||
}, | }, | ||||
{ | { | ||||
"entity": enemyEntity, | "entity": enemyEntity, | ||||
"owner": enemy, | "owner": enemy, | ||||
}); | }); | ||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | cmpTimer.OnUpdate({ "turnLength": 1 }); | ||||
TS_ASSERT_EQUALS(dealtDamage, 1); // 1 sec | TS_ASSERT_EQUALS(dealtDamage, 1); // 1 sec | ||||
cmpStatusReceiver.RemoveStatus(statusName); | cmpStatusReceiver.RemoveStatus(statusName); | ||||
cmpTimer.OnUpdate({ "turnLength": 10 }); | cmpTimer.OnUpdate({ "turnLength": 10 }); | ||||
TS_ASSERT_EQUALS(dealtDamage, 1); // 11 sec | TS_ASSERT_EQUALS(dealtDamage, 1); // 11 sec | ||||
} | } | ||||
testRemoveStatus(); | testRemoveStatus(); | ||||
function testModificationStatus() | |||||
{ | |||||
setup(); | |||||
AddMock(target, IID_Identity, { | |||||
"GetClassesList": () => ["AffectedClass"] | |||||
}); | |||||
let cmpModifiersManager = ConstructComponent(SYSTEM_ENTITY, "ModifiersManager"); | |||||
let maxHealth = 100; | |||||
AddMock(target, IID_Health, { | |||||
"GetMaxHitpoints": () => ApplyValueModificationsToEntity("Health/Max", maxHealth, target) | |||||
}); | |||||
let statusName = "Haste"; | |||||
let factor = 0.5; | |||||
cmpStatusReceiver.AddStatus(statusName, { | |||||
"Duration": 5000, | |||||
"Modifiers": { | |||||
[statusName]: { | |||||
"Paths": { | |||||
"_string": "Health/Max" | |||||
}, | |||||
"Affects": { | |||||
"_string": "AffectedClass" | |||||
}, | |||||
"Multiply": factor | |||||
} | |||||
} | |||||
}, | |||||
{ | |||||
"entity": enemyEntity, | |||||
"owner": enemy, | |||||
}); | |||||
let cmpHealth = Engine.QueryInterface(target, IID_Health); | |||||
// Test that the modification is applied. | |||||
TS_ASSERT_EQUALS(cmpHealth.GetMaxHitpoints(), maxHealth * factor); | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(cmpHealth.GetMaxHitpoints(), maxHealth * factor); | |||||
// Test that the modification is removed after the appropriate time. | |||||
cmpTimer.OnUpdate({ "turnLength": 4 }); | |||||
TS_ASSERT_EQUALS(cmpHealth.GetMaxHitpoints(), maxHealth); | |||||
} | |||||
testModificationStatus(); | |||||
function applyStatus(stackability) | |||||
{ | |||||
cmpStatusReceiver.ApplyStatus({ | |||||
"Burn": { | |||||
"Duration": 3000, | |||||
"Interval": 1000, | |||||
"Damage": { | |||||
"Burn": 1 | |||||
}, | |||||
"Stackability": stackability | |||||
} | |||||
}); | |||||
} | |||||
function testStackabilityIgnore() | |||||
{ | |||||
setup(); | |||||
let Attacking = { | |||||
"HandleAttackEffects": (_, attackData) => { | |||||
if (attackData.Damage.Burn) dealtDamage += attackData.Damage.Burn; | |||||
}, | |||||
}; | |||||
Engine.RegisterGlobal("Attacking", Attacking); | |||||
applyStatus("Ignore"); | |||||
// 1 Second: 1 update and lateness. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 2); | |||||
applyStatus("Ignore"); | |||||
// 2 Seconds. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 3); | |||||
// 3 Seconds: finished in previous turn. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 3); | |||||
} | |||||
function testStackabilityExtend() | |||||
{ | |||||
setup(); | |||||
let Attacking = { | |||||
"HandleAttackEffects": (_, attackData) => { | |||||
if (attackData.Damage.Burn) dealtDamage += attackData.Damage.Burn; | |||||
}, | |||||
}; | |||||
Engine.RegisterGlobal("Attacking", Attacking); | |||||
applyStatus("Extend"); | |||||
// 1 Second: 1 update and lateness. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 2); | |||||
applyStatus("Extend"); // +3 Seconds. | |||||
// 2 Seconds. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 3); | |||||
// 3 Seconds: extended in previous turn. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 4); | |||||
// 4 Seconds. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 5); | |||||
// 5 Seconds. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 6); | |||||
// 6 Seconds: finished in previous turn (3 + 3). | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 6); | |||||
} | |||||
function testStackabilityReplace() | |||||
{ | |||||
setup(); | |||||
let Attacking = { | |||||
"HandleAttackEffects": (_, attackData) => { | |||||
if (attackData.Damage.Burn) dealtDamage += attackData.Damage.Burn; | |||||
}, | |||||
}; | |||||
Engine.RegisterGlobal("Attacking", Attacking); | |||||
applyStatus("Replace"); | |||||
// 1 Second: 1 update and lateness. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 2); | |||||
applyStatus("Replace"); | |||||
// 2 Seconds: 1 update and lateness of the new status. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 4); | |||||
// 3 Seconds. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 5); | |||||
// 4 Seconds: finished in previous turn. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 5); | |||||
} | |||||
function testStackabilityStack() | |||||
{ | |||||
setup(); | |||||
let Attacking = { | |||||
"HandleAttackEffects": (_, attackData) => { | |||||
if (attackData.Damage.Burn) dealtDamage += attackData.Damage.Burn; | |||||
}, | |||||
}; | |||||
Engine.RegisterGlobal("Attacking", Attacking); | |||||
applyStatus("Stack"); | |||||
// 1 Second: 1 update and lateness. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 2); | |||||
applyStatus("Stack"); | |||||
// 2 Seconds: 1 damage from the previous status + 2 from the new (1 turn + lateness). | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 5); | |||||
// 3 Seconds: first one finished in the previous turn, +1 from the new. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 6); | |||||
// 4 Seconds: new status finished in previous turn. | |||||
cmpTimer.OnUpdate({ "turnLength": 1 }); | |||||
TS_ASSERT_EQUALS(dealtDamage, 6); | |||||
} | |||||
function testStackability() | |||||
{ | |||||
testStackabilityIgnore(); | |||||
testStackabilityExtend(); | |||||
testStackabilityReplace(); | |||||
testStackabilityStack(); | |||||
} | |||||
testStackability(); | |||||
elexis: \n |
Wildfire Games · Phabricator
\n