mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-07-07 07:25:47 -07:00
Status effect can apply modifier to the entity (armour strength, walking speed, ...) This is also hiding status effect icons by default in selection detail. Fixing smaller related bugs. Differential Revision: https://code.wildfiregames.com/D2281 Patch by: @Freagarach Comments by: Stan, wraitii This was SVN commit r23448.
135 lines
3 KiB
JavaScript
Executable file
135 lines
3 KiB
JavaScript
Executable file
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;
|
|
var enemyEntity = 4;
|
|
var enemy = 2;
|
|
|
|
function setup()
|
|
{
|
|
cmpStatusReceiver = ConstructComponent(target, "StatusEffectsReceiver");
|
|
cmpTimer = ConstructComponent(SYSTEM_ENTITY, "Timer");
|
|
dealtDamage = 0;
|
|
}
|
|
|
|
function testInflictEffects()
|
|
{
|
|
setup();
|
|
let statusName = "Burn";
|
|
let Attacking = {
|
|
"HandleAttackEffects": (_, attackData) => { dealtDamage += attackData.Damage[statusName]; }
|
|
};
|
|
Engine.RegisterGlobal("Attacking", Attacking);
|
|
|
|
// damage scheduled: 0, 10, 20 sec
|
|
cmpStatusReceiver.AddStatus(statusName, {
|
|
"Duration": 20000,
|
|
"Interval": 10000,
|
|
"Damage": {
|
|
[statusName]: 1
|
|
}
|
|
},
|
|
{
|
|
"entity": enemyEntity,
|
|
"owner": enemy,
|
|
});
|
|
|
|
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();
|
|
let Attacking = {
|
|
"HandleAttackEffects": (_, attackData) => {
|
|
if (attackData.Damage.Burn) dealtDamage += attackData.Damage.Burn;
|
|
if (attackData.Damage.Poison) dealtDamage += attackData.Damage.Poison;
|
|
},
|
|
};
|
|
Engine.RegisterGlobal("Attacking", Attacking);
|
|
|
|
// damage scheduled: 0, 1, 2, 10 sec
|
|
cmpStatusReceiver.ApplyStatus({
|
|
"Burn": {
|
|
"Duration": 20000,
|
|
"Interval": 10000,
|
|
"Damage": {
|
|
"Burn": 10
|
|
}
|
|
},
|
|
"Poison": {
|
|
"Duration": 3000,
|
|
"Interval": 1000,
|
|
"Damage": {
|
|
"Poison": 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 testRemoveStatus()
|
|
{
|
|
setup();
|
|
let statusName = "Poison";
|
|
let Attacking = {
|
|
"HandleAttackEffects": (_, attackData) => { dealtDamage += attackData.Damage[statusName]; }
|
|
};
|
|
Engine.RegisterGlobal("Attacking", Attacking);
|
|
|
|
// damage scheduled: 0, 10, 20 sec
|
|
cmpStatusReceiver.AddStatus(statusName, {
|
|
"Duration": 20000,
|
|
"Interval": 10000,
|
|
"Damage": {
|
|
[statusName]: 1
|
|
}
|
|
},
|
|
{
|
|
"entity": enemyEntity,
|
|
"owner": enemy,
|
|
});
|
|
|
|
cmpTimer.OnUpdate({ "turnLength": 1 });
|
|
TS_ASSERT_EQUALS(dealtDamage, 1); // 1 sec
|
|
|
|
cmpStatusReceiver.RemoveStatus(statusName);
|
|
|
|
cmpTimer.OnUpdate({ "turnLength": 10 });
|
|
TS_ASSERT_EQUALS(dealtDamage, 1); // 11 sec
|
|
}
|
|
|
|
testRemoveStatus();
|