Add secondary stats + char rolls

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

View File

@ -56,6 +56,7 @@
}
},
"Skill": {
"Unnatural": "Unnatural",
"FIELDS": {
"settings": {
"label": "Settings era"
@ -212,7 +213,13 @@
"individual": "Individual",
"community": "Community"
},
"Harshness": {
"normal": "Normal",
"harsh": "Harsh",
"veryHarsh": "Very Harsh"
},
"Label": {
"biodata": "Biodata",
"skill": "Skill",
"modifier": "Modifier",
"rollView": "Roll View",
@ -225,6 +232,12 @@
"powShort": "POW",
"conShort": "CON",
"chaShort": "CHA",
"strLong": "Strength",
"dexLong": "Dexterity",
"intLong": "Intelligence",
"powLong": "Power",
"conLong": "Constitution",
"chaLong": "Charisma",
"total": "Total",
"skills": "Skills",
"gear": "Gear",
@ -252,11 +265,14 @@
"totalScore": "Total Score",
"exhausted": "Exhausted",
"skillRoll": "Skill Roll",
"charRoll": "Characteristic Roll",
"finalScore": "Final Score",
"failure": "Failure",
"success": "Success",
"criticalSuccess": "Critical Success",
"criticalFailure": "Critical Failure"
"criticalFailure": "Critical Failure",
"Characteristic": "Characteristic",
"targetScore": "Target Score"
},
"Edit": "Edit",
"Delete": "Delete",

View File

@ -148,9 +148,19 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS
let item
// Debug : console.log(">>>>", event, target, rollType)
// Deprecated : if (this.isEditMode) return
if (rollType === "skill") {
const li = $(event.currentTarget).parents(".item");
item = this.actor.items.get(li.data("item-id"));
switch(rollType) {
case "char":
let charId = $(event.currentTarget).data("char-id")
item = foundry.utils.duplicate(this.actor.system.characteristics[charId])
item.name = game.i18n.localize("CTHULHUETERNAL.Label." + charId + "Long")
item.targetScore = item.value * 5
break
case "skill":
const li = $(event.currentTarget).parents(".item");
item = this.actor.items.get(li.data("item-id"));
break
default:
throw new Error(`Unknown roll type ${rollType}`)
}
await this.document.system.roll(rollType, item)
}

View File

@ -25,3 +25,9 @@ export const CHARACTERISTICS = Object.freeze({
}
})
export const HARSHNESS = Object.freeze({
"normal": "CTHULHUETERNAL.Harshness.normal",
"harsh": "CTHULHUETERNAL.Harshness.harsh",
"veryharsh": "CTHULHUETERNAL.Harshness.veryHarsh"
})

View File

@ -42,6 +42,7 @@ export const ASCII = `
export const SYSTEM = {
id: SYSTEM_ID,
CHARACTERISTICS: PROTAGONIST.CHARACTERISTICS,
HARSHNESS: PROTAGONIST.HARSHNESS,
WEAPON_TYPE: WEAPON.WEAPON_TYPE,
WEAPON_SUBTYPE: WEAPON.WEAPON_SUBTYPE,
BOND_TYPE: BOND.BOND_TYPE,

View File

@ -1,4 +1,5 @@
export default class CthulhuEternalActor extends Actor {
async _preCreate(data, options, user) {
await super._preCreate(data, options, user)

View File

@ -95,8 +95,8 @@ export default class CthulhuEternalRoll extends Roll {
console.log(options.rollItem)
options.initialScore = options.rollItem.system.computeScore()
break
case "characteristic":
options.initialScore = options.rollItem.value * 5
case "char":
options.initialScore = options.rollItem.targetScore
break
default:
options.initialScore = 50

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) {

View File

@ -6,11 +6,15 @@
</div>
<div class="intro-right">
<ul>
{{#if (eq rollType "char")}}
<li><strong>{{localize "CTHULHUETERNAL.Label.charRoll"}}</strong></li>
{{/if}}
{{#if (eq rollType "skill")}}
<li><strong>{{localize "CTHULHUETERNAL.Label.skillRoll"}} {{rollItem.name}} : {{initialScore}}</strong></li>
<li>{{localize "CTHULHUETERNAL.Label.modifier"}} : {{modifier}}</li>
<li>{{localize "CTHULHUETERNAL.Label.finalScore"}} : {{targetScore}}</li>
<li><strong>{{localize "CTHULHUETERNAL.Label.skillRoll"}}</strong></li>
{{/if}}
<li><strong>{{rollItem.name}} : {{initialScore}}%</strong></li>
<li>{{localize "CTHULHUETERNAL.Label.modifier"}} : {{modifier}}%</li>
<li>{{localize "CTHULHUETERNAL.Label.targetScore"}} : {{targetScore}}%</li>
{{#if isSuccess}}
{{#if isCritical}}
<li class="result-critical-success">{{localize "CTHULHUETERNAL.Label.criticalSuccess"}}</li>

View File

@ -1,4 +1,10 @@
<section class="tab protagonist-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset>
<legend>{{localize "CTHULHUETERNAL.Label.biodata"}}</legend>
{{formInput systemFields.biodata.fields.harshness value=system.biodata.harshness name="system.biodata.harshness" localize=true}}
</fieldset>
<fieldset>
<legend>{{localize "CTHULHUETERNAL.Label.description"}}</legend>
{{formInput systemFields.description enriched=description value=system.description name="system.description" toggled=true}}

View File

@ -14,7 +14,7 @@
<div class="flexrow">
{{formField systemFields.hp.fields.value value=system.hp.value}}
/
{{formField systemFields.hp.fields.max value=system.hp.max rootId=partId disabled=isPlayMode}}
{{formField systemFields.hp.fields.max value=system.hp.max rootId=partId disabled=true}}
</div>
</fieldset>
@ -35,11 +35,11 @@
{{localize "CTHULHUETERNAL.Label.current"}} {{formField systemFields.san.fields.value
value=system.san.value}}
{{localize "CTHULHUETERNAL.Label.max"}} {{formField systemFields.san.fields.max value=system.san.max
rootId=partId disabled=isPlayMode}}
rootId=partId disabled=true}}
{{localize "CTHULHUETERNAL.Label.recovery"}} {{formField systemFields.san.fields.recovery
value=system.san.recovery}}
value=system.san.recovery disabled=true}}
<span data-tooltip='{{localize "CTHULHUETERNAL.Tooltip.sanBP"}}'>{{localize "CTHULHUETERNAL.Label.breakingPoint"}}</span> {{formField systemFields.san.fields.breakingPoint
value=system.san.breakingPoint}}
value=system.san.breakingPoint disabled=true}}
</div>
<div class="flexrow">
{{localize "CTHULHUETERNAL.Label.violence"}}
@ -60,7 +60,7 @@
<legend>{{localize "CTHULHUETERNAL.Label.willpower"}}</legend>
<div class="flexrow">
{{localize "CTHULHUETERNAL.Label.current"}}{{formField systemFields.wp.fields.value value=system.wp.value}}
{{localize "CTHULHUETERNAL.Label.max"}}{{formField systemFields.wp.fields.max value=system.wp.max rootId=partId disabled=isPlayMode}}
{{localize "CTHULHUETERNAL.Label.max"}}{{formField systemFields.wp.fields.max value=system.wp.max rootId=partId disabled=true}}
{{localize "CTHULHUETERNAL.Label.exhausted"}}{{formField systemFields.wp.fields.exhausted value=system.wp.exhausted }}
</div>
@ -74,39 +74,39 @@
<fieldset class="protagonist-characteristics protagonist-characteristics-{{ifThen isPlayMode 'play' 'edit'}}">
<legend>{{localize "CTHULHUETERNAL.Label.characteristics"}}</legend>
<div class="protagonist-characteristic" data-drag="true" data-drag-type="characteristic">
<label>{{localize "CTHULHUETERNAL.Label.strShort"}}</label>
<label class="rollable" data-roll-type="char" data-char-id="str">{{localize "CTHULHUETERNAL.Label.strShort"}}</label>
{{formField systemFields.characteristics.fields.str.fields.value value=system.characteristics.str.value
rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.str}}
rootId=partId disabled=isPlayMode }}
{{mul system.characteristics.str.value 5}}
</div>
<div class="protagonist-characteristic" data-drag="true" data-drag-type="characteristic">
<label>{{localize "CTHULHUETERNAL.Label.dexShort"}}</label>
<label class="rollable" data-roll-type="char" data-char-id="dex">{{localize "CTHULHUETERNAL.Label.dexShort"}}</label>
{{formField systemFields.characteristics.fields.dex.fields.value value=system.characteristics.dex.value
rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.dex}}
rootId=partId disabled=isPlayMode }}
{{mul system.characteristics.dex.value 5}}
</div>
<div class="protagonist-characteristic" data-drag="true" data-drag-type="characteristic">
<label>{{localize "CTHULHUETERNAL.Label.conShort"}}</label>
<label class="rollable" data-roll-type="char" data-char-id="con">{{localize "CTHULHUETERNAL.Label.conShort"}}</label>
{{formField systemFields.characteristics.fields.con.fields.value value=system.characteristics.con.value
rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.con}}
rootId=partId disabled=isPlayMode }}
{{mul system.characteristics.con.value 5}}
</div>
<div class="protagonist-characteristic" data-drag="true" data-drag-type="characteristic">
<label>{{localize "CTHULHUETERNAL.Label.intShort"}}</label>
<label class="rollable" data-roll-type="char" data-char-id="int">{{localize "CTHULHUETERNAL.Label.intShort"}}</label>
{{formField systemFields.characteristics.fields.int.fields.value value=system.characteristics.int.value
rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.int}}
rootId=partId disabled=isPlayMode }}
{{mul system.characteristics.int.value 5}}
</div>
<div class="protagonist-characteristic" data-drag="true" data-drag-type="characteristic">
<label>{{localize "CTHULHUETERNAL.Label.powShort"}}</label>
<label class="rollable" data-roll-type="char" data-char-id="pow">{{localize "CTHULHUETERNAL.Label.powShort"}}</label>
{{formField systemFields.characteristics.fields.pow.fields.value value=system.characteristics.pow.value
rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.pow}}
rootId=partId disabled=isPlayMode }}
{{mul system.characteristics.pow.value 5}}
</div>
<div class="protagonist-characteristic" data-drag="true" data-drag-type="characteristic">
<label>{{localize "CTHULHUETERNAL.Label.chaShort"}}</label>
<label class="rollable" data-roll-type="char" data-char-id="cha">{{localize "CTHULHUETERNAL.Label.chaShort"}}</label>
{{formField systemFields.characteristics.fields.cha.fields.value value=system.characteristics.cha.value
rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.cha}}
rootId=partId disabled=isPlayMode }}
{{mul system.characteristics.cha.value 5}}
</div>
</fieldset>

View File

@ -1,18 +1,21 @@
{{log "roll-dialog" this}}
<div class="fvtt-cthulhu-eternal-roll-dialog">
{{#if (eq rollType "skill")}}
<fieldSet>
{{#if (eq rollType "skill")}}
<legend>{{localize "CTHULHUETERNAL.Label.skill"}}</legend>
<div class="dialog-skill">{{rollItem.name}} : {{initialScore}}</div>
{{/if}}
{{#if (eq rollType "char")}}
<legend>{{localize "CTHULHUETERNAL.Label.characteristic"}}</legend>
{{/if}}
<div class="dialog-skill">{{rollItem.name}} : {{initialScore}}%</div>
</fieldSet>
<fieldSet class="dialog-modifier">
<legend>{{localize "CTHULHUETERNAL.Label.modifier"}}</legend>
<select name="modifier" class="roll-skill-modifier">
{{selectOptions choiceModifier selected=modifier}}
</select>
</fieldSet>
{{/if}}
<fieldSet>
<legend>{{localize "CTHULHUETERNAL.Label.rollView"}}</legend>
<select name="visibility">