From c7cc39886d22036954e67f0a367e2931e180d7c7 Mon Sep 17 00:00:00 2001 From: LeRatierBretonnien Date: Fri, 3 Jan 2025 23:57:54 +0100 Subject: [PATCH] Add skill+weapon rolls --- css/fvtt-lethal-fantasy.css | 74 ++++- lang/en.json | 39 +-- .../applications/sheets/character-sheet.mjs | 79 ++++- module/config/characteristic-tables.mjs | 302 +++++++++--------- module/config/system.mjs | 8 + module/config/weapon.mjs | 17 +- module/documents/roll.mjs | 137 +++++--- module/models/character.mjs | 30 +- packs/lf-equipment/{000048.log => 000072.log} | 0 packs/lf-equipment/CURRENT | 2 +- packs/lf-equipment/LOG | 2 +- packs/lf-equipment/LOG.old | 2 +- packs/lf-equipment/MANIFEST-000046 | 3 - packs/lf-equipment/MANIFEST-000070 | 3 + packs/lf-gifts/{000044.log => 000068.log} | 0 packs/lf-gifts/CURRENT | 2 +- packs/lf-gifts/LOG | 2 +- packs/lf-gifts/LOG.old | 2 +- packs/lf-gifts/MANIFEST-000042 | 3 - packs/lf-gifts/MANIFEST-000066 | 3 + packs/lf-skills/{000048.log => 000072.log} | 0 packs/lf-skills/CURRENT | 2 +- packs/lf-skills/LOG | 2 +- packs/lf-skills/LOG.old | 2 +- packs/lf-skills/MANIFEST-000046 | 3 - packs/lf-skills/MANIFEST-000070 | 3 + .../{000044.log => 000068.log} | 0 packs/lf-vulnerabilities/CURRENT | 2 +- packs/lf-vulnerabilities/LOG | 2 +- packs/lf-vulnerabilities/LOG.old | 2 +- packs/lf-vulnerabilities/MANIFEST-000042 | 3 - packs/lf-vulnerabilities/MANIFEST-000066 | 3 + styles/character.less | 69 +++- styles/roll.less | 5 +- templates/character-main.hbs | 52 ++- templates/character-skills.hbs | 9 +- templates/character-weapons.hbs | 52 ++- templates/chat-message.hbs | 10 +- templates/roll-dialog.hbs | 18 +- 39 files changed, 616 insertions(+), 333 deletions(-) rename packs/lf-equipment/{000048.log => 000072.log} (100%) delete mode 100644 packs/lf-equipment/MANIFEST-000046 create mode 100644 packs/lf-equipment/MANIFEST-000070 rename packs/lf-gifts/{000044.log => 000068.log} (100%) delete mode 100644 packs/lf-gifts/MANIFEST-000042 create mode 100644 packs/lf-gifts/MANIFEST-000066 rename packs/lf-skills/{000048.log => 000072.log} (100%) delete mode 100644 packs/lf-skills/MANIFEST-000046 create mode 100644 packs/lf-skills/MANIFEST-000070 rename packs/lf-vulnerabilities/{000044.log => 000068.log} (100%) delete mode 100644 packs/lf-vulnerabilities/MANIFEST-000042 create mode 100644 packs/lf-vulnerabilities/MANIFEST-000066 diff --git a/css/fvtt-lethal-fantasy.css b/css/fvtt-lethal-fantasy.css index 27309f7..aae75d4 100644 --- a/css/fvtt-lethal-fantasy.css +++ b/css/fvtt-lethal-fantasy.css @@ -327,6 +327,12 @@ i.lethalfantasy { max-width: 5rem; margin-left: 0.7rem; } +.lethalfantasy .character-main .character-saves .character-save .name-pain { + flex: 0; + min-width: 3rem; + max-width: 3rem; + margin-left: 0.7rem; +} .lethalfantasy .character-main .character-saves .character-save .form-group { flex: 0; padding-left: 5px; @@ -418,15 +424,15 @@ i.lethalfantasy { gap: 10px; } .lethalfantasy .tab.character-skills .skills .skill .item-img { - width: 50px; - height: 50px; + width: 32px; + height: 32px; } .lethalfantasy .tab.character-skills .skills .skill .name { min-width: 12rem; } .lethalfantasy .tab.character-skills .gifts { display: grid; - grid-template-columns: repeat(5, 1fr); + grid-template-columns: repeat(3, 1fr); gap: 10px; } .lethalfantasy .tab.character-skills .gifts .gift { @@ -435,12 +441,15 @@ i.lethalfantasy { gap: 10px; } .lethalfantasy .tab.character-skills .gifts .gift .item-img { - width: 50px; - height: 50px; + width: 32px; + height: 32px; +} +.lethalfantasy .tab.character-skills .gifts .gift .name { + min-width: 12rem; } .lethalfantasy .tab.character-skills .vulnerabilities { display: grid; - grid-template-columns: repeat(5, 1fr); + grid-template-columns: repeat(3, 1fr); gap: 10px; } .lethalfantasy .tab.character-skills .vulnerabilities .vulnerability { @@ -449,8 +458,11 @@ i.lethalfantasy { gap: 10px; } .lethalfantasy .tab.character-skills .vulnerabilities .vulnerability .item-img { - width: 50px; - height: 50px; + width: 32px; + height: 32px; +} +.lethalfantasy .tab.character-skills .vulnerabilities .vulnerability .name { + min-width: 12rem; } .lethalfantasy .tab.character-weapons { display: grid; @@ -462,7 +474,7 @@ i.lethalfantasy { } .lethalfantasy .tab.character-weapons .weapons { display: grid; - grid-template-columns: repeat(4, 1fr); + grid-template-columns: repeat(2, 1fr); gap: 10px; } .lethalfantasy .tab.character-weapons .weapons .weapon { @@ -471,10 +483,17 @@ i.lethalfantasy { gap: 10px; } .lethalfantasy .tab.character-weapons .weapons .weapon .item-img { - width: 50px; - height: 50px; + width: 32px; + height: 32px; margin: 5px 0 0 0; } +.lethalfantasy .tab.character-weapons .weapons .weapon .name { + min-width: 12rem; +} +.lethalfantasy .tab.character-weapons .weapons .weapon .attack-icons a { + margin-left: 8px; + margin-right: 8px; +} .lethalfantasy .tab.character-weapons .armors { display: grid; grid-template-columns: repeat(3, 1fr); @@ -486,10 +505,34 @@ i.lethalfantasy { gap: 10px; } .lethalfantasy .tab.character-weapons .armors .armor .item-img { - width: 50px; - height: 50px; + width: 32px; + height: 32px; margin: 5px 0 0 0; } +.lethalfantasy .tab.character-weapons .armors .name { + min-width: 12rem; +} +.lethalfantasy .tab.character-weapons .equipments { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 10px; +} +.lethalfantasy .tab.character-weapons .equipments .equipment { + display: flex; + align-items: center; + gap: 10px; +} +.lethalfantasy .tab.character-weapons .equipments .equipment .item-img { + width: 32px; + height: 32px; + margin: 5px 0 0 0; +} +.lethalfantasy .tab.character-weapons .equipments .equipment .name { + min-width: 12rem; +} +.lethalfantasy .tab.character-weapons .equipments .name { + min-width: 12rem; +} .lethalfantasy .tab.character-spells { display: grid; grid-template-columns: 1fr; @@ -1410,15 +1453,18 @@ i.lethalfantasy { width: 60px; text-align: center; } +.main, .dialog-damage, .dialog-resource, .dialog-challenge, .dialog-save { + margin-bottom: 0px; + padding-bottom: 0px; display: flex; justify-content: center; align-items: center; font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1); color: var(--color-dark-1); } .dice-roll { diff --git a/lang/en.json b/lang/en.json index e3b1f67..36e6cb9 100644 --- a/lang/en.json +++ b/lang/en.json @@ -480,7 +480,15 @@ "Label": { "titleChallenge": "Challenge", "titleSave": "Save", + "titleSkill": "Skill", + "skill" : "Skill", "Movement": "Movement", + "weapon-attack": "Weapon attack", + "weapon-damage": "Weapon damage", + "weapon-defense": "Weapon defense", + "baseModifier": "Base modifier", + "weapon": "Weapon", + "skillBonus": "Skill bonus", "movement": { "walk": "Walk", "run": "Run", @@ -543,7 +551,8 @@ "luc": "LUC", "app": "APP", "cha": "CHA", - "challenge": "Challenge" + "challenge": "Challenge", + "armors": "Armors" }, "Edit": "Edit", "Delete": "Delete", @@ -574,30 +583,10 @@ "fortune": "Roue de Fortune", "fortuneHint": "Valeur de la roue de Fortune. Nombre de joueurs + 1 en début de partie." }, - "Chat": { - "askFortune": "{name} veut utiliser un point de Fortune !", - "askRollForAll": "Jet de {value}", - "askRollForOne": "Jet de {value} pour {name}" - }, - "Fortune": { - "title": "Roue de Fortune" - }, - "Manager": { - "title": "Gestionnaire de Personnages", - "player": "Utilisateur", - "character": "Personnage", - "rob": "Robustesse", - "dex": "Dextérité", - "int": "Intelligence", - "per": "Perception", - "vol": "Volonté", - "pv": "Points de Vie", - "san": "Santé Mentale", - "oeil": "Œil", - "verbe": "Verbe", - "bourse": "Bourse", - "magie": "Magie", - "roll": "Faire le jet" + "Notifications": { + "rollFromWeapon": "Roll from an equipped weapon", + "skillNotFound": "Skill not found", + "rollTypeNotFound": "Roll type not found" } } } diff --git a/module/applications/sheets/character-sheet.mjs b/module/applications/sheets/character-sheet.mjs index 477249e..b67aa62 100644 --- a/module/applications/sheets/character-sheet.mjs +++ b/module/applications/sheets/character-sheet.mjs @@ -90,7 +90,7 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet case "skills": context.tab = context.tabs.skills context.skills = doc.itemTypes.skill - context.gifts = doc.itemTypes.gifts + context.gifts = doc.itemTypes.gift context.vulnerabilities = doc.itemTypes.vulnerability break case "spells": @@ -153,6 +153,33 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet } } + getBestWeaponClassSkill(skills, rollType, multiplier = 1.0) { + let maxValue = 0 + let goodSkill = skills[0] + for (let s of skills) { + if (rollType === "weapon-attack") { + if (s.system.weaponBonus.attack > maxValue) { + maxValue = Number(s.system.weaponBonus.attack) + goodSkill = s + } + } + if (rollType === "weapon-defense") { + if (s.system.weaponBonus.defense > maxValue) { + maxValue = Number(s.system.weaponBonus.defense) + goodSkill = s + } + } + if (rollType === "weapon-damage") { + if (s.system.weaponBonus.damage > maxValue) { + maxValue = Number(s.system.weaponBonus.damage) + goodSkill = s + } + } + } + goodSkill.weaponSkillModifier = maxValue * multiplier + return goodSkill + } + /** * Handles the roll action triggered by user interaction. * @@ -167,9 +194,9 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet * (save, resource, or damage) based on the target element's data attributes. It retrieves the * corresponding value from the document's system and performs the roll. */ + async _onRoll(event, target) { if (this.isEditMode) return - console.log(event, target) const rollType = event.target.dataset.rollType let rollTarget let rollKey = event.target.dataset.rollKey @@ -181,11 +208,59 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet case "save": rollTarget = foundry.utils.duplicate(this.document.system.saves[rollKey]) rollTarget.rollKey = rollKey + rollTarget.rollDice = event.target.dataset?.rollDice + break + case "skill": + rollTarget = this.actor.items.find((i) => i.type === "skill" && i.id === rollKey) + rollTarget.rollKey = rollKey + if (rollTarget.system.category === "weapon") { + ui.notifications.warn(game.i18n.localize("LETHALFANTASY.Notifications.rollFromWeapon")) + return + } + break + case "weapon-attack": + case "weapon-defense": + case "weapon-damage": + let weapon = this.actor.items.find((i) => i.type === "weapon" && i.id === rollKey) + let skill + let skills = this.actor.items.filter((i) => i.type === "skill" && i.name.toLowerCase() === weapon.name.toLowerCase()) + if (skills.length > 0) { + skill = this.getBestWeaponClassSkill(skills, rollType, 1.0) + } else { + skills = this.actor.items.filter((i) => i.type === "skill" && i.name.toLowerCase().replace(" skill", "") === weapon.name.toLowerCase()) + if (skills.length > 0) { + skill = this.getBestWeaponClassSkill(skills, rollType, 1.0) + } else { + skills = this.actor.items.filter((i) => i.type === "skill" && i.system.weaponClass === weapon.system.weaponClass) + if (skills.length > 0) { + skill = this.getBestWeaponClassSkill(skills, rollType, 0.5) + } else { + skills = this.actor.items.filter((i) => i.type === "skill" && i.system.weaponClass.includes(SYSTEM.WEAPON_CATEGORIES[weapon.system.weaponClass])) + if (skills.length > 0) { + skill = this.getBestWeaponClassSkill(skills, rollType, 0.25) + } else { + ui.notifications.warn(game.i18n.localize("LETHALFANTASY.Notifications.skillNotFound")) + return + } + } + } + } + if (!weapon || !skill) { + console.error("Weapon or skill not found", weapon, skill) + ui.notifications.warn(game.i18n.localize("LETHALFANTASY.Notifications.skillNotFound")) + return + } + rollTarget = skill + rollTarget.weapon = weapon + rollTarget.weaponSkillModifier = skill.weaponSkillModifier + rollTarget.rollKey = rollKey + rollTarget.combat = foundry.utils.duplicate(this.actor.system.combat) break case ROLL_TYPE.DAMAGE: rollTarget = elt.dataset.itemId break default: + ui.notifications.error(game.i18n.localize("LETHALFANTASY.Notifications.rollTypeNotFound") + String(rollType)) break } await this.document.system.roll(rollType, rollTarget) diff --git a/module/config/characteristic-tables.mjs b/module/config/characteristic-tables.mjs index e47a781..e80aad3 100644 --- a/module/config/characteristic-tables.mjs +++ b/module/config/characteristic-tables.mjs @@ -6,8 +6,8 @@ export const TABLES = { "str": [ { "value": 1, - "damage_modifier": -7, - "attack_modifier": -4, + "damage": -7, + "attack": -4, "challenge": -9, "aether_points": -20, "hp": -3, @@ -17,8 +17,8 @@ export const TABLES = { }, { "value": 2, - "damage_modifier": -6, - "attack_modifier": -4, + "damage": -6, + "attack": -4, "challenge": -8, "aether_points": -20, "hp": -2, @@ -28,8 +28,8 @@ export const TABLES = { }, { "value": 3, - "damage_modifier": -5, - "attack_modifier": -3, + "damage": -5, + "attack": -3, "challenge": -7, "aether_points": -20, "hp": -1, @@ -39,8 +39,8 @@ export const TABLES = { }, { "value": 4, - "damage_modifier": -4, - "attack_modifier": -3, + "damage": -4, + "attack": -3, "challenge": -6, "aether_points": -20, "hp": -1, @@ -50,8 +50,8 @@ export const TABLES = { }, { "value": 5, - "damage_modifier": -3, - "attack_modifier": -2, + "damage": -3, + "attack": -2, "challenge": -5, "aether_points": -20, "hp": 0, @@ -61,8 +61,8 @@ export const TABLES = { }, { "value": 6, - "damage_modifier": -2, - "attack_modifier": -1, + "damage": -2, + "attack": -1, "challenge": -4, "aether_points": -10, "hp": 0, @@ -72,8 +72,8 @@ export const TABLES = { }, { "value": 7, - "damage_modifier": -2, - "attack_modifier": 0, + "damage": -2, + "attack": 0, "challenge": -3, "aether_points": -10, "hp": 0, @@ -83,8 +83,8 @@ export const TABLES = { }, { "value": 8, - "damage_modifier": -1, - "attack_modifier": 0, + "damage": -1, + "attack": 0, "challenge": -2, "aether_points": 0, "hp": 0, @@ -94,8 +94,8 @@ export const TABLES = { }, { "value": 9, - "damage_modifier": -1, - "attack_modifier": 0, + "damage": -1, + "attack": 0, "challenge": -1, "aether_points": 0, "hp": 0, @@ -105,8 +105,8 @@ export const TABLES = { }, { "value": 10, - "damage_modifier": 0, - "attack_modifier": 0, + "damage": 0, + "attack": 0, "challenge": 0, "aether_points": 0, "hp": 0, @@ -116,8 +116,8 @@ export const TABLES = { }, { "value": 11, - "damage_modifier": 0, - "attack_modifier": 0, + "damage": 0, + "attack": 0, "challenge": 0, "aether_points": 0, "hp": 0, @@ -127,8 +127,8 @@ export const TABLES = { }, { "value": 12, - "damage_modifier": 1, - "attack_modifier": 0, + "damage": 1, + "attack": 0, "challenge": 1, "aether_points": 0, "hp": 0, @@ -138,8 +138,8 @@ export const TABLES = { }, { "value": 13, - "damage_modifier": 1, - "attack_modifier": 0, + "damage": 1, + "attack": 0, "challenge": 2, "aether_points": 0, "hp": 0, @@ -149,8 +149,8 @@ export const TABLES = { }, { "value": 14, - "damage_modifier": 2, - "attack_modifier": 1, + "damage": 2, + "attack": 1, "challenge": 3, "aether_points": 0, "hp": 1, @@ -160,8 +160,8 @@ export const TABLES = { }, { "value": 15, - "damage_modifier": 3, - "attack_modifier": 1, + "damage": 3, + "attack": 1, "challenge": 4, "aether_points": 0, "hp": 2, @@ -171,8 +171,8 @@ export const TABLES = { }, { "value": 16, - "damage_modifier": 4, - "attack_modifier": 2, + "damage": 4, + "attack": 2, "challenge": 5, "aether_points": 0, "hp": 3, @@ -182,8 +182,8 @@ export const TABLES = { }, { "value": 17, - "damage_modifier": 5, - "attack_modifier": 2, + "damage": 5, + "attack": 2, "challenge": 6, "aether_points": 10, "hp": 4, @@ -193,8 +193,8 @@ export const TABLES = { }, { "value": 18, - "damage_modifier": 6, - "attack_modifier": 3, + "damage": 6, + "attack": 3, "challenge": 7, "aether_points": 20, "hp": 5, @@ -204,8 +204,8 @@ export const TABLES = { }, { "value": 19, - "damage_modifier": 7, - "attack_modifier": 3, + "damage": 7, + "attack": 3, "challenge": 8, "aether_points": 20, "hp": 6, @@ -215,8 +215,8 @@ export const TABLES = { }, { "value": 20, - "damage_modifier": 8, - "attack_modifier": 4, + "damage": 8, + "attack": 4, "challenge": 9, "aether_points": 30, "hp": 7, @@ -226,8 +226,8 @@ export const TABLES = { }, { "value": 21, - "damage_modifier": 9, - "attack_modifier": 4, + "damage": 9, + "attack": 4, "challenge": 10, "aether_points": 30, "hp": 8, @@ -237,8 +237,8 @@ export const TABLES = { }, { "value": 22, - "damage_modifier": 10, - "attack_modifier": 5, + "damage": 10, + "attack": 5, "challenge": 11, "aether_points": 40, "hp": 9, @@ -248,8 +248,8 @@ export const TABLES = { }, { "value": 23, - "damage_modifier": 12, - "attack_modifier": 5, + "damage": 12, + "attack": 5, "challenge": 12, "aether_points": 40, "hp": 10, @@ -259,8 +259,8 @@ export const TABLES = { }, { "value": 24, - "damage_modifier": 14, - "attack_modifier": 5, + "damage": 14, + "attack": 5, "challenge": 13, "aether_points": 50, "hp": 11, @@ -270,8 +270,8 @@ export const TABLES = { }, { "value": 25, - "damage_modifier": 16, - "attack_modifier": 6, + "damage": 16, + "attack": 6, "challenge": 14, "aether_points": 60, "hp": 12, @@ -736,7 +736,6 @@ export const TABLES = { }, { "value": 6, - "hp ": 6, "aether_points": -20, "pain_save": 3, @@ -746,7 +745,6 @@ export const TABLES = { }, { "value": 7, - "hp ": 7, "aether_points": -15, "pain_save": 3, @@ -939,175 +937,175 @@ export const TABLES = { "value": 1, "grit": -5, "turning_casting": -4, - "development_points ": 0, + "development_points": 0, "divine_miracle_bonus": 0 }, { "value": 2, "grit": -4, "turning_casting": -4, - "development_points ": 0, + "development_points": 0, "divine_miracle_bonus": 0 }, { "value": 3, "grit": -4, "turning_casting": -3, - "development_points ": 0, + "development_points": 0, "divine_miracle_bonus": 0 }, { "value": 4, "grit": -3, "turning_casting": 3, - "development_points ": 0, + "development_points": 0, "divine_miracle_bonus": 0 }, { "value": 5, "grit": -3, "turning_casting": -2, - "development_points ": 0, + "development_points": 0, "divine_miracle_bonus": 0 }, { "value": 6, "grit": -2, "turning_casting": -2, - "development_points ": 0, + "development_points": 0, "divine_miracle_bonus": 0 }, { "value": 7, "grit": -2, "turning_casting": -1, - "development_points ": 0, + "development_points": 0, "divine_miracle_bonus": 0 }, { "value": 8, "grit": -1, "turning_casting": -1, - "development_points ": 0, + "development_points": 0, "divine_miracle_bonus": 0 }, { "value": 9, "grit": -1, "turning_casting": 0, - "development_points ": 0, + "development_points": 0, "divine_miracle_bonus": 0 }, { "value": 10, "grit": 0, "turning_casting": 0, - "development_points ": 0, + "development_points": 0, "divine_miracle_bonus": 0 }, { "value": 11, "grit": 0, "turning_casting": 0, - "development_points ": 0, + "development_points": 0, "divine_miracle_bonus": 0 }, { "value": 12, "grit": 0, "turning_casting": 1, - "development_points ": 1, + "development_points": 1, "divine_miracle_bonus": 1 }, { "value": 13, "grit": 1, "turning_casting": 1, - "development_points ": 2, + "development_points": 2, "divine_miracle_bonus": 1 }, { "value": 14, "grit": 2, "turning_casting": 2, - "development_points ": 4, + "development_points": 4, "divine_miracle_bonus": 2 }, { "value": 15, "grit": 4, "turning_casting": 2, - "development_points ": 6, + "development_points": 6, "divine_miracle_bonus": 2 }, { "value": 16, "grit": 6, "turning_casting": 3, - "development_points ": 7, + "development_points": 7, "divine_miracle_bonus": 3 }, { "value": 17, "grit": 8, "turning_casting": 3, - "development_points ": 8, + "development_points": 8, "divine_miracle_bonus": 3 }, { "value": 18, "grit": 10, "turning_casting": 4, - "development_points ": 9, + "development_points": 9, "divine_miracle_bonus": 4 }, { "value": 19, "grit": 11, "turning_casting": 5, - "development_points ": 10, + "development_points": 10, "divine_miracle_bonus": 5 }, { "value": 20, "grit": 12, "turning_casting": 6, - "development_points ": 11, + "development_points": 11, "divine_miracle_bonus": 5 }, { "value": 21, "grit": 13, "turning_casting": 7, - "development_points ": 12, + "development_points": 12, "divine_miracle_bonus": 5 }, { "value": 22, "grit": 14, "turning_casting": 7, - "development_points ": 13, + "development_points": 13, "divine_miracle_bonus": 6 }, { "value": 23, "grit": 15, "turning_casting": 8, - "development_points ": 14, + "development_points": 14, "divine_miracle_bonus": 6 }, { "value": 24, "grit": 16, "turning_casting": 8, - "development_points ": 15, + "development_points": 15, "divine_miracle_bonus": 6 }, { "value": 25, "grit": 18, "turning_casting": 9, - "development_points ": 16, + "development_points": 16, "divine_miracle_bonus": 7 } ], @@ -1218,250 +1216,250 @@ export const TABLES = { "value": 1, "defense": -5, "init_cap": "-", - "development_points ": 0, - "attack ": -5, + "development_points": 0, + "attack": -5, "willpower_save": -5, - "divine_miracle_bonus ": 0, + "divine_miracle_bonus": 0, "": "" }, { "value": 2, "defense": -4, "init_cap": "-", - "development_points ": 0, - "attack ": -4, + "development_points": 0, + "attack": -4, "willpower_save": -4, - "divine_miracle_bonus ": 0, + "divine_miracle_bonus": 0, "": "" }, { "value": 3, "defense": -3, "init_cap": "-", - "development_points ": 0, - "attack ": -3, + "development_points": 0, + "attack": -3, "willpower_save": -3, - "divine_miracle_bonus ": 0, + "divine_miracle_bonus": 0, "": "" }, { "value": 4, "defense": -3, "init_cap": "-", - "development_points ": 0, - "attack ": -2, + "development_points": 0, + "attack": -2, "willpower_save": -3, - "divine_miracle_bonus ": 0, + "divine_miracle_bonus": 0, "": "" }, { "value": 5, "defense": -2, "init_cap": "-", - "development_points ": 0, - "attack ": 1, + "development_points": 0, + "attack": 1, "willpower_save": -2, - "divine_miracle_bonus ": 0, + "divine_miracle_bonus": 0, "": "" }, { "value": 6, "defense": -2, "init_cap": "-", - "development_points ": 0, - "attack ": 0, + "development_points": 0, + "attack": 0, "willpower_save": -2, - "divine_miracle_bonus ": 0, + "divine_miracle_bonus": 0, "": "" }, { "value": 7, "defense": -1, "init_cap": "-", - "development_points ": 0, - "attack ": 0, + "development_points": 0, + "attack": 0, "willpower_save": -1, - "divine_miracle_bonus ": 0, + "divine_miracle_bonus": 0, "": "" }, { "value": 8, "defense": -1, "init_cap": "-", - "development_points ": 0, - "attack ": 0, + "development_points": 0, + "attack": 0, "willpower_save": -1, - "divine_miracle_bonus ": 0, + "divine_miracle_bonus": 0, "": "" }, { "value": 9, "defense": -1, "init_cap": "-", - "development_points ": 0, - "attack ": 0, + "development_points": 0, + "attack": 0, "willpower_save": 0, - "divine_miracle_bonus ": 0, + "divine_miracle_bonus": 0, "": "" }, { "value": 10, "defense": 0, "init_cap": 18, - "development_points ": 0, - "attack ": 0, + "development_points": 0, + "attack": 0, "willpower_save": 0, - "divine_miracle_bonus ": 0, + "divine_miracle_bonus": 0, "": "" }, { "value": 11, "defense": 0, "init_cap": 16, - "development_points ": 1, - "attack ": 0, + "development_points": 1, + "attack": 0, "willpower_save": 0, - "divine_miracle_bonus ": 0, + "divine_miracle_bonus": 0, "": "" }, { "value": 12, "defense": 1, "init_cap": 14, - "development_points ": 2, - "attack ": 0, + "development_points": 2, + "attack": 0, "willpower_save": 0, - "divine_miracle_bonus ": 1, + "divine_miracle_bonus": 1, "": "" }, { "value": 13, "defense": 1, "init_cap": 12, - "development_points ": 3, - "attack ": 0, + "development_points": 3, + "attack": 0, "willpower_save": 1, - "divine_miracle_bonus ": 1, + "divine_miracle_bonus": 1, "": "" }, { "value": 14, "defense": 1, "init_cap": 10, - "development_points ": 4, - "attack ": 1, + "development_points": 4, + "attack": 1, "willpower_save": 2, - "divine_miracle_bonus ": 2, + "divine_miracle_bonus": 2, "": "" }, { "value": 15, "defense": 2, "init_cap": 8, - "development_points ": 5, - "attack ": 1, + "development_points": 5, + "attack": 1, "willpower_save": 3, - "divine_miracle_bonus ": 2, + "divine_miracle_bonus": 2, "": "" }, { "value": 16, "defense": 2, "init_cap": 7, - "development_points ": 7, - "attack ": 1, + "development_points": 7, + "attack": 1, "willpower_save": 4, - "divine_miracle_bonus ": 2, + "divine_miracle_bonus": 2, "": "" }, { "value": 17, "defense": 2, "init_cap": 6, - "development_points ": 9, - "attack ": 1, + "development_points": 9, + "attack": 1, "willpower_save": 5, - "divine_miracle_bonus ": 3, + "divine_miracle_bonus": 3, "": "" }, { "value": 18, "defense": 3, "init_cap": 5, - "development_points ": 11, - "attack ": 2, + "development_points": 11, + "attack": 2, "willpower_save": 6, - "divine_miracle_bonus ": 4, + "divine_miracle_bonus": 4, "": "" }, { "value": 19, "defense": 3, "init_cap": 4, - "development_points ": 13, - "attack ": 2, + "development_points": 13, + "attack": 2, "willpower_save": 7, - "divine_miracle_bonus ": 5, + "divine_miracle_bonus": 5, "": "" }, { "value": 20, "defense": 3, "init_cap": 4, - "development_points ": 15, - "attack ": 2, + "development_points": 15, + "attack": 2, "willpower_save": 8, - "divine_miracle_bonus ": 6, + "divine_miracle_bonus": 6, "": "" }, { "value": 21, "defense": 4, "init_cap": 3, - "development_points ": 18, - "attack ": 2, + "development_points": 18, + "attack": 2, "willpower_save": 9, - "divine_miracle_bonus ": 7, + "divine_miracle_bonus": 7, "": "" }, { "value": 22, "defense": 4, "init_cap": 3, - "development_points ": 21, - "attack ": 2, + "development_points": 21, + "attack": 2, "willpower_save": 10, - "divine_miracle_bonus ": 8, + "divine_miracle_bonus": 8, "": "" }, { "value": 23, "defense": 4, "init_cap": 2, - "development_points ": 24, - "attack ": 3, + "development_points": 24, + "attack": 3, "willpower_save": 11, - "divine_miracle_bonus ": 9, + "divine_miracle_bonus": 9, "": "" }, { "value": 24, "defense": 4, "init_cap": 2, - "development_points ": 27, - "attack ": 3, + "development_points": 27, + "attack": 3, "willpower_save": 12, - "divine_miracle_bonus ": 10, + "divine_miracle_bonus": 10, "": "" }, { "value": 25, "defense": 5, "init_cap": 1, - "development_points ": 30, - "attack ": 4, + "development_points": 30, + "attack": 4, "willpower_save": 13, - "divine_miracle_bonus ": 12, + "divine_miracle_bonus": 12, "": "" } ] diff --git a/module/config/system.mjs b/module/config/system.mjs index 19891e3..e0ef087 100644 --- a/module/config/system.mjs +++ b/module/config/system.mjs @@ -59,6 +59,10 @@ export const DICE_VALUES = { "d20": "D20" } +export const CHARACTERISTIC_ATTACK = [ "str", "int", "wis", "dex"] +export const CHARACTERISTIC_DEFENSE = [ "int", "wis", "dex" ] +export const CHARACTERISTIC_DAMAGE = [ "str" ] + export const DEFENSE_DICE_VALUES = { "d3": "D3", "d4": "D4", @@ -145,6 +149,10 @@ export const SYSTEM = { WEAPON_CLASS: WEAPON.WEAPON_CLASS, COMBAT_PROGRESSION_DICE: DICE_VALUES, SHIELD_DEFENSE_DICE: DEFENSE_DICE_VALUES, + WEAPON_CATEGORIES: WEAPON.WEAPON_CATEGORIES, + CHARACTERISTIC_ATTACK, + CHARACTERISTIC_DEFENSE, + CHARACTERISTIC_DAMAGE, MONEY, ASCII, ROLL_TYPE, diff --git a/module/config/weapon.mjs b/module/config/weapon.mjs index 553588a..3f53b3f 100644 --- a/module/config/weapon.mjs +++ b/module/config/weapon.mjs @@ -17,4 +17,19 @@ export const WEAPON_CLASS = { "thrown": "LETHALFANTASY.Weapon.WeaponClass.thrown", "polearm": "LETHALFANTASY.Weapon.WeaponClass.polearm", "unarmed" : "LETHALFANTASY.Weapon.WeaponClass.unarmed" -} \ No newline at end of file +} + +export const WEAPON_CATEGORIES = { + "longblade": ["mediumblade", "shortblade"], + "shortblade": ["mediumblade", "longblade"], + "mediumblade": ["shortblade", "longblade"], + "axe": ["hammer", "mace", "flail", "bow", "sling", "thrown", "polearm"], + "hammer": ["axe", "mace", "flail", "bow", "sling", "thrown", "polearm"], + "mace": ["axe", "hammer", "flail", "bow", "sling", "thrown", "polearm"], + "flail": ["axe", "hammer", "mace", "bow", "sling", "thrown", "polearm"], + "bow": ["axe", "hammer", "mace", "flail", "sling", "thrown", "polearm"], + "sling": ["axe", "hammer", "mace", "flail", "bow", "thrown", "polearm"], + "thrown": ["axe", "hammer", "mace", "flail", "bow", "sling", "polearm"], + "polearm": ["axe", "hammer", "mace", "flail", "bow", "sling", "thrown"] +} + diff --git a/module/documents/roll.mjs b/module/documents/roll.mjs index 9b93147..640da2d 100644 --- a/module/documents/roll.mjs +++ b/module/documents/roll.mjs @@ -11,11 +11,15 @@ export default class LethalFantasyRoll extends Roll { get type() { return this.options.type } - + get titleFormula() { return this.options.titleFormula } - + + get rollName() { + return this.options.rollName + } + get target() { return this.options.target } @@ -83,7 +87,7 @@ export default class LethalFantasyRoll extends Roll { get rollTotal() { return this.options.rollTotal } - + get diceResults() { return this.options.diceResults } @@ -160,15 +164,44 @@ export default class LethalFantasyRoll extends Roll { let hasModifier = true let hasChangeDice = false if (options.rollType === "challenge" || options.rollType === "save") { - if ( options.rollTarget.rollKey === "dying") { + options.rollName = options.rollTarget.rollKey + if (options.rollTarget.rollKey === "dying") { dice = options.rollTarget.value maxValue = Number(options.rollTarget.value.match(/\d+/)[0]) hasModifier = false - hasChangeDice = true + hasChangeDice = true } else { dice = "1D20" maxValue = 20 - } + } + } else if (options.rollType === "skill") { + options.rollName = options.rollTarget.name + dice = "1D100" + baseFormula = "D100" + maxValue = 100 + hasModifier = true + hasChangeDice = false + options.rollTarget.value = options.rollTarget.system.skillTotal + } else if (options.rollType === "weapon-attack" || options.rollType === "weapon-defense") { + options.rollName = options.rollTarget.name + dice = "1D20" + baseFormula = "D20" + maxValue = 20 + hasModifier = true + hasChangeDice = false + if (options.rollType === "weapon-attack") { + options.rollTarget.value = options.rollTarget.combat.attackModifier + options.rollTarget.weaponSkillModifier + options.rollTarget.charModifier = options.rollTarget.combat.attackModifier + } else { + options.rollTarget.value = options.rollTarget.combat.defenseModifier + options.rollTarget.weaponSkillModifier + options.rollTarget.charModifier = options.rollTarget.combat.defenseModifier + } + } + + if (options.rollType === "save" && options.rollTarget.rollKey === "pain") { + dice = options.rollTarget.rollDice + baseFormula = options.rollTarget.rollDice + hasModifier = false } const rollModes = Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)])) @@ -188,6 +221,7 @@ export default class LethalFantasyRoll extends Roll { let dialogContext = { rollType: options.rollType, rollTarget: options.rollTarget, + rollName: options.rollName, rollModes, hasModifier, hasChangeDice, @@ -202,6 +236,7 @@ export default class LethalFantasyRoll extends Roll { modifier, targetName } + console.log("dialogContext", dialogContext) const content = await renderTemplate("systems/fvtt-lethal-fantasy/templates/roll-dialog.hbs", dialogContext) const title = LethalFantasyRoll.createTitle(options.rollType, options.rollTarget) @@ -231,31 +266,38 @@ export default class LethalFantasyRoll extends Roll { let fullModifier = 0 let titleFormula = "" dice = rollContext.changeDice || dice - if (options.rollType === "challenge" || options.rollType === "save") { - if (hasModifier) { - let bonus = Number(options.rollTarget.value) - fullModifier = rollContext.modifier === "" ? 0 : parseInt(rollContext.modifier, 10) + bonus - if (fullModifier === 0) { - modifierFormula = "0" - } else { - let modAbs = Math.abs(fullModifier) - modifierFormula = `d${modAbs + 1} - 1` - } - let sign = fullModifier < 0 ? "-" : "+" - titleFormula = `${dice}E ${sign} ${modifierFormula}` - } else { + if (hasModifier) { + let bonus = Number(options.rollTarget.value) + fullModifier = rollContext.modifier === "" ? 0 : parseInt(rollContext.modifier, 10) + bonus + if (fullModifier === 0) { modifierFormula = "0" - fullModifier = 0 - baseFormula = `${dice}` - titleFormula = `${dice}E` + } else { + let modAbs = Math.abs(fullModifier) + modifierFormula = `d${modAbs + 1} - 1` } + let sign = fullModifier < 0 ? "-" : "+" + titleFormula = `${dice}E ${sign} ${modifierFormula}` + } else { + modifierFormula = "0" + fullModifier = 0 + baseFormula = `${dice}` + titleFormula = `${dice}E` } + + if (options.rollType === "save" && options.rollTarget.rollKey === "pain") { + baseFormula = options.rollTarget.rollDice + titleFormula = `${dice}` + modifierFormula = "0" + fullModifier = 0 + } + maxValue = Number(baseFormula.match(/\d+$/)[0]) // Update the max value agains const rollData = { type: options.rollType, rollType: options.rollType, target: options.rollTarget, + rollName: options.rollName, actorId: options.actorId, actorName: options.actorName, actorImage: options.actorImage, @@ -284,28 +326,22 @@ export default class LethalFantasyRoll extends Roll { let rollTotal = -1 let diceResults = [] let resultType - if (options.rollType === "challenge" || options.rollType === "save") { - let diceResult = rollBase.dice[0].results[0].result - diceResults.push({ dice: `${dice}`, value: diceResult}) - let diceSum = diceResult - while (diceResult === maxValue) { - let r = await new Roll(baseFormula).evaluate() - diceResult = r.dice[0].results[0].result - diceResults.push( {dice: `${dice}-1`, value: diceResult-1}) - diceSum += (diceResult - 1) - } - if (fullModifier !== 0) { - diceResults.push({ dice: `${rollModifier.formula}`, value: rollModifier.total }) - if ( fullModifier < 0) { - rollTotal = Math.max(diceSum - rollModifier.total, 0) - } else { - rollTotal = diceSum + rollModifier.total - } + let diceResult = rollBase.dice[0].results[0].result + diceResults.push({ dice: `${dice}`, value: diceResult }) + let diceSum = diceResult + while (diceResult === maxValue) { + let r = await new Roll(baseFormula).evaluate() + diceResult = r.dice[0].results[0].result + diceResults.push({ dice: `${dice}-1`, value: diceResult - 1 }) + diceSum += (diceResult - 1) + } + if (fullModifier !== 0) { + diceResults.push({ dice: `${rollModifier.formula}`, value: rollModifier.total }) + if (fullModifier < 0) { + rollTotal = Math.max(diceSum - rollModifier.total, 0) } else { - rollTotal = diceSum - } - } else if (options.rollType === ROLL_TYPE.RESOURCE) { - //resultType = roll.total === 1 || roll.total === 2 ? "failure" : "success" + rollTotal = diceSum + rollModifier.total + } } rollBase.options.resultType = resultType @@ -343,12 +379,16 @@ export default class LethalFantasyRoll extends Roll { return `${game.i18n.localize("LETHALFANTASY.Label.titleChallenge")}` case "save": return `${game.i18n.localize("LETHALFANTASY.Label.titleSave")}` - case ROLL_TYPE.DAMAGE: - return `${game.i18n.localize("LETHALFANTASY.Dialog.titleDamage")} : ${target}` - case ROLL_TYPE.ATTACK: - return `${game.i18n.localize("LETHALFANTASY.Dialog.titleAttack")} : ${target}` + case "skill": + return `${game.i18n.localize("LETHALFANTASY.Label.titleSkill")}` + case "weapon-attack": + return `${game.i18n.localize("LETHALFANTASY.Label.weapon-attack")}` + case "weapon-defense": + return `${game.i18n.localize("LETHALFANTASY.Label.weapon-defense")}` + case "weapon-damage": + return `${game.i18n.localize("LETHALFANTASY.Label.weapon-damage")}` default: - return game.i18n.localize("LETHALFANTASY.Dialog.titleStandard") + return game.i18n.localize("LETHALFANTASY.Label.titleStandard") } } @@ -393,6 +433,7 @@ export default class LethalFantasyRoll extends Roll { isGM: game.user.isGM, formula: this.formula, titleFormula: this.titleFormula, + rollName: this.rollName, rollType: this.type, rollTarget: this.rollTarget, total: this.rollTotal, diff --git a/module/models/character.mjs b/module/models/character.mjs index 7b91ab3..69575cf 100644 --- a/module/models/character.mjs +++ b/module/models/character.mjs @@ -95,11 +95,16 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod schema.developmentPoints = new fields.SchemaField({ total: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), remaining: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) - }) + }) schema.spellMiraclePoints = new fields.SchemaField({ total: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), used: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) }) + schema.combat = new fields.SchemaField({ + attackModifier: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), + defenseModifier: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), + damageModifier: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), + }) const moneyField = (label) => { const schema = { @@ -132,7 +137,7 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod let strDef = SYSTEM.CHARACTERISTICS_TABLES.str.find(s => s.value === this.characteristics.str.value) this.challenges.str.value = strDef.challenge - + let dexDef = SYSTEM.CHARACTERISTICS_TABLES.dex.find(s => s.value === this.characteristics.dex.value) this.challenges.agility.value = dexDef.challenge this.saves.dodge.value = dexDef.dodge @@ -147,8 +152,27 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod this.saves.contagion.value = this.characteristics.con.value this.saves.poison.value = this.characteristics.con.value + + this.combat.attackModifier = 0 + for (let chaKey of SYSTEM.CHARACTERISTIC_ATTACK) { + let chaDef = SYSTEM.CHARACTERISTICS_TABLES[chaKey].find(s => s.value === this.characteristics[chaKey].value) + this.combat.attackModifier += chaDef.attack + } + + this.combat.defenseModifier = 0 + for (let chaKey of SYSTEM.CHARACTERISTIC_DEFENSE) { + let chaDef = SYSTEM.CHARACTERISTICS_TABLES[chaKey].find(s => s.value === this.characteristics[chaKey].value) + this.combat.defenseModifier += chaDef.defense + } + + this.combat.damageModifier = 0 + for (let chaKey of SYSTEM.CHARACTERISTIC_DAMAGE) { + let chaDef = SYSTEM.CHARACTERISTICS_TABLES[chaKey].find(s => s.value === this.characteristics[chaKey].value) + this.combat.damageModifier += chaDef.damage + } + } - + /** * Rolls a dice for a character. * @param {("save"|"resource|damage")} rollType The type of the roll. diff --git a/packs/lf-equipment/000048.log b/packs/lf-equipment/000072.log similarity index 100% rename from packs/lf-equipment/000048.log rename to packs/lf-equipment/000072.log diff --git a/packs/lf-equipment/CURRENT b/packs/lf-equipment/CURRENT index a29e551..ee42130 100644 --- a/packs/lf-equipment/CURRENT +++ b/packs/lf-equipment/CURRENT @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1313dcb8ba5862c64b739efae65705d79db1f03ded2ae3ae00f0e239a80aaf78 +oid sha256:80c7a0083bbb737b3d9ce200a0c86078b66ec1bb8acab36e32d628cdaad46fdb size 16 diff --git a/packs/lf-equipment/LOG b/packs/lf-equipment/LOG index 05a2793..97336a4 100644 --- a/packs/lf-equipment/LOG +++ b/packs/lf-equipment/LOG @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d4db6119b7a0b9cdf85f5b4b7f1f88117a2c2d97d6ec1c2b81991eec9043e22e +oid sha256:746e542c31b27251e1d18691fc3bf9ca1a375d7645f403c1e2dc6e97233227ca size 736 diff --git a/packs/lf-equipment/LOG.old b/packs/lf-equipment/LOG.old index 5565487..9cd87d6 100644 --- a/packs/lf-equipment/LOG.old +++ b/packs/lf-equipment/LOG.old @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fa0828a5d7701ad545a65a3dc54780fd44da5972a97502b2806074c024935a49 +oid sha256:717df342deb636ce6b053c24192af602bb028b5113693eb81ce1631721cf157f size 736 diff --git a/packs/lf-equipment/MANIFEST-000046 b/packs/lf-equipment/MANIFEST-000046 deleted file mode 100644 index bc479c4..0000000 --- a/packs/lf-equipment/MANIFEST-000046 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f51ad7f80e2b70c9a5cc9336e76a28bc8191278eb5fb98eb5e4af2e66bad400 -size 137 diff --git a/packs/lf-equipment/MANIFEST-000070 b/packs/lf-equipment/MANIFEST-000070 new file mode 100644 index 0000000..7641fc3 --- /dev/null +++ b/packs/lf-equipment/MANIFEST-000070 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27c27a238d3c8b3f27c16a4d7a1a80c35a0a850f3743ab25c66d66cd0f2fe45d +size 137 diff --git a/packs/lf-gifts/000044.log b/packs/lf-gifts/000068.log similarity index 100% rename from packs/lf-gifts/000044.log rename to packs/lf-gifts/000068.log diff --git a/packs/lf-gifts/CURRENT b/packs/lf-gifts/CURRENT index 778a552..50de663 100644 --- a/packs/lf-gifts/CURRENT +++ b/packs/lf-gifts/CURRENT @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:06bbfaf793b9061ba299146242120e0397a3c1d765c559bb6b80d0196883b125 +oid sha256:be88869b9c5e925a8e723cf40c64647b3ee784e647697ff989fd9b752e8f909a size 16 diff --git a/packs/lf-gifts/LOG b/packs/lf-gifts/LOG index 1fcd518..2abbcab 100644 --- a/packs/lf-gifts/LOG +++ b/packs/lf-gifts/LOG @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:356e33e768ab5196bb55491cb9d21c48b30e5010b3440483c175d2f9a6df514b +oid sha256:8b68067e6901fc6b938efd9ff00ad00bfdf0a458ba9dca90951b302cb3d61c4a size 732 diff --git a/packs/lf-gifts/LOG.old b/packs/lf-gifts/LOG.old index d53e72a..8d3f50a 100644 --- a/packs/lf-gifts/LOG.old +++ b/packs/lf-gifts/LOG.old @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:011b2a63977f4b1b8b1dce5db3f65b5e2aa2749949ee10128f79d222bd81b0a4 +oid sha256:7f5927987bdea8bb11bff28ccc8d07ba29b47a1bfad63593443558e9ceb38915 size 732 diff --git a/packs/lf-gifts/MANIFEST-000042 b/packs/lf-gifts/MANIFEST-000042 deleted file mode 100644 index ddf5ef3..0000000 --- a/packs/lf-gifts/MANIFEST-000042 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89c40c69bfed730eee5714e9080af371b3f170618631eb400d427ad3f9d823dc -size 137 diff --git a/packs/lf-gifts/MANIFEST-000066 b/packs/lf-gifts/MANIFEST-000066 new file mode 100644 index 0000000..6dfcf44 --- /dev/null +++ b/packs/lf-gifts/MANIFEST-000066 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a32db320f1980d5c51ceb9f3a928d25fa11d46dde4584571fcd616cfb438906 +size 137 diff --git a/packs/lf-skills/000048.log b/packs/lf-skills/000072.log similarity index 100% rename from packs/lf-skills/000048.log rename to packs/lf-skills/000072.log diff --git a/packs/lf-skills/CURRENT b/packs/lf-skills/CURRENT index a29e551..ee42130 100644 --- a/packs/lf-skills/CURRENT +++ b/packs/lf-skills/CURRENT @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1313dcb8ba5862c64b739efae65705d79db1f03ded2ae3ae00f0e239a80aaf78 +oid sha256:80c7a0083bbb737b3d9ce200a0c86078b66ec1bb8acab36e32d628cdaad46fdb size 16 diff --git a/packs/lf-skills/LOG b/packs/lf-skills/LOG index 5669d6b..d152392 100644 --- a/packs/lf-skills/LOG +++ b/packs/lf-skills/LOG @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:581f77d6aea22a367e11b7f9927a55b539f28b89b123ce0a6335d9d6dc139808 +oid sha256:0bcace4493aa7335add5ba10fcc6c8757d62af97a2185ea89bedeedaac14746a size 736 diff --git a/packs/lf-skills/LOG.old b/packs/lf-skills/LOG.old index cc589bd..33906c1 100644 --- a/packs/lf-skills/LOG.old +++ b/packs/lf-skills/LOG.old @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0298952469ac706dbc08b8589501e7661b171cd026d66a86d4cdc4702aeb6c5b +oid sha256:b9d23b69bf1ad7052a0d358967801e13765ff3f6aaaa4a1a91acc8fa833b2b56 size 736 diff --git a/packs/lf-skills/MANIFEST-000046 b/packs/lf-skills/MANIFEST-000046 deleted file mode 100644 index 2ee4e24..0000000 --- a/packs/lf-skills/MANIFEST-000046 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8352ea37edd52f7eba503d33aeeee18847a3b60c40a77caf78882c01f3b8a045 -size 137 diff --git a/packs/lf-skills/MANIFEST-000070 b/packs/lf-skills/MANIFEST-000070 new file mode 100644 index 0000000..64d81e4 --- /dev/null +++ b/packs/lf-skills/MANIFEST-000070 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4c95055f51304af0c2692fd95551d16544d91eb23a04f9931ecc0a5171ad156 +size 137 diff --git a/packs/lf-vulnerabilities/000044.log b/packs/lf-vulnerabilities/000068.log similarity index 100% rename from packs/lf-vulnerabilities/000044.log rename to packs/lf-vulnerabilities/000068.log diff --git a/packs/lf-vulnerabilities/CURRENT b/packs/lf-vulnerabilities/CURRENT index 778a552..50de663 100644 --- a/packs/lf-vulnerabilities/CURRENT +++ b/packs/lf-vulnerabilities/CURRENT @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:06bbfaf793b9061ba299146242120e0397a3c1d765c559bb6b80d0196883b125 +oid sha256:be88869b9c5e925a8e723cf40c64647b3ee784e647697ff989fd9b752e8f909a size 16 diff --git a/packs/lf-vulnerabilities/LOG b/packs/lf-vulnerabilities/LOG index 54753db..8044a58 100644 --- a/packs/lf-vulnerabilities/LOG +++ b/packs/lf-vulnerabilities/LOG @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c4609925e37ad50b11906e5fc648ef494a9526b5f1f4c12dfffc6620ab051cf9 +oid sha256:41604696038129a7e5d8f386e5a70b7e3517155cf5095572f2c96c7e22168bee size 732 diff --git a/packs/lf-vulnerabilities/LOG.old b/packs/lf-vulnerabilities/LOG.old index 23ded45..14aafea 100644 --- a/packs/lf-vulnerabilities/LOG.old +++ b/packs/lf-vulnerabilities/LOG.old @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d81c5f17d664c10dab92b104b796136a8ace8ef491946911e9da6ecb3d8ebd94 +oid sha256:acf3e6be40d51a9aba82950c9bcc1713f6d3b9572967187304dbec477e4b40d0 size 732 diff --git a/packs/lf-vulnerabilities/MANIFEST-000042 b/packs/lf-vulnerabilities/MANIFEST-000042 deleted file mode 100644 index c4d3180..0000000 --- a/packs/lf-vulnerabilities/MANIFEST-000042 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86090422b23cb4e91c0b8d4554da4e842e659489ef1b3e1d78416003c079d3ed -size 137 diff --git a/packs/lf-vulnerabilities/MANIFEST-000066 b/packs/lf-vulnerabilities/MANIFEST-000066 new file mode 100644 index 0000000..e7b7bce --- /dev/null +++ b/packs/lf-vulnerabilities/MANIFEST-000066 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ec6a4c86ee5f4b99331e1901685a01b36e7a0bf39eff71e9a6093d7fc204609 +size 137 diff --git a/styles/character.less b/styles/character.less index bbd5e16..106ece0 100644 --- a/styles/character.less +++ b/styles/character.less @@ -212,6 +212,12 @@ min-width: 5rem; max-width: 5rem; margin-left: 0.7rem; + } + .name-pain { + flex: 0; + min-width: 3rem; + max-width: 3rem; + margin-left: 0.7rem; } .form-group { flex: 0; @@ -317,8 +323,8 @@ align-items: center; gap: 10px; .item-img { - width: 50px; - height: 50px; + width: 32px; + height: 32px; } .name { min-width: 12rem; @@ -327,29 +333,35 @@ } .gifts { display: grid; - grid-template-columns: repeat(5, 1fr); + grid-template-columns: repeat(3, 1fr); gap: 10px; .gift { display: flex; align-items: center; gap: 10px; .item-img { - width: 50px; - height: 50px; + width: 32px; + height: 32px; + } + .name { + min-width: 12rem; } } } .vulnerabilities { display: grid; - grid-template-columns: repeat(5, 1fr); + grid-template-columns: repeat(3, 1fr); gap: 10px; .vulnerability { display: flex; align-items: center; gap: 10px; .item-img { - width: 50px; - height: 50px; + width: 32px; + height: 32px; + } + .name { + min-width: 12rem; } } } @@ -366,17 +378,24 @@ .weapons { display: grid; - grid-template-columns: repeat(4, 1fr); + grid-template-columns: repeat(2, 1fr); gap: 10px; .weapon { display: flex; align-items: center; gap: 10px; .item-img { - width: 50px; - height: 50px; + width: 32px; + height: 32px; margin: 5px 0 0 0; } + .name { + min-width: 12rem; + } + .attack-icons a { + margin-left: 8px; + margin-right: 8px; + } } } .armors { @@ -388,11 +407,35 @@ align-items: center; gap: 10px; .item-img { - width: 50px; - height: 50px; + width: 32px; + height: 32px; margin: 5px 0 0 0; } } + .name { + min-width: 12rem; + } + } + .equipments { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 10px; + .equipment{ + display: flex; + align-items: center; + gap: 10px; + .item-img { + width: 32px; + height: 32px; + margin: 5px 0 0 0; + } + .name { + min-width: 12rem; + } + } + .name { + min-width: 12rem; + } } } diff --git a/styles/roll.less b/styles/roll.less index d1b76df..807e023 100644 --- a/styles/roll.less +++ b/styles/roll.less @@ -28,15 +28,18 @@ } } +.main, .dialog-damage, .dialog-resource, .dialog-challenge, .dialog-save { + margin-bottom: 0px; + padding-bottom: 0px; display: flex; justify-content: center; align-items: center; font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-size: calc(var(--font-size-standard) * 1.0); color: var(--color-dark-1); } diff --git a/templates/character-main.hbs b/templates/character-main.hbs index 963d47d..d637a03 100644 --- a/templates/character-main.hbs +++ b/templates/character-main.hbs @@ -1,5 +1,5 @@
- {{!log "character-main" this}} + {{log "character-main" this}}
{{localize "LETHALFANTASY.Label.pc"}} @@ -21,9 +21,6 @@ {{localize "LETHALFANTASY.Label.perception"}} {{formInput systemFields.perception.fields.value value=system.perception.value disabled=isPlayMode classes="character-hp"}} - {{localize "LETHALFANTASY.Label.bonus"}} - {{formInput systemFields.perception.fields.bonus value=system.perception.bonus disabled=isPlayMode - classes="character-hp"}}
{{localize "LETHALFANTASY.Label.grit"}} @@ -61,8 +58,7 @@ class="lf-roll-small fa-solid fa-dice-d20"> {{localize "LETHALFANTASY.Label.saves.will"}} - {{formField systemFields.saves.fields.will.fields.value value=system.saves.will.value - disabled=isPlayMode}} + {{formField systemFields.saves.fields.will.fields.value value=system.saves.will.value disabled=true}} @@ -70,7 +66,7 @@ {{formField systemFields.saves.fields.dodge.fields.value value=system.saves.dodge.value - disabled=isPlayMode}} + disabled=true}} @@ -78,7 +74,7 @@ {{formField systemFields.saves.fields.toughness.fields.value value=system.saves.toughness.value - disabled=isPlayMode}} + disabled=true}}
@@ -116,19 +120,19 @@ class="lf-roll-small fa-solid fa-dice-d20">{{localize "LETHALFANTASY.Label.challenges.strength"}} {{formField systemFields.challenges.fields.str.fields.value value=system.challenges.str.value - disabled=isPlayMode + disabled=true }} {{localize "LETHALFANTASY.Label.challenges.agility"}} {{formField systemFields.challenges.fields.agility.fields.value value=system.challenges.agility.value - disabled=isPlayMode + disabled=true }} {{localize "LETHALFANTASY.Label.challenges.dying"}} {{formField systemFields.challenges.fields.dying.fields.value value=system.challenges.dying.value - disabled=isPlayMode }} + disabled=true }} @@ -141,10 +145,10 @@ {{formField systemFields.movement.fields.walk value=system.movement.walk disabled=isPlayMode}} {{localize "LETHALFANTASY.Label.movement.jog"}} {{formField systemFields.movement.fields.jog value=system.challenges.movement.jog disabled=isPlayMode}} - {{localize "LETHALFANTASY.Label.movement.sprint"}} - {{formField systemFields.movement.fields.sprint value=system.movement.sprint disabled=isPlayMode}} {{localize "LETHALFANTASY.Label.movement.run"}} {{formField systemFields.movement.fields.run value=system.movement.run disabled=isPlayMode}} + {{localize "LETHALFANTASY.Label.movement.sprint"}} + {{formField systemFields.movement.fields.sprint value=system.movement.sprint disabled=isPlayMode}} @@ -220,14 +224,4 @@ -
- {{localize "LETHALFANTASY.Label.resources"}} -
-
-
-
-
-
-
-
\ No newline at end of file diff --git a/templates/character-skills.hbs b/templates/character-skills.hbs index 1e78dcd..ae1d6e5 100644 --- a/templates/character-skills.hbs +++ b/templates/character-skills.hbs @@ -7,8 +7,11 @@ {{#each skills as |item|}}
-
- {{item.name}} +
+{{item.system.skillTotal}} @@ -49,7 +52,7 @@ {{localize "LETHALFANTASY.Label.vulnerabilities"}}
- {{#each gifts as |item|}} + {{#each vulnerabilities as |item|}}
diff --git a/templates/character-weapons.hbs b/templates/character-weapons.hbs index b97609b..d633520 100644 --- a/templates/character-weapons.hbs +++ b/templates/character-weapons.hbs @@ -1,20 +1,34 @@
- {{localize "LETHALFANTASY.Label.equipment"}}{{#if isEditMode}}{{/if}} + {{localize "LETHALFANTASY.Label.weapons"}} +
{{#each weapons as |item|}} - {{!log 'weapon' this}}
{{#if (ne item.img "icons/svg/item-bag.svg")}} {{/if}} -
- {{item.name}} +
+ {{item.name}}
+
+ + + + + + + + + + + + + +
+
@@ -24,10 +38,12 @@
{{/each}}
+
+
+ {{localize "LETHALFANTASY.Label.armors"}}
{{#each armors as |item|}} - {{!log 'armor' this}}
@@ -44,5 +60,25 @@
- +
+ {{localize "LETHALFANTASY.Label.equipment"}} +
+ {{#each equipments as |item|}} +
+ +
+ {{item.name}} +
+
+ + +
+
+ {{/each}} +
+
+ +
\ No newline at end of file diff --git a/templates/chat-message.hbs b/templates/chat-message.hbs index 6713b73..dff5a6e 100644 --- a/templates/chat-message.hbs +++ b/templates/chat-message.hbs @@ -5,13 +5,19 @@
-
- {{upperFirst rollType}} : {{upperCase rollTarget.rollKey}} + {{upperFirst rollName}} : {{upperCase rollTarget.rollKey}} + + {{#if rollTarget.weapon}} + {{rollTarget.weapon.name}} + {{/if}} + Formula : {{titleFormula}} + {{#each diceResults as |result|}} {{result.dice}} : {{result.value}} {{/each}} +
{{#if isSave}} diff --git a/templates/roll-dialog.hbs b/templates/roll-dialog.hbs index 4ecec76..64c2413 100644 --- a/templates/roll-dialog.hbs +++ b/templates/roll-dialog.hbs @@ -1,16 +1,18 @@ {{log "roll-dialog" this}}
-
- {{#if (eq rollType "challenge")}} - {{localize "LETHALFANTASY.Label.challenge"}} - {{else}} - {{localize "LETHALFANTASY.Label.save"}} - {{/if}} +
+ {{localize (concat "LETHALFANTASY.Label." rollType)}} {{#if hasModifier}} -
{{upperCase rollTarget.rollKey}} : {{baseFormula}} + {{baseValue}}
+
{{upperCase rollName}} : {{baseFormula}} + {{baseValue}}
{{else}} -
{{upperCase rollTarget.rollKey}} : {{baseFormula}}
+
{{upperCase rollName}} : {{baseFormula}}
+ {{/if}} + {{#if rollTarget.weapon}} +
{{localize "LETHALFANTASY.Label.baseModifier"}} : {{rollTarget.charModifier}}
+
{{localize "LETHALFANTASY.Label.weapon"}} : {{rollTarget.weapon.name}}
+
{{localize "LETHALFANTASY.Label.skill"}} : {{rollTarget.name}}
+
{{localize "LETHALFANTASY.Label.skillBonus"}} : {{rollTarget.weaponSkillModifier}}
{{/if}}