mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-07-10 08:55:48 -07:00
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.
119 lines
2.7 KiB
JavaScript
Executable file
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();
|