Toggles now work in actions to make choices based on action context

This commit is contained in:
Stefan Zermatten
2021-02-22 11:36:30 +02:00
parent 8148f4d701
commit 6571fb860a
5 changed files with 69 additions and 5 deletions

View File

@@ -8,6 +8,7 @@ export default function applyAttack({
let value = roll(1, 20)[0];
actionContext.attackRoll = {value};
let result = value + prop.rollBonusResult;
actionContext.toHit = {value: result};
log.content.push({
name: 'To Hit',
resultPrefix: `1d20 [${value}] + ${prop.rollBonusResult} = `,

View File

@@ -3,6 +3,7 @@ import applyAdjustment from '/imports/api/creature/actions/applyAdjustment.js';
import applyAttack from '/imports/api/creature/actions/applyAttack.js';
import applyDamage from '/imports/api/creature/actions/applyDamage.js';
import applyBuff from '/imports/api/creature/actions/applyBuff.js';
import applyToggle from '/imports/api/creature/actions/applyToggle.js';
function applyProperty(options){
let prop = options.prop;
@@ -11,8 +12,13 @@ function applyProperty(options){
if (prop.applied === true){
return false;
}
// Only ignore toggles if they wont be computed
} else if (prop.type === 'toggle') {
if (prop.disabled) return false;
if (prop.enabled) return true;
if (!prop.condition) return false;
// Ignore inactive props of other types
} else if (prop.inactive === true){
} else if (prop.deactivatedBySelf === true){
return false;
}
switch (prop.type){
@@ -33,6 +39,8 @@ function applyProperty(options){
case 'buff':
applyBuff(options);
break;
case 'toggle':
return applyToggle(options);
case 'roll':
// applyRoll(options);
break;

View File

@@ -0,0 +1,35 @@
import evaluateString from '/imports/api/creature/computation/afterComputation/evaluateString.js';
export default function applyDamage({
prop,
creature,
actionContext,
log,
}){
let scope = {
...creature.variables,
...actionContext,
};
if (Number.isFinite(+prop.condition)){
return !!+prop.condition;
}
try {
var {result, errors} = evaluateString(prop.condition, scope, 'reduce');
if (typeof result !== 'number' && typeof result !== 'boolean') {
log.content.push({
error: errors.join(', '),
});
return false;
}
log.content.push({
name: prop.name,
resultPrefix: prop.condition + ' = ',
result,
});
return !!result;
} catch (e){
log.content.push({
error: e.toString(),
});
}
}

View File

@@ -43,6 +43,13 @@ let CreaturePropertySchema = new SimpleSchema({
optional: true,
index: 1,
},
// Denormalised flag if this property was made inactive because of its own
// state
deactivatedBySelf: {
type: Boolean,
optional: true,
index: 1,
},
// Denormalised list of all properties or creatures this property depends on
dependencies: {
type: Array,

View File

@@ -20,9 +20,16 @@ export default function recomputeInactiveProperties(ancestorId){
CreatureProperties.update({
'ancestors.id': ancestorId,
'_id': {$in: disabledIds},
$or: [{inactive: {$ne: true}}, {deactivatedByAncestor: true}],
$or: [
{inactive: {$ne: true}},
{deactivatedBySelf: {$ne: true}},
{deactivatedByAncestor: true},
],
}, {
$set: {inactive: true},
$set: {
inactive: true,
deactivatedBySelf: true,
},
$unset: {deactivatedByAncestor: 1},
}, {
multi: true,
@@ -31,7 +38,10 @@ export default function recomputeInactiveProperties(ancestorId){
// Decendants of inactive properties
CreatureProperties.update({
'ancestors.id': {$eq: ancestorId, $in: disabledIds},
$or: [{inactive: {$ne: true}}, {deactivatedByAncestor: {$ne: true}}],
$or: [
{inactive: {$ne: true}},
{deactivatedByAncestor: {$ne: true}},
],
}, {
$set: {
inactive: true,
@@ -46,7 +56,10 @@ export default function recomputeInactiveProperties(ancestorId){
CreatureProperties.update({
'ancestors.id': {$eq: ancestorId, $nin: disabledIds},
'_id': {$nin: disabledIds},
$or: [{inactive: true}, {deactivatedByAncestor: true}],
$or: [
{inactive: true},
{deactivatedByAncestor: true},
],
}, {
$unset: {
inactive: 1,