Files
DiceCloud/app/imports/api/engine/action/applyProperties/applyDamageProperty.test.ts
2025-05-02 15:38:18 +02:00

293 lines
6.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { assert } from 'chai';
import {
allMutations,
createTestCreature,
getRandomIds,
removeAllCreaturesAndProps,
runActionById,
TestCreature
} from '/imports/api/engine/action/functions/actionEngineTest.testFn';
import { critInputProvider } from '../functions/userInput/inputProviderForTests.testFn';
const [
creatureId, targetCreatureId, targetCreature2Id, damageTargetId, damageSelfId, targetCreatureHitPointsId, targetCreature2HitPointsId, selfHitPointsId, damageWithEffectsId, effectId, effect2Id,
] = getRandomIds(20);
const actionTestCreature: TestCreature = {
_id: creatureId,
props: [
{
_id: damageTargetId,
type: 'damage',
target: 'target',
amount: { calculation: '2d6 + 7' }
},
{
_id: damageSelfId,
type: 'damage',
target: 'self',
amount: { calculation: '1d12 + 7' }
},
{
_id: selfHitPointsId,
type: 'attribute',
name: 'Hit Points',
attributeType: 'healthBar',
variableName: 'hitPoints',
baseValue: { calculation: '20' },
},
{
_id: damageWithEffectsId,
type: 'damage',
target: 'target',
amount: { calculation: '1d13 + 3' },
tags: ['tag']
},
{
_id: effectId,
type: 'effect',
operation: 'add',
amount: { calculation: '1' },
targetByTags: true,
targetTags: ['tag'],
},
{
_id: effect2Id,
type: 'effect',
operation: 'mul',
amount: { calculation: '2' },
targetByTags: true,
targetTags: ['tag'],
},
],
}
const actionTargetCreature: TestCreature = {
_id: targetCreatureId,
props: [
{
_id: targetCreatureHitPointsId,
type: 'attribute',
name: 'Hit Points',
attributeType: 'healthBar',
variableName: 'hitPoints',
baseValue: { calculation: '33' },
}
]
}
const actionTargetCreature2: TestCreature = {
_id: targetCreature2Id,
props: [
{
_id: targetCreature2HitPointsId,
type: 'attribute',
name: 'Hit Points',
attributeType: 'healthBar',
variableName: 'hitPoints',
baseValue: { calculation: '47' },
}
]
}
describe('Apply Damage Properties', function () {
// Increase timeout
this.timeout(8000);
before(async function () {
await removeAllCreaturesAndProps();
await createTestCreature(actionTestCreature);
await createTestCreature(actionTargetCreature);
await createTestCreature(actionTargetCreature2);
});
it('Damages self', async function () {
const action = await runActionById(damageSelfId);
assert.exists(action);
assert.deepEqual(allMutations(action), [{
contents: [
{
inline: true,
name: 'Damage',
value: '1d12 [6] + 7',
}
],
targetIds: [creatureId],
}, {
contents: [{
inline: true,
name: 'Health bar damaged',
value: '13 Hit Points',
}],
updates: [
{
propId: selfHitPointsId,
type: 'attribute',
inc: { damage: 13, value: -13 },
},
],
targetIds: [creatureId],
}]);
});
it('Damages a single target', async function () {
const action = await runActionById(damageTargetId, [targetCreatureId]);
assert.exists(action);
assert.deepEqual(allMutations(action), [{
contents: [
{
inline: true,
name: 'Damage',
value: '2d6 [3, 4] + 7',
}
],
targetIds: [targetCreatureId],
}, {
contents: [
{
inline: true,
name: 'Health bar damaged',
value: '14 Hit Points',
}
],
targetIds: [targetCreatureId],
updates: [
{
propId: targetCreatureHitPointsId,
type: 'attribute',
inc: { damage: 14, value: -14 },
},
],
}]);
});
it('Damages multiple targets', async function () {
const action = await runActionById(damageTargetId, [
targetCreatureId, targetCreature2Id
]);
assert.exists(action);
assert.deepEqual(allMutations(action), [{
contents: [
{
inline: true,
name: 'Damage',
value: '2d6 [3, 4] + 7',
}
],
targetIds: [
targetCreatureId,
targetCreature2Id,
],
}, {
contents: [
{
inline: true,
name: 'Health bar damaged',
value: '14 Hit Points',
}
],
targetIds: [targetCreatureId],
updates: [
{
propId: targetCreatureHitPointsId,
type: 'attribute',
inc: { damage: 14, value: -14 },
},
],
}, {
contents: [
{
inline: true,
name: 'Health bar damaged',
value: '14 Hit Points',
}
],
targetIds: [targetCreature2Id],
updates: [
{
propId: targetCreature2HitPointsId,
type: 'attribute',
inc: { damage: 14, value: -14 },
},
],
}]);
});
it('Applies effects when doing damage', async function () {
const action = await runActionById(damageWithEffectsId, [targetCreatureId]);
assert.exists(action);
assert.deepEqual(allMutations(action), [{
contents: [
{
inline: true,
name: 'Damage',
value: '(1d13 [7] + 4) * 2',
}
],
targetIds: [targetCreatureId],
}, {
contents: [
{
inline: true,
name: 'Health bar damaged',
value: '22 Hit Points',
}
],
targetIds: [targetCreatureId],
updates: [
{
propId: targetCreatureHitPointsId,
type: 'attribute',
inc: { damage: 22, value: -22 },
},
],
}]);
});
it('Doubles damage on a critical hit', async function () {
const [
creatureId, damageId, actionId
] = getRandomIds(3);
const testCreature: TestCreature = {
_id: creatureId,
props: [
{
_id: actionId,
type: 'action',
attackRoll: { calculation: '10' },
children: [
{
_id: damageId,
type: 'damage',
target: 'target',
amount: { calculation: '2d6 + 7' }
},
]
},
],
};
await createTestCreature(testCreature);
const action = await runActionById(actionId, [], critInputProvider);
assert.exists(action);
assert.deepEqual(allMutations(action), [{
'contents': [{ 'name': 'Action' }],
'targetIds': []
}, {
'contents': [{
'inline': true,
'name': 'Critical Hit!',
'value': '1d20 [20] + 10\n**30**'
}],
'targetIds': [],
}, {
'contents': [{
'inline': true,
'name': 'Damage',
'value': '2d6 [3, 4, 5, 6] + 7\n**25** critical slashing damage',
}],
'targetIds': [],
}]);
});
});