Skip to content

Commit

Permalink
refactor damage rolls into single user input
Browse files Browse the repository at this point in the history
  • Loading branch information
Lee Talman authored and Lee Talman committed May 22, 2024
1 parent 99b529a commit 902c233
Show file tree
Hide file tree
Showing 6 changed files with 237 additions and 117 deletions.
1 change: 1 addition & 0 deletions lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@
"KNAVE2E.DamageDiceSize": "Damage Die",
"KNAVE2E.DamageDiceAmount": "# of Dice",
"KNAVE2E.DamageDiceBonus": "Bonus",
"KNAVE2E.DamageRollFormula" : "Roll Formula",
"KNAVE2E.Melee": "Melee",
"KNAVE2E.Ranged": "Ranged",
"KNAVE2E.Sling": "Sling",
Expand Down
38 changes: 27 additions & 11 deletions module/data/monster-attack.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export default class Knave2eMonsterAttack extends Knave2eItemType {
schema.damageDiceAmount = new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 });
schema.damageDiceSize = new fields.StringField({ required: false, choices: SYSTEM.DAMAGE_DICE_SIZES, initial: "d6" });
schema.damageDiceBonus = new fields.NumberField({ required: true, nullable: false, integer: false, initial: 0, min: -999 });
// schema.damageRoll = new fields.StringField({required: true, initial: "1d6"});
schema.damageRoll = new fields.StringField({required: true, initial: "1d6"});

return schema;
}
Expand All @@ -23,17 +23,33 @@ export default class Knave2eMonsterAttack extends Knave2eItemType {
}

prepareDerivedData() {
let damageRoll = "";
if (this.damageDiceBonus > 0) {
damageRoll = `${this.damageDiceAmount}${this.damageDiceSize}+${this.damageDiceBonus}`;
const rollDamage = new RegExp("^(\\d*)(d[1-9]\\d*)(?:([+-])(\\d+))?$", "");
const flatDamage = new RegExp("^(\\+?|\\-?)(\\d+)$", "");
let m;

if ((m = rollDamage.exec(this.damageRoll)) !== null) {
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});

this.damageDiceAmount = m[1] === "" ? 1 : m[1];
this.damageDiceSize = m[2];

if (m[3] !== "" && m[3] !== undefined && m[3] !== null) {
this.damageDiceBonus = m[3] === "+" ? +m[4] : +`-${m[4]}`;
} else {
this.damageDiceBonus = 0;
}
} else if ((m = flatDamage.exec(this.damageRoll)) !== null) {
this.damageDiceAmount = 0;
this.damageDiceSize = "d6";

if (m[1] !== "" && m[1] !== undefined && m[1] !== null) {
this.damageDiceBonus = m[1] === "-" ? +`-${m[2]}` : +m[2];
} else {
this.damageDiceBonus = +m[2];
}
}
else if (this.damageDiceBonus === 0) {
damageRoll = `${this.damageDiceAmount}${this.damageDiceSize}`;
}
else {
damageRoll = `${this.damageDiceAmount}${this.damageDiceSize}${this.damageDiceBonus}`;
}
this.damageRoll = damageRoll;
}
}

100 changes: 69 additions & 31 deletions module/data/weapon.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,80 @@ import Knave2eItemType from "./item-type.mjs";
import { SYSTEM } from "../config/system.mjs";

export default class Knave2eWeapon extends Knave2eItemType {
static DEFAULT_CATEGORY = "melee";

static DEFAULT_CATEGORY = "melee";
static defineSchema() {
const fields = foundry.data.fields;
const requiredInteger = { required: true, nullable: false, integer: true };
const schema = super.defineSchema();

static defineSchema() {
const fields = foundry.data.fields;
const requiredInteger = { required: true, nullable: false, integer: true };
const schema = super.defineSchema();
schema.ammoType = new fields.StringField({
required: true,
choices: SYSTEM.AMMO_TYPES,
initial: "none",
});
schema.broken = new fields.BooleanField({ initial: false });
schema.range = new fields.NumberField({
...requiredInteger,
initial: 5,
min: 0,
});
schema.damageDiceAmount = new fields.NumberField({
...requiredInteger,
initial: 1,
min: 0,
});
schema.damageDiceSize = new fields.StringField({
required: false,
initial: "d6",
});
schema.damageDiceBonus = new fields.NumberField({
required: false,
initial: 0,
min: -999,
});
schema.damageRoll = new fields.StringField({
required: true,
initial: "1d6",
});

schema.ammoType = new fields.StringField({ required: true, choices: SYSTEM.AMMO_TYPES, initial: "none" });
schema.broken = new fields.BooleanField({ initial: false });
schema.range = new fields.NumberField({ ...requiredInteger, initial: 5, min: 0 });
schema.damageDiceAmount = new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 });
schema.damageDiceSize = new fields.StringField({ required: false, choices: SYSTEM.DAMAGE_DICE_SIZES, initial: "d6" });
schema.damageDiceBonus = new fields.NumberField({ ...requiredInteger, initial: 0, min: -999 });
// schema.damageRoll = new fields.StringField({required: true, initial: "1d6"});
return schema;
}

