ENH: Spell counter

master
U~man 2020-07-10 15:15:21 +02:00
parent f877f6e213
commit e4889030cb
6 changed files with 65 additions and 22 deletions

View File

@ -169,6 +169,7 @@
"OSE.armor.heavy": "Heavy",
"OSE.armor.shield": "Shield",
"OSE.spells.spend": "{speaker} is casting {name}!",
"OSE.spells.Memorized": "Memorized",
"OSE.spells.Cast": "Cast",
"OSE.spells.Range": "Range",
@ -177,6 +178,7 @@
"OSE.spells.Duration": "Duration",
"OSE.spells.Level": "Level",
"OSE.spells.Save": "Save",
"OSE.spells.ResetSlots": "Reset Spell slots",
"OSE.abilities.Requirements": "Requirements",

View File

@ -52,7 +52,7 @@ export class OseActorSheet extends ActorSheet {
sortedSpells[lvl].push(spells[i]);
}
data.slots = {
used: slots
used: slots,
};
// Assign and return
data.owned = {
@ -94,6 +94,18 @@ export class OseActorSheet extends ActorSheet {
}
}
async _resetSpells(event) {
let spells = $(event.currentTarget).closest(".inventory.spells").find(".item");
spells.each((_, el) => {
let itemId = el.dataset.itemId;
const item = this.actor.getOwnedItem(itemId);
item.update({
_id: item.id,
"data.cast": item.data.data.memorized,
});
});
}
activateListeners(html) {
// Item summaries
html
@ -117,12 +129,16 @@ export class OseActorSheet extends ActorSheet {
const li = $(ev.currentTarget).parents(".item");
const item = this.actor.getOwnedItem(li.data("itemId"));
if (item.type == "weapon") {
if (this.actor.data.type === 'monster') {
item.update({data: {counter: {value: item.data.data.counter.value - 1}}})
if (this.actor.data.type === "monster") {
item.update({
data: { counter: { value: item.data.data.counter.value - 1 } },
});
}
item.rollWeapon({event: ev});
item.rollWeapon({ event: ev });
} else if (item.type == "spell") {
item.spendSpell();
} else {
item.rollFormula({event: ev});
item.rollFormula({ event: ev });
}
});
@ -135,10 +151,11 @@ export class OseActorSheet extends ActorSheet {
let actorObject = this.actor;
let element = event.currentTarget;
let attack = element.parentElement.parentElement.dataset.attack;
actorObject.rollAttack(
{ label: this.actor.name, type: attack },
ev
);
actorObject.rollAttack({ label: this.actor.name, type: attack }, ev);
});
html.find(".spells .item-reset").click((ev) => {
this._resetSpells(ev);
});
html.find(".hit-dice .attribute-name a").click((ev) => {

View File

@ -95,13 +95,23 @@ export class OseActorSheetMonster extends OseActorSheet {
}
async _resetCounters(event) {
$(event.currentTarget).closest('.abilities').find(".item").each(async (_, el) => {
let itemId = el.dataset.itemId;
const item = this.actor.getOwnedItem(itemId);
if (item.data.type == 'weapon') {
await item.update({"data.counter.value": parseInt(item.data.data.counter.max)});
}
})
$(event.currentTarget)
.closest(".abilities")
.find(".item")
.each(async (_, el) => {
let itemId = el.dataset.itemId;
const item = this.actor.getOwnedItem(itemId);
if (item.data.type == "weapon") {
await item.update({
_id: item.id,
data: {
counter: {
value: parseInt(item.data.data.counter.max),
},
},
});
}
});
}
/**
@ -155,9 +165,9 @@ export class OseActorSheetMonster extends OseActorSheet {
return this.actor.createOwnedItem(itemData, {});
});
html.find('.item-reset').click(ev => {
html.find(".item-reset").click((ev) => {
this._resetCounters(ev);
})
});
html.find(".morale-check a").click((ev) => {
let actorObject = this.actor;

View File

@ -131,6 +131,14 @@ export class OseItem extends Item {
});
}
spendSpell() {
this.update({data: {
cast: this.data.data.cast - 1
}}).then(() => {
this.roll({skipDialog: true})
})
}
/**
* Roll the item to Chat, creating a chat card which contains follow up attack or damage roll options
* @return {Promise}

View File

@ -30,8 +30,11 @@
</div>
{{/if}}
<div class="tab" data-group="primary" data-tab="notes">
{{editor content=data.details.biography target="data.details.biography"
button=true owner=owner editable=editable}}
<div class="inventory">
<div class="item-titles">{{localize "OSE.category.notes"}}</div>
{{editor content=data.details.biography target="data.details.biography"
button=true owner=owner editable=editable}}
</div>
</div>
</section>
</form>

View File

@ -4,6 +4,9 @@
<li class="item-titles flexrow">
<div class="item-caret"><i class="fas fa-caret-down"></i> </div>
<div class="item-name">{{localize "OSE.spells.Level"}} {{id}}</div>
<div class="field-short">
<a class="item-control item-reset" title='{{localize "OSE.spells.ResetSlots"}}'><i class="fas fa-sync"></i></a>
</div>
<div class="field-short">{{localize 'OSE.spells.Slots'}}</div>
<div class="field-long flexrow">
<input type="text" value="{{lookup @root.slots.used @key}}"
@ -12,14 +15,14 @@
placeholder="0"></div>
<div class="item-controls">
<a class="item-control item-create" data-type="spell" data-lvl="{{id}}" title="{{localize 'OSE.Add'}}"><i
class="fa fa-plus"></i></a>
class="fa fa-plus"></i></a>
</div>
</li>
<ol class="item-list">
{{#each spellGroup as |item|}}
<li class="item-entry">
<div class="item flexrow" data-item-id="{{item._id}}">
<div class="item-name {{#if item.data.roll}}item-rollable{{/if}} flexrow">
<div class="item-name item-rollable flexrow">
<div class="item-image" style="background-image: url({{item.img}})"></div>
<a>
<h4 title="{{item.name}}">