Add secondary stats + char rolls

This commit is contained in:
2024-12-18 18:45:47 +01:00
parent 4d3c15a2a8
commit 93901d5f1e
12 changed files with 150 additions and 34 deletions

View File

@ -28,7 +28,7 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData
schema.wp = new fields.SchemaField({
value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, initial: 3, min: 0 }),
exhausted: new fields.BooleanField({ required: true, initial: false })
})
@ -44,7 +44,6 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData
recovery: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
violence: new fields.ArrayField(new fields.BooleanField(), { required: true, initial: [false, false, false], min:3, max:3}),
helplessness: new fields.ArrayField(new fields.BooleanField(), { required: true, initial: [false, false, false], min:3, max:3 }),
breakingPoint: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
})
@ -65,7 +64,8 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData
home: new fields.StringField({ required: true, nullable: false, initial: "" }),
birthplace: new fields.StringField({ required: true, nullable: false, initial: "" }),
eyes: new fields.StringField({ required: true, nullable: false, initial: "" }),
hair: new fields.StringField({ required: true, nullable: false, initial: "" })
hair: new fields.StringField({ required: true, nullable: false, initial: "" }),
harshness: new fields.StringField({ required: true, nullable: false, initial: "normal", choices:SYSTEM.HARSHNESS }),
})
return schema
@ -74,6 +74,75 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData
/** @override */
static LOCALIZATION_PREFIXES = ["CTHULHUETERNAL.Protagonist"]
prepareDerivedData() {
super.prepareDerivedData();
let updates = {}
if ( this.wp.max !== this.characteristics.pow.value) {
updates[`system.wp.max`] = this.characteristics.pow.value
}
let hpMax = Math.round((this.characteristics.con.value + this.characteristics.str.value) / 2)
if ( this.hp.max !== hpMax) {
updates[`system.hp.max`] = hpMax
}
// Get Unnatural skill for MAX SAN
let unnatural = this.parent.items.find(i => i.type === "skill" && i.name.toLowerCase() === game.i18n.localize("CTHULHUETERNAL.Skill.Unnatural").toLowerCase())
let minus = 0
if (unnatural) {
minus = unnatural.data.skillTotal
}
let maxSan = Math.max(99 - minus, 0)
if ( this.san.max !== maxSan) {
updates[`system.san.max`] = maxSan
}
let bp = Math.max(this.san.value - this.characteristics.pow.value, 0)
if ( this.san.breakingPoint !== bp) {
updates[`system.san.breakingPoint`] = bp
}
let recoverySan = this.characteristics.pow.value * 5
if (recoverySan > this.san.max) {
recoverySan = this.san.max
}
if ( this.san.recovery !== recoverySan) {
updates[`system.san.recovery`] = recoverySan
}
let dmgBonus = 0
if (this.characteristics.str.value <= 4) {
dmgBonus = -2
} else if (this.characteristics.str.value <= 8) {
dmgBonus = -1
} else if (this.characteristics.str.value <= 12) {
dmgBonus = 0
} else if (this.characteristics.str.value <= 16) {
dmgBonus = 1
} else if (this.characteristics.str.value <= 20) {
dmgBonus = 2
}
if ( this.damageBonus !== dmgBonus) {
updates[`system.damageBonus`] = dmgBonus
}
// Sanity check
if (this.san.value > this.san.max) {
updates[`system.san.value`] = this.san.max
}
if (this.wp.value > this.wp.max) {
updates[`system.wp.value`] = this.wp.max
}
if (this.hp.value > this.hp.max) {
updates[`system.hp.value`] = this.hp.max
}
if (Object.keys(updates).length > 0) {
this.parent.update(updates)
}
}
/** */
/**
* Rolls a dice for a character.
* @param {("save"|"resource|damage")} rollType The type of the roll.

View File

@ -34,7 +34,7 @@ export default class CthulhuEternalSkill extends foundry.abstract.TypeDataModel
return `${this.base} + ${ String(this.bonus)}`;
}
// Split the base value per stat : WIS,DEX,STR,INT,CHA (example)
// Split the base value per stat :
let base = this.base.toLowerCase();
let char = actor.system.characteristics[base];
if (!char) {