return schema;
}
prepareBaseData() {
const categories = SYSTEM.WEAPON.CATEGORIES;
const category =
categories[this.category] ||
categories[this.constructor.DEFAULT_CATEGORY];
}

prepareBaseData() {
const categories = SYSTEM.WEAPON.CATEGORIES;
const category = categories[this.category] || categories[this.constructor.DEFAULT_CATEGORY];
}
prepareDerivedData() {
const rollDamage = new RegExp("^(\\d*)(d[1-9]\\d*)(?:([+-])(\\d+))?$", "");
const flatDamage = new RegExp("^(\\+?|\\-?)(\\d+)$", "");
let m;

if ((m = rollDamage.exec(this.damageRoll)) !== null) {
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});

prepareDerivedData() {
let damageRoll = "";
if (this.damageDiceBonus > 0) {
damageRoll = `${this.damageDiceAmount}${this.damageDiceSize}+${this.damageDiceBonus}`;
}
else if (this.damageDiceBonus === 0) {
damageRoll = `${this.damageDiceAmount}${this.damageDiceSize}`;
}
else {
damageRoll = `${this.damageDiceAmount}${this.damageDiceSize}${this.damageDiceBonus}`;
}
this.damageRoll = damageRoll;
this.damageDiceAmount = m[1] === "" ? 1 : m[1];
this.damageDiceSize = m[2];

if (m[3] !== "" && m[3] !== undefined && m[3] !== null) {
this.damageDiceBonus = m[3] === "+" ? +m[4] : +`-${m[4]}`;
} else {
this.damageDiceBonus = 0;
}
} else if ((m = flatDamage.exec(this.damageRoll)) !== null) {
this.damageDiceAmount = 0;
this.damageDiceSize = "d6";

if (m[1] !== "" && m[1] !== undefined && m[1] !== null) {
this.damageDiceBonus = m[1] === "-" ? +`-${m[2]}` : +m[2];
} else {
this.damageDiceBonus = +m[2];
}
}
}
}

