diff --git a/css/fvtt-hellborn.css b/css/fvtt-hellborn.css index 44d440a..3546c80 100644 --- a/css/fvtt-hellborn.css +++ b/css/fvtt-hellborn.css @@ -1302,6 +1302,28 @@ i.fvtt-hellborn { height: 24px; margin: 4px 0 0 0; } +.fvtt-hellborn .tab.enemy-traits .main-div .ailments { + display: grid; + grid-template-columns: repeat(5, 1fr); + gap: 4px; +} +.fvtt-hellborn .tab.enemy-traits .main-div .ailments .ailment { + display: flex; + align-items: center; + gap: 4px; + margin-left: 4px; + min-width: 8rem; + max-width: 8rem; +} +.fvtt-hellborn .tab.enemy-traits .main-div .ailments .ailment label { + min-width: 5rem; + max-width: 5rem; +} +.fvtt-hellborn .tab.enemy-traits .main-div .ailments .ailment .item-img { + width: 24px; + height: 24px; + margin: 4px 0 0 0; +} .fvtt-hellborn .tab.enemy-traits .main-div .maleficas { display: grid; grid-template-columns: repeat(1, 1fr); diff --git a/lang/en.json b/lang/en.json index dbe618e..4bf7d66 100644 --- a/lang/en.json +++ b/lang/en.json @@ -574,7 +574,10 @@ "Tarot": { "FIELDS": { "bonus": { - "label": "Bonus" + "label": "Upright XP Trigger" + }, + "penalty": { + "label": "Reversed XP Trigger" }, "description": { "label": "Description" @@ -637,6 +640,12 @@ }, "Weapon": { "FIELDS": { + "stat": { + "label": "Stat" + }, + "damageStat": { + "label": "Damage Stat" + }, "ammo": { "label": "Ammo" }, diff --git a/module/config/system.mjs b/module/config/system.mjs index 2a01c14..f8c4053 100644 --- a/module/config/system.mjs +++ b/module/config/system.mjs @@ -53,7 +53,7 @@ export const CHOICE_ADVANTAGES_DISADVANTAGES ={ export const PERK_ROLES = { "abbetor": { id: "abbetor", label: "Abbetor" }, "blade": { id: "blade", label: "Blade" }, - "brawler": { id: "brawler", label: "Brawler" }, + "other": { id: "other", label: "Other" }, "gunslinger": { id: "gunslinger", label: "Gunslinger" }, "malefic": { id: "malefic", label: "Malefic" }, "mastermind": { id: "mastermind", label: "Mastermind" }, @@ -64,8 +64,7 @@ export const PERK_ROLES = { export const MALEFICA_DOMAINS = { "adfectus": { id: "adfectus", label: "Adfectus" }, - "animalis": { id: "animalis", label: "Animalis" }, - "carnes ": { id: "carnes", label: "Carnes" }, + "other": { id: "other", label: "Other" }, "divinus": { id: "divinus", label: "Divinus" }, "ignis": { id: "ignis", label: "Ignis" }, "iunctio": { id: "iunctio", label: "Iunctio" }, diff --git a/module/documents/roll.mjs b/module/documents/roll.mjs index 723bf20..c4c2eec 100644 --- a/module/documents/roll.mjs +++ b/module/documents/roll.mjs @@ -84,12 +84,18 @@ export default class HellbornRoll extends Roll { static async prompt(options = {}) { let formula = `3D6 + 0D6KH - 0D6KH + ${options?.rollItem?.value}` + let actor = game.actors.get(options.actorId) switch (options.rollType) { case "stat": break case "damage": { let formula = options.rollItem.system.damage + if (options.rollItem.system.damageStat !== "none") { + let statKey = options.rollItem.system.damageStat.toLowerCase() + let statValue = actor.system.stats[statKey].value + formula = `${formula} + ${statValue}` + } let damageRoll = new Roll(formula) await damageRoll.evaluate() await damageRoll.toMessage({ @@ -99,14 +105,8 @@ export default class HellbornRoll extends Roll { } case "weapon": { - let actor = game.actors.get(options.actorId) options.weapon = foundry.utils.duplicate(options.rollItem) - let statKey = "skin" - if (options.weapon.system.weaponType === "melee") { - if ( options.weapon.system.properties.toLowerCase().match("heavy") || options.weapon.system.properties.toLowerCase().match("oversized")) { - statKey = "flesh" - } - } + let statKey = options.weapon.system.stat.toLowerCase() options.rollItem = actor.system.stats[statKey] } break @@ -224,16 +224,16 @@ export default class HellbornRoll extends Roll { this.options.fiendishFailure = false this.options.rollData = foundry.utils.duplicate(rollData) if (resultType === "success") { - let nb6 = roll.terms[0].results.filter(r => r.result === 6).length - nb6 += roll.terms[3].total === 6 ? 1 : 0 + let nb6 = roll.terms[0].results.filter(r => r.result >= 4).length + nb6 += roll.terms[2].total <= 4 ? 1 : 0 this.options.satanicSuccess = nb6 >= 3 if (this.options.satanicSuccess) { resultType = "success" } } if (resultType === "failure") { - let nb1 = roll.terms[0].results.filter(r => r.result === 1).length - nb1 += roll.terms[5].total === 1 ? 1 : 0 + let nb1 = roll.terms[0].results.filter(r => r.result <= 3).length + nb1 += roll.terms[4].total <= 3 ? 1 : 0 this.options.fiendishFailure = nb1 >= 3 if (this.options.fiendishFailure) { resultType = "failure" @@ -242,6 +242,9 @@ export default class HellbornRoll extends Roll { this.options.resultType = resultType this.options.isSuccess = resultType === "success" this.options.isFailure = resultType === "failure" + this.options.results = roll.terms[0].results + this.options.advantageResult = roll.terms[2].total + this.options.disadvantageResult = roll.terms[4].total } /** diff --git a/module/models/enemy.mjs b/module/models/enemy.mjs index 1a666f5..81b6d01 100644 --- a/module/models/enemy.mjs +++ b/module/models/enemy.mjs @@ -42,6 +42,21 @@ export default class HellbornEnemy extends foundry.abstract.TypeDataModel { value: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }), }) + // Ailments + const ailmentField = (label) => { + const schema = { + enabled: new fields.BooleanField({ required: true, initial: false }), + label: new fields.StringField({ required: true, initial: label }) + } + return new fields.SchemaField(schema, { label }) + } + schema.ailments = new fields.SchemaField( + Object.values(SYSTEM.AILMENTS).reduce((obj, ailment) => { + obj[ailment.id] = ailmentField(ailment.label) + return obj + }, {}), + ) + schema.defense = new fields.SchemaField({ base: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), bonus: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), diff --git a/module/models/weapon.mjs b/module/models/weapon.mjs index d0dd800..1e82831 100644 --- a/module/models/weapon.mjs +++ b/module/models/weapon.mjs @@ -7,12 +7,14 @@ export default class HellbornWeapon extends foundry.abstract.TypeDataModel { const requiredInteger = { required: true, nullable: false, integer: true } schema.description = new fields.HTMLField({ required: true, textSearch: true }) + schema.stat = new fields.StringField({ required: true, initial: "skin", choices: {"skin": "Skin", "flesh": "Flesh" }}) schema.weaponType = new fields.StringField({ required: true, initial: "melee", choices: SYSTEM.WEAPON_TYPES }) schema.subType = new fields.StringField({ required: false, initial: "pistols", choices: SYSTEM.RANGED_SUBTYPES }) schema.properties = new fields.StringField({required: true, initial: ""}) schema.damage = new fields.StringField({required: true, initial: "1d6"}) + schema.damageStat = new fields.StringField({ required: true, initial: "none", choices: {"none": "None", "skin": "Skin", "flesh": "Flesh", "heart": "Heart", "mind": "Mind", "soul": "Soul" }}) schema.damageType = new fields.StringField({ required: false, initial : "Physical" }) schema.ammo = new fields.StringField({ required: false, initial: "" }) @@ -25,4 +27,14 @@ export default class HellbornWeapon extends foundry.abstract.TypeDataModel { /** @override */ static LOCALIZATION_PREFIXES = ["HELLBORN.Weapon"] + prepareDerivedData() { + super.prepareDerivedData(); + let actor = this.parent?.actor; + if (actor) { + this.damageFormula = this.damage + (this.damageStat !== "none" ? `+${actor.system.stats[this.damageStat].value}` : ""); + } else { + this.damageFormula = this.damage; + } + } + } diff --git a/styles/enemy.less b/styles/enemy.less index cf8906d..ed46aa4 100644 --- a/styles/enemy.less +++ b/styles/enemy.less @@ -70,7 +70,7 @@ align-items: center; margin-bottom: 4px; } - .splitted { + .splitted { display: flex; flex-direction: row; gap: 4px; @@ -165,7 +165,7 @@ } } .enemy-column { - display:flex; + display: flex; flex-direction: row; gap: 4px; fieldset { @@ -191,9 +191,9 @@ align-items: center; gap: 4px; margin-left: 4px; - .characteristics-label{ + .characteristics-label { color: grey; - font-size:small; + font-size: small; label { min-width: 3.5rem; max-width: 3.5rem; @@ -207,7 +207,7 @@ min-width: 4rem; max-width: 4rem; } - .spaced-left{ + .spaced-left { margin-left: 0.8rem; } input { @@ -247,7 +247,7 @@ } } } - .equipments { + .equipments { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; @@ -279,6 +279,29 @@ } } + .ailments { + display: grid; + grid-template-columns: repeat(5, 1fr); + gap: 4px; + .ailment { + display: flex; + align-items: center; + gap: 4px; + margin-left: 4px; + min-width: 8rem; + max-width: 8rem; + label { + min-width: 5rem; + max-width: 5rem; + } + .item-img { + width: 24px; + height: 24px; + margin: 4px 0 0 0; + } + } + } + .maleficas { display: grid; grid-template-columns: repeat(1, 1fr); @@ -374,7 +397,6 @@ } } } - } .tab.enemy-biography .main-div { diff --git a/templates/character-equipment.hbs b/templates/character-equipment.hbs index 0f95093..e0ac115 100644 --- a/templates/character-equipment.hbs +++ b/templates/character-equipment.hbs @@ -21,9 +21,9 @@ {{upperFirst item.system.ammo}} + data-roll-type="damage" data-roll-value="{{item.system.damageFormula}}"> - {{item.system.damage}} + {{item.system.damageFormula}}
diff --git a/templates/enemy-trait.hbs b/templates/enemy-trait.hbs index 68c1046..4a46611 100644 --- a/templates/enemy-trait.hbs +++ b/templates/enemy-trait.hbs @@ -33,6 +33,19 @@ + +