Step 4 - Manage perks

This commit is contained in:
2022-02-10 19:03:09 +01:00
parent 0a5e52ec4e
commit d17afaf142
12 changed files with 184 additions and 145 deletions

View File

@@ -104,11 +104,16 @@ export class PegasusActorSheet extends ActorSheet {
const li = $(ev.currentTarget).parents(".item");
PegasusUtility.confirmDelete(this, li);
});
html.find('.park-round-count').change(ev => {
html.find('.effect-used').click(ev => {
const li = $(ev.currentTarget).parents(".item");
let itemId = li.data("item-id");
this.actor.updatePerkRounds( itemId, Number(event.currentTarget.value))
this.actor.perkEffectUsed( itemId)
});
html.find('.perk-status').change(ev => {
const li = $(ev.currentTarget).parents(".item");
let itemId = li.data("item-id");
this.actor.updatePerkStatus( itemId, ev.currentTarget.value)
});
html.find('.subactor-edit').click(ev => {

View File

@@ -343,10 +343,98 @@ export class PegasusActor extends Actor {
}
/* -------------------------------------------- */
updatePerkRounds(itemId, roundValue) {
async perkEffectUsed( itemId) {
let effect = this.items.get(itemId)
if (effect) {
PegasusUtility.createChatWithRollMode(effect.name, {
content: await renderTemplate(`systems/fvtt-pegasus-rpg/templates/chat-effect-used.html`, effect.data)
});
this.deleteEmbeddedDocuments('Item', [ effect.id] )
}
}
/* -------------------------------------------- */
async updatePerkStatus(itemId, status) {
let item = this.items.get(itemId)
if (item) {
this.updateEmbeddedDocuments('Item', [{ _id: item.id, 'data.roundcount': roundValue }]);
if (item.data.data.status == status) return;// Ensure we are really changing the status
let updateOK = true
if ( status == "ready") {
let effects = []
for( let item of this.data.items) {
if ( item.type == "effect" && item.data.data.perkId == itemId) {
effects.push( item.id)
}
}
if ( effects.length) {
await this.deleteEmbeddedDocuments('Item', effects )
}
if ( item.data.data.features.nrgcost.flag ) {
let nrg = duplicate(this.data.data.nrg)
nrg.activated -= item.data.data.features.nrgcost.value
this.update( {'data.nrg': nrg } )
}
if (item.data.data.features.bonushealth.flag) {
let health = duplicate(this.data.data.secondary.health)
health.bonus -= item.data.data.features.bonushealth.value
this.update( {'data.secondary.health': health } )
}
if (item.data.data.features.bonusdelirium.flag) {
let delirium = duplicate(this.data.data.delirium.delirium)
delirium.bonus -= item.data.data.features.bonusdelirium.value
this.update( {'data.secondary.delirium': delirium } )
}
if (item.data.data.features.bonusnrg.flag) {
let nrg = duplicate(this.data.data.nrg)
nrg.mod -= item.data.data.features.bonusnrg.value
this.update( {'data.nrg': nrg } )
}
}
if ( status == "activated") {
// Add effects linked to the perk
let effects = []
for( let effect of item.data.data.effectsgained) {
effect.data.perkId = itemId // Link to the perk, in order to dynamically remove them
effect.data.isUsed = false // Flag to indicate removal when used in a roll window
effects.push( effect )
}
if ( effects.length) {
await this.createEmbeddedDocuments('Item', effects )
}
// Manage additional flags
if ( item.data.data.features.nrgcost.flag ) {
if (this.data.data.nrg.value >= item.data.data.features.nrgcost.value) {
let nrg = duplicate(this.data.data.nrg)
nrg.activated += item.data.data.features.nrgcost.value
nrg.value -= item.data.data.features.nrgcost.value
this.update( {'data.nrg': nrg } )
} else {
updateOK = false
ui.notifications.warn("Not enough NRG to activate the Perk " + item.name)
}
}
if (item.data.data.features.bonushealth.flag) {
let health = duplicate(this.data.data.secondary.health)
health.bonus += item.data.data.features.bonushealth.value
this.update( {'data.secondary.health': health } )
}
if (item.data.data.features.bonusdelirium.flag) {
let delirium = duplicate(this.data.data.delirium.delirium)
delirium.bonus += item.data.data.features.bonusdelirium.value
this.update( {'data.secondary.delirium': delirium } )
}
if (item.data.data.features.bonusnrg.flag) {
let nrg = duplicate(this.data.data.nrg)
nrg.mod += item.data.data.features.bonusnrg.value
this.update( {'data.nrg': nrg } )
}
}
if (updateOK) {
this.updateEmbeddedDocuments('Item', [{ _id: item.id, 'data.status': status }])
}
}
}

View File

@@ -88,7 +88,6 @@ export class PegasusItemSheet extends ItemSheet {
/* -------------------------------------------- */
postItem() {
console.log(this.item);
let chatData = duplicate(PegasusUtility.data(this.item));
if (this.actor) {
chatData.actor = { id: this.actor.id };
@@ -105,7 +104,7 @@ export class PegasusItemSheet extends ItemSheet {
});
renderTemplate('systems/fvtt-pegasus-rpg/templates/post-item.html', chatData).then(html => {
let chatOptions = WotGUtility.chatDataSetup(html);
let chatOptions = PegasusUtility.chatDataSetup(html);
ChatMessage.create(chatOptions)
});
}
@@ -324,8 +323,7 @@ export class PegasusItemSheet extends ItemSheet {
await this.object.update( { 'data.armorgained': armorArray} );
}
}
/* -------------------------------------------- */
async addPerkSpecialisation( event, item, dataItem) {
let newItem = duplicate(item.data);
@@ -340,6 +338,16 @@ export class PegasusItemSheet extends ItemSheet {
}
}
/* -------------------------------------------- */
async addPerkEffect( event, item, dataItem) {
let newItem = duplicate(item.data)
if ( event.toElement.className == 'drop-perk-effect') {
let effectArray = duplicate(this.object.data.data.effectsgained)
effectArray.push( newItem )
await this.object.update( { 'data.effectsgained': effectArray} )
}
}
/* -------------------------------------------- */
async addEffectSpec( event, item, dataItem) {
let newItem = duplicate(item.data);
@@ -384,13 +392,16 @@ export class PegasusItemSheet extends ItemSheet {
}
if (this.object.type == 'perk' ) {
let data = event.dataTransfer.getData('text/plain');
let data = event.dataTransfer.getData('text/plain')
if (data) {
let dataItem = JSON.parse( data );
let item = await PegasusUtility.searchItem( dataItem);
let item = await PegasusUtility.searchItem( dataItem)
if ( item.data.type == 'specialisation') {
return this.addPerkSpecialisation( event, item, dataItem);
return this.addPerkSpecialisation( event, item, dataItem)
}
if ( item.data.type == 'effect') {
return this.addPerkEffect( event, item, dataItem);
}
}
}

View File

@@ -57,6 +57,7 @@ export class PegasusRollDialog extends Dialog {
let effectData = effect.effect
level = effectData.data.effectlevel
genre = effectData.data.genre
effectData.data.isUsed = toggled
if (effectData.data.bonusdice) {
idVal = "#bonusDicesLevel"
}

View File

@@ -403,12 +403,24 @@ export class PegasusUtility {
}
}
/* -------------------------------------------- */
static removeUsedPerkEffects( rollData) {
// De-actived used effects from perks
let toRem = []
for(let effect of rollData.effectsList) {
if (effect.effect.data.perkId && effect.effect.data.isUsed) {
toRem.push( effect.effect._id)
}
}
if (toRem.length > 0) {
let actor = game.actors.get(rollData.actorId)
actor.deleteEmbeddedDocuments('Item', toRem)
}
}
/* -------------------------------------------- */
static async rollPegasus(rollData) {
let actor = game.actors.get(rollData.actorId);
let dicePool = [{ name: "stat", level: 0, statmod: 0 }, { name: "spec", level: 0 }, { name: "bonus", level: 0 }, { name: "hindrance", level: 0 }, { name: "other", level: 0 }];
if (rollData.stat) {
dicePool[0].level += Number(rollData.stat.value);
@@ -476,6 +488,9 @@ export class PegasusUtility {
let combat = game.combats.get(rollData.combatId)
combat.updateEmbeddedDocuments("Combatant", [{ _id: rollData.combatantId, initiative: rollData.finalScore }]);
}
//this.removeUsedPerkEffects( rollData) // Unused for now
// And save the roll
this.saveRollData(rollData);
}