39 changes: 18 additions & 21 deletions module/sheets/item-sheet.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
export default class Knave2eItemSheet extends ItemSheet {


static get defaultOptions() {
return mergeObject(super.defaultOptions, {
classes: ["knave2e", "sheet", "item"],
Expand All @@ -10,17 +8,15 @@ export default class Knave2eItemSheet extends ItemSheet {
});
}


get template() {
const path = "systems/knave2e/templates/item";
let specificPath = `${path}/item-${this.item.type}-sheet.hbs`;

return specificPath;
}

/* -------------------------------------------- */


async getData() {
// Retrieve base data structure.
const context = super.getData();
Expand Down Expand Up @@ -67,43 +63,50 @@ export default class Knave2eItemSheet extends ItemSheet {
this._prepareMonsterAttackData(context);
}

context.system.enrichedHTML = await TextEditor.enrichHTML(context.system.description);

context.system.enrichedHTML = await TextEditor.enrichHTML(
context.system.description
);

return context;
}

_prepareWeaponData(context) {
const systemData = context.system;

context.weaponCategories = this._labelOptions(CONFIG.SYSTEM.WEAPON.CATEGORIES);
context.weaponCategories = this._labelOptions(
CONFIG.SYSTEM.WEAPON.CATEGORIES
);
context.ammoCategories = this._labelOptions(CONFIG.SYSTEM.AMMO.CATEGORIES);
context.damageDiceCategories = CONFIG.SYSTEM.DAMAGE_DICE_SIZES;
// context.damageDiceCategories = CONFIG.SYSTEM.DAMAGE_DICE_SIZES;

return context;
}


_prepareSpellbookData(context) {
context.spellbookCategories = this._labelOptions(CONFIG.SYSTEM.SPELLBOOK.CATEGORIES);
context.spellbookCategories = this._labelOptions(
CONFIG.SYSTEM.SPELLBOOK.CATEGORIES
);

return context;
}

_prepareLightSourceData(context) {
const systemData = context.system;

context.lightSourceCategories = this._labelOptions(CONFIG.SYSTEM.LIGHTSOURCE.CATEGORIES);
context.lightSourceCategories = this._labelOptions(
CONFIG.SYSTEM.LIGHTSOURCE.CATEGORIES
);

return context;
}

_prepareEquipmentData(context) {

return context;
}

_prepareArmorData(context) {
context.armorCategories = this._labelOptions(CONFIG.SYSTEM.ARMOR.CATEGORIES);
context.armorCategories = this._labelOptions(
CONFIG.SYSTEM.ARMOR.CATEGORIES
);
}

_prepareMonsterAttackData(context) {
Expand All @@ -126,10 +129,4 @@ export default class Knave2eItemSheet extends ItemSheet {
// Everything below here is only needed if the sheet is editable
if (!this.isEditable) return;
}

// async _onSubmit(event) {
// console.log(event)
// super._onSubmit(event)
// }

}
65 changes: 42 additions & 23 deletions templates/item/item-monsterAttack-sheet.hbs
Original file line number Diff line number Diff line change
@@ -1,54 +1,73 @@
<form class="{{cssClass}}" autocomplete="off">
{{!-- Item Sheet Header --}}
{{! Item Sheet Header }}
<header class="sheet-header">
<div class="item-header-grid">

{{!-- Item Image --}}
{{! Item Image }}
<div class="item-header-img">
<img class="profile-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<img
class="profile-img"
src="{{item.img}}"
data-edit="img"
title="{{item.name}}"
/>
</div>

{{!-- Item Info --}}
{{! Item Info }}
<div class="item-info-grid">
<div class="item-header-name">
<input type="text" name="name" value="{{item.name}}" data-dtype="String" />
<input
type="text"
name="name"
value="{{item.name}}"
data-dtype="String"
/>
</div>
</div>
</div>
</header>

{{!-- Item Sheet Body --}}
{{! Item Sheet Body }}
<section class="sheet-body">
<div class="item-body-grid">

{{!-- Item Aside --}}
{{! Item Aside }}
<div class="item-body-aside">
<div class="flexrow flex-group-left flex-between">
<div class="resource-label aside">{{localize "KNAVE2E.Attacks"}}</div>
<input type="text" name="system.attackAmount" value="{{system.attackAmount}}" data-dtype="Number" />
<input
type="text"
name="system.attackAmount"
value="{{system.attackAmount}}"
data-dtype="Number"
/>
</div>
<hr class="separator">
<hr class="separator" />
<div class="flexrow flex-group-left flex-between">
<div class="resource-label aside">{{localize "KNAVE2E.DamageDiceSize"}}</div>
<select name="system.damageDiceSize">
{{selectOptions damageDiceCategories selected=system.damageDiceSize localize=true}}</select>
</div>
<div class="flexrow flex-group-left flex-between">
<div class="resource-label aside">{{localize "KNAVE2E.DamageDiceAmount"}}</div>
<input type="text" name="system.damageDiceAmount" value="{{system.damageDiceAmount}}" data-dtype="Number" />
</div>
<div class="flexrow flex-group-left flex-between">
<div class="resource-label aside">{{localize "KNAVE2E.DamageDiceBonus"}}</div>
<input type="text" name="system.damageDiceBonus" value="{{system.damageDiceBonus}}" data-dtype="Number" />
<div class="resource-label aside">{{localize
"KNAVE2E.DamageRollFormula"
}}</div>
<input
class="damage-roll-formula"
type="text"
name="system.damageRoll"
value="{{system.damageRoll}}"
data-dtype="String"
/>
</div>
</div>

{{!-- Item Description --}}
{{! Item Description }}
<div class="item-body-description">
<div class="resource-label">{{localize "KNAVE2E.Description"}}</div>
<section class="editor">
{{editor system.enrichedHTML target="system.description" button=true owner=owner
editable=editable}}
{{editor
system.enrichedHTML
target="system.description"
button=true
owner=owner
editable=editable
}}
</section>
</div>
</div>
Expand Down
Loading

0 comments on commit 902c233

Please sign in to comment.