0ad/binaries/data/mods/public/simulation/components/tests/test_StatusEffectsReceiver.js
wraitii f504c643a0 Allow entities to be affected by Status Effects from ranged attacks.
This implements a status effects receiver component (in a similar
fashion to the damage receiver component). The plan is to further extend
this component notably to handle graphical indication of status effects,
and a variety of other effects.

Currently implemented: ranged attacks can inflict status effects that
reduce HP over time.
This can be resisted by armour.

No units currently utilise this in-game but with proper graphics support
that could be changed.

Patch By: Mate-86
Reviewed By: wraitii
References #1912

Differential Revision: https://code.wildfiregames.com/D1252
This was SVN commit r22304.
2019-05-26 12:44:46 +00:00

119 lines
2.7 KiB
JavaScript
Executable file

Engine.LoadComponentScript("interfaces/Damage.js");
Engine.LoadComponentScript("interfaces/StatusEffectsReceiver.js");
Engine.LoadComponentScript("interfaces/Timer.js");
Engine.LoadComponentScript("StatusEffectsReceiver.js");
Engine.LoadComponentScript("Timer.js");
var target = 42;
var cmpStatusReceiver;
var cmpTimer;
var dealtDamage;
function setup()
{
cmpStatusReceiver = ConstructComponent(target, "StatusEffectsReceiver");
cmpTimer = ConstructComponent(SYSTEM_ENTITY, "Timer");
dealtDamage = 0;
}
function testInflictEffects()
{
setup();
let statusName = "Burn";
AddMock(SYSTEM_ENTITY, IID_Damage, {
"CauseDamage": (data) => { dealtDamage += data.strengths[statusName]; }
});
// damage scheduled: 0, 10, 20 sec
cmpStatusReceiver.InflictEffects({
[statusName]: {
"Duration": 20000,
"Interval": 10000,
"Damage": 1
}
});
cmpTimer.OnUpdate({ "turnLength": 1 });
TS_ASSERT_EQUALS(dealtDamage, 1); // 1 sec
cmpTimer.OnUpdate({ "turnLength": 8 });
TS_ASSERT_EQUALS(dealtDamage, 1); // 9 sec
cmpTimer.OnUpdate({ "turnLength": 1 });
TS_ASSERT_EQUALS(dealtDamage, 2); // 10 sec
cmpTimer.OnUpdate({ "turnLength": 10 });
TS_ASSERT_EQUALS(dealtDamage, 3); // 20 sec
cmpTimer.OnUpdate({ "turnLength": 10 });
TS_ASSERT_EQUALS(dealtDamage, 3); // 30 sec
}
testInflictEffects();
function testMultipleEffects()
{
setup();
AddMock(SYSTEM_ENTITY, IID_Damage, {
"CauseDamage": (data) => {
if (data.strengths.Burn) dealtDamage += data.strengths.Burn;
if (data.strengths.Poison) dealtDamage += data.strengths.Poison;
}
});
// damage scheduled: 0, 1, 2, 10 sec
cmpStatusReceiver.InflictEffects({
"Burn": {
"Duration": 20000,
"Interval": 10000,
"Damage": 10
},
"Poison": {
"Duration": 3000,
"Interval": 1000,
"Damage": 1
}
});
cmpTimer.OnUpdate({ "turnLength": 1 });
TS_ASSERT_EQUALS(dealtDamage, 12); // 1 sec
cmpTimer.OnUpdate({ "turnLength": 1 });
TS_ASSERT_EQUALS(dealtDamage, 13); // 2 sec
cmpTimer.OnUpdate({ "turnLength": 1 });
TS_ASSERT_EQUALS(dealtDamage, 13); // 3 sec
cmpTimer.OnUpdate({ "turnLength": 7 });
TS_ASSERT_EQUALS(dealtDamage, 23); // 10 sec
}
testMultipleEffects();
function testRemoveEffect()
{
setup();
let statusName = "Poison";
AddMock(SYSTEM_ENTITY, IID_Damage, {
"CauseDamage": (data) => { dealtDamage += data.strengths[statusName]; }
});
// damage scheduled: 0, 10, 20 sec
cmpStatusReceiver.InflictEffects({
[statusName]: {
"Duration": 20000,
"Interval": 10000,
"Damage": 1
}
});
cmpTimer.OnUpdate({ "turnLength": 1 });
TS_ASSERT_EQUALS(dealtDamage, 1); // 1 sec
cmpStatusReceiver.RemoveEffect(statusName);
cmpTimer.OnUpdate({ "turnLength": 10 });
TS_ASSERT_EQUALS(dealtDamage, 1); // 11 sec
}
testRemoveEffect();