2022-01-16 22:06:49 +01:00
|
|
|
import { BoLDefaultRoll } from "../controllers/bol-rolls.js";
|
2022-02-18 22:15:46 +01:00
|
|
|
import { BoLUtility } from "../system/bol-utility.js";
|
2022-01-16 22:06:49 +01:00
|
|
|
|
2021-07-08 10:12:12 +02:00
|
|
|
/**
|
|
|
|
* Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system.
|
|
|
|
* @extends {Actor}
|
|
|
|
*/
|
|
|
|
export class BoLActor extends Actor {
|
2021-11-01 22:23:43 +01:00
|
|
|
|
2021-07-08 10:12:12 +02:00
|
|
|
/** @override */
|
|
|
|
prepareData() {
|
|
|
|
const actorData = this.data;
|
2022-02-23 20:39:58 +01:00
|
|
|
|
2021-11-01 22:23:43 +01:00
|
|
|
if (actorData.type === 'character') {
|
2022-01-08 23:28:16 +01:00
|
|
|
actorData.type = 'player';
|
|
|
|
actorData.villainy = false;
|
|
|
|
}
|
|
|
|
if (actorData.type === 'encounter') {
|
|
|
|
actorData.type = 'tough';
|
|
|
|
actorData.villainy = true;
|
2021-11-01 22:23:43 +01:00
|
|
|
}
|
2022-01-03 00:09:27 +01:00
|
|
|
super.prepareData();
|
2021-07-08 10:12:12 +02:00
|
|
|
}
|
|
|
|
|
2022-01-03 00:09:27 +01:00
|
|
|
/* -------------------------------------------- */
|
|
|
|
updateResourcesData( ) {
|
2022-01-08 23:28:16 +01:00
|
|
|
if ( this.type == 'character') {
|
|
|
|
let newVitality = 10 + this.data.data.attributes.vigor.value + this.data.data.resources.hp.bonus
|
|
|
|
if ( this.data.data.resources.hp.max != newVitality) {
|
|
|
|
this.update( {'data.resources.hp.max': newVitality} );
|
|
|
|
}
|
|
|
|
let newPower = 10 + this.data.data.attributes.mind.value + this.data.data.resources.power.bonus
|
|
|
|
if ( this.data.data.resources.power.max != newPower) {
|
|
|
|
this.update( {'data.resources.power.max': newPower} );
|
|
|
|
}
|
2021-11-01 22:23:43 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-12-29 19:15:06 +01:00
|
|
|
/* -------------------------------------------- */
|
2022-01-03 00:09:27 +01:00
|
|
|
prepareDerivedData() {
|
|
|
|
super.prepareDerivedData()
|
|
|
|
this.updateResourcesData()
|
|
|
|
this.manageHealthState();
|
2021-12-29 19:15:06 +01:00
|
|
|
}
|
2022-01-03 00:09:27 +01:00
|
|
|
|
2021-11-01 00:28:42 +01:00
|
|
|
/* -------------------------------------------- */
|
2021-11-08 14:40:29 +01:00
|
|
|
get itemData(){
|
2022-03-10 21:05:53 +01:00
|
|
|
return Array.from(this.data.items.values()).map(i => i.data)
|
2021-11-01 00:28:42 +01:00
|
|
|
}
|
2021-11-08 14:40:29 +01:00
|
|
|
get details() {
|
2022-03-10 21:05:53 +01:00
|
|
|
return this.data.data.details
|
2021-11-01 00:28:42 +01:00
|
|
|
}
|
2021-11-08 14:40:29 +01:00
|
|
|
get attributes() {
|
2022-03-10 21:05:53 +01:00
|
|
|
return Object.values(this.data.data.attributes)
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
|
|
|
get aptitudes() {
|
2022-03-10 21:05:53 +01:00
|
|
|
return Object.values(this.data.data.aptitudes)
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
2022-03-10 21:39:12 +01:00
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
clearRoundModifiers( ) { // Process data/items that are finished at end of a round
|
|
|
|
let foList = this.fightoptions
|
|
|
|
for(let fo of foList) {
|
|
|
|
if (fo.data.properties.used) {
|
|
|
|
this.updateEmbeddedDocuments("Item", [ {_id: fo._id, 'data.properties.used': false}] )
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-03-10 21:05:53 +01:00
|
|
|
/* -------------------------------------------- */
|
2021-12-25 23:26:27 +01:00
|
|
|
get defenseValue() {
|
2022-03-10 21:05:53 +01:00
|
|
|
let defMod = 0
|
|
|
|
let fo = this.getActiveFightOption()
|
|
|
|
if (fo && fo.data.properties.fightoptiontype == "intrepid" ) {
|
|
|
|
defMod += -2
|
|
|
|
}
|
|
|
|
if (fo && fo.data.properties.fightoptiontype == "fulldefense" ) {
|
|
|
|
defMod += 2
|
|
|
|
}
|
|
|
|
if (fo && fo.data.properties.fightoptiontype == "twoweaponsdef" && !fo.data.properties.used) {
|
|
|
|
defMod += 1
|
|
|
|
this.updateEmbeddedDocuments("Item", [ {_id: fo._id, 'data.properties.used': true}] )
|
|
|
|
}
|
|
|
|
if (fo && fo.data.properties.fightoptiontype == "defense" ) {
|
|
|
|
defMod += 1
|
|
|
|
}
|
|
|
|
if (fo && fo.data.properties.fightoptiontype == "attack" ) {
|
|
|
|
defMod += -1
|
|
|
|
}
|
|
|
|
return this.data.data.aptitudes.def.value + defMod
|
2021-12-25 23:26:27 +01:00
|
|
|
}
|
2022-03-10 21:05:53 +01:00
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
getActiveFightOption( ) {
|
|
|
|
let it = this.itemData.find(i => i.type === "feature" && i.data.subtype === "fightoption" && i.data.properties.activated)
|
|
|
|
if (it) {
|
|
|
|
return duplicate(it)
|
|
|
|
}
|
|
|
|
return undefined
|
|
|
|
}
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
async toggleFightOption( itemId) {
|
|
|
|
let fightOption = this.data.items.get(itemId)
|
|
|
|
let state
|
|
|
|
let updates = []
|
|
|
|
|
|
|
|
if ( fightOption) {
|
|
|
|
fightOption = duplicate(fightOption)
|
|
|
|
if (fightOption.data.properties.activated) {
|
|
|
|
state = false
|
|
|
|
} else {
|
|
|
|
state = true
|
|
|
|
}
|
|
|
|
updates.push( {_id: fightOption._id, 'data.properties.activated': state} ) // Update the selected one
|
|
|
|
await this.updateEmbeddedDocuments("Item", updates) // Apply all changes
|
|
|
|
// Then notify
|
|
|
|
ChatMessage.create({
|
|
|
|
alias: this.name,
|
|
|
|
whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
|
|
|
|
content: await renderTemplate('systems/bol/templates/chat/chat-activate-fight-option.hbs', { name: this.name, img: fightOption.img, foName: fightOption.name, state: state} )
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
get armorMalusValue() { // used for Fight Options
|
|
|
|
for(let armor of this.armors) {
|
|
|
|
if (armor.data.properties.armorQuality.includes("light")) {
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
if (armor.data.properties.armorQuality.includes("medium")) {
|
|
|
|
return 2
|
|
|
|
}
|
|
|
|
if (armor.data.properties.armorQuality.includes("heavy")) {
|
|
|
|
return 3
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2021-11-08 14:40:29 +01:00
|
|
|
get resources() {
|
2022-03-10 21:05:53 +01:00
|
|
|
return Object.values(this.data.data.resources)
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
|
|
|
get boons() {
|
|
|
|
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "boon");
|
|
|
|
}
|
|
|
|
get flaws() {
|
|
|
|
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "flaw");
|
|
|
|
}
|
|
|
|
get careers() {
|
|
|
|
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "career");
|
|
|
|
}
|
|
|
|
get origins() {
|
|
|
|
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "origin");
|
|
|
|
}
|
|
|
|
get races() {
|
|
|
|
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "race");
|
|
|
|
}
|
|
|
|
get languages() {
|
2022-03-10 21:05:53 +01:00
|
|
|
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "language")
|
|
|
|
}
|
|
|
|
get fightoptions() {
|
|
|
|
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "fightoption")
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
|
|
|
get features() {
|
2022-03-10 21:05:53 +01:00
|
|
|
return this.itemData.filter(i => i.type === "feature")
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
|
|
|
get equipment() {
|
2022-03-10 21:05:53 +01:00
|
|
|
return this.itemData.filter(i => i.type === "item")
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
|
|
|
get armors() {
|
2021-12-24 16:06:26 +01:00
|
|
|
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "armor");
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
|
|
|
get helms() {
|
2021-12-24 16:06:26 +01:00
|
|
|
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "helm");
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
|
|
|
get shields() {
|
2021-12-24 16:06:26 +01:00
|
|
|
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "shield");
|
|
|
|
}
|
2022-03-10 21:05:53 +01:00
|
|
|
|
2021-12-24 16:06:26 +01:00
|
|
|
get weapons() {
|
|
|
|
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "weapon");
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
|
|
|
get protections() {
|
2021-12-24 16:06:26 +01:00
|
|
|
return this.armors.concat(this.helms).concat(this.shields)
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
2022-01-23 09:25:09 +01:00
|
|
|
get spells() {
|
|
|
|
return this.itemData.filter(i => i.type === "item" && i.data.category === "spell");
|
|
|
|
}
|
|
|
|
get alchemy() {
|
|
|
|
return this.itemData.filter(i => i.type === "item" && i.data.category === "alchemy");
|
|
|
|
}
|
2021-11-08 14:40:29 +01:00
|
|
|
get melee() {
|
2021-12-24 16:06:26 +01:00
|
|
|
return this.weapons.filter(i => i.data.properties.melee === true);
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
|
|
|
get ranged() {
|
2021-12-24 16:06:26 +01:00
|
|
|
return this.weapons.filter(i => i.data.properties.ranged === true);
|
|
|
|
}
|
|
|
|
|
|
|
|
get containers() {
|
|
|
|
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "container");
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
2021-12-24 16:06:26 +01:00
|
|
|
|
|
|
|
get treasure() {
|
|
|
|
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "currency");
|
|
|
|
}
|
|
|
|
|
|
|
|
get vehicles() {
|
|
|
|
return this.itemData.filter(i => i.type === "item" && i.data.category === "vehicle");
|
|
|
|
}
|
|
|
|
|
|
|
|
get ammos() {
|
|
|
|
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "ammunition");
|
|
|
|
}
|
|
|
|
|
|
|
|
get misc() {
|
|
|
|
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && (i.data.subtype === "other" ||i.data.subtype === "container" ||i.data.subtype === "scroll" || i.data.subtype === "jewel"));
|
|
|
|
}
|
2022-01-09 13:23:20 +01:00
|
|
|
|
2022-02-18 21:58:53 +01:00
|
|
|
get bonusBoons() {
|
|
|
|
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "boon" && i.data.properties.isbonusdice);
|
|
|
|
}
|
|
|
|
get malusFlaws() {
|
|
|
|
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "flaw" && i.data.properties.ismalusdice);
|
|
|
|
}
|
|
|
|
|
2022-01-23 09:25:09 +01:00
|
|
|
isSorcerer( ) {
|
|
|
|
if ( this.careers.find( item => item.data.properties.sorcerer == true) )
|
|
|
|
return true
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
isAlchemist( ) {
|
|
|
|
if ( this.careers.find( item => item.data.properties.alchemist == true) )
|
|
|
|
return true
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
isPriest( ) {
|
|
|
|
if ( this.careers.find( item => item.data.properties.priest == true) )
|
|
|
|
return true
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
spendPowerPoint( ppCost ) {
|
|
|
|
let newPP = this.data.data.resources.power.value - ppCost
|
|
|
|
newPP = (newPP<0) ? 0 : newPP
|
|
|
|
this.update( {'data.resources.power.value': newPP})
|
|
|
|
}
|
|
|
|
|
|
|
|
resetAlchemyStatus( alchemyId ) {
|
|
|
|
let alchemy = this.data.items.get( alchemyId)
|
|
|
|
if (alchemy) {
|
|
|
|
this.updateEmbeddedDocuments('Item', [{_id: alchemy.id, 'data.properties.pccurrent': 0}] )
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async spendAlchemyPoint( alchemyId, pcCost) {
|
|
|
|
let alchemy = this.data.items.get( alchemyId)
|
|
|
|
if (alchemy) {
|
|
|
|
pcCost = Number(pcCost)?? 0
|
|
|
|
if ( this.data.data.resources.alchemypoints.value >= pcCost) {
|
|
|
|
let newPC = this.data.data.resources.alchemypoints.value - pcCost
|
|
|
|
newPC = (newPC<0) ? 0 : newPC
|
|
|
|
this.update( {'data.resources.alchemypoints.value': newPC} )
|
|
|
|
newPC = alchemy.data.data.properties.pccurrent + pcCost
|
|
|
|
await this.updateEmbeddedDocuments('Item', [{_id: alchemy.id, 'data.properties.pccurrent': newPC}] )
|
|
|
|
} else {
|
|
|
|
ui.notifications.warn("Plus assez de Points de Création !")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
getAlchemistBonus() {
|
|
|
|
let sorcerer = this.careers.find( item => item.data.properties.alchemist == true)
|
|
|
|
if (sorcerer) {
|
|
|
|
return sorcerer.data.rank
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
getSorcererBonus() {
|
|
|
|
let sorcerer = this.careers.find( item => item.data.properties.sorcerer == true)
|
|
|
|
if (sorcerer) {
|
|
|
|
return sorcerer.data.rank
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-01-09 13:23:20 +01:00
|
|
|
heroReroll( ) {
|
|
|
|
if (this.type == 'character') {
|
|
|
|
return this.data.data.resources.hero.value > 0;
|
|
|
|
} else {
|
|
|
|
if (this.data.data.type == 'adversary') {
|
|
|
|
return this.data.data.resources.hero.value > 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
2021-12-24 16:06:26 +01:00
|
|
|
|
2022-01-08 23:28:16 +01:00
|
|
|
getResourcesFromType() {
|
|
|
|
let resources = {};
|
|
|
|
if (this.type == 'encounter') {
|
|
|
|
resources['hp'] = this.data.data.resources.hp;
|
|
|
|
if (this.data.data.type != 'base') {
|
|
|
|
resources['faith'] = this.data.data.resources.faith
|
|
|
|
resources['power'] = this.data.data.resources.power
|
|
|
|
}
|
|
|
|
if (this.data.data.type == 'adversary') {
|
|
|
|
resources['hero'] = duplicate(this.data.data.resources.hero)
|
|
|
|
resources['hero'].label = "BOL.resources.villainy"
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
resources = this.data.data.resources;
|
|
|
|
}
|
|
|
|
return resources
|
|
|
|
}
|
|
|
|
|
2021-11-08 14:40:29 +01:00
|
|
|
buildFeatures(){
|
|
|
|
return {
|
|
|
|
"careers": {
|
|
|
|
"label": "BOL.featureCategory.careers",
|
|
|
|
"ranked": true,
|
|
|
|
"items": this.careers
|
|
|
|
},
|
|
|
|
"origins": {
|
|
|
|
"label": "BOL.featureCategory.origins",
|
|
|
|
"ranked": false,
|
|
|
|
"items": this.origins
|
|
|
|
},
|
|
|
|
"races": {
|
|
|
|
"label": "BOL.featureCategory.races",
|
|
|
|
"ranked": false,
|
|
|
|
"items": this.races
|
|
|
|
},
|
|
|
|
"boons": {
|
|
|
|
"label": "BOL.featureCategory.boons",
|
|
|
|
"ranked": false,
|
|
|
|
"items": this.boons
|
|
|
|
},
|
|
|
|
"flaws": {
|
|
|
|
"label": "BOL.featureCategory.flaws",
|
|
|
|
"ranked": false,
|
|
|
|
"items": this.flaws
|
|
|
|
},
|
|
|
|
"languages": {
|
|
|
|
"label": "BOL.featureCategory.languages",
|
|
|
|
"ranked": false,
|
|
|
|
"items": this.languages
|
2022-03-10 21:05:53 +01:00
|
|
|
},
|
|
|
|
"fightoptions": {
|
|
|
|
"label": "BOL.featureCategory.fightoptions",
|
|
|
|
"ranked": false,
|
|
|
|
"items": this.fightoptions
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
2022-03-10 21:05:53 +01:00
|
|
|
}
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
2022-03-10 21:05:53 +01:00
|
|
|
|
2021-11-08 14:40:29 +01:00
|
|
|
buildCombat(){
|
|
|
|
return {
|
|
|
|
"melee" : {
|
|
|
|
"label" : "BOL.combatCategory.melee",
|
|
|
|
"weapon" : true,
|
|
|
|
"protection" : false,
|
|
|
|
"blocking" : false,
|
|
|
|
"ranged" : false,
|
2022-03-10 21:05:53 +01:00
|
|
|
"options": false,
|
2021-11-08 14:40:29 +01:00
|
|
|
"items" : this.melee
|
|
|
|
},
|
|
|
|
"ranged" : {
|
|
|
|
"label" : "BOL.combatCategory.ranged",
|
|
|
|
"weapon" : true,
|
|
|
|
"protection" : false,
|
|
|
|
"blocking" : false,
|
|
|
|
"ranged" : true,
|
2022-03-10 21:05:53 +01:00
|
|
|
"options": false,
|
2021-11-08 14:40:29 +01:00
|
|
|
"items" : this.ranged
|
|
|
|
},
|
|
|
|
"protections" : {
|
|
|
|
"label" : "BOL.combatCategory.protections",
|
|
|
|
"weapon" : false,
|
|
|
|
"protection" : true,
|
|
|
|
"blocking" : false,
|
|
|
|
"ranged" : false,
|
2022-03-10 21:05:53 +01:00
|
|
|
"options": false,
|
2021-11-08 14:40:29 +01:00
|
|
|
"items" : this.protections
|
|
|
|
},
|
|
|
|
"shields" : {
|
|
|
|
"label" : "BOL.combatCategory.shields",
|
|
|
|
"weapon" : false,
|
|
|
|
"protection" : false,
|
|
|
|
"blocking" : true,
|
|
|
|
"ranged" : false,
|
2022-03-10 21:05:53 +01:00
|
|
|
"options": false,
|
2021-11-08 14:40:29 +01:00
|
|
|
"items" : this.shields
|
2022-03-10 21:05:53 +01:00
|
|
|
},
|
|
|
|
"fightoptions" : {
|
|
|
|
"label" : "BOL.combatCategory.fightOptions",
|
|
|
|
"weapon" : false,
|
|
|
|
"protection" : false,
|
|
|
|
"blocking" : false,
|
|
|
|
"ranged" : false,
|
|
|
|
"options": true,
|
|
|
|
"items" : this.fightoptions
|
2021-11-08 14:40:29 +01:00
|
|
|
}
|
2022-03-10 21:05:53 +01:00
|
|
|
}
|
2021-11-01 00:28:42 +01:00
|
|
|
}
|
2021-12-29 19:15:06 +01:00
|
|
|
|
|
|
|
/*-------------------------------------------- */
|
2022-02-18 22:15:46 +01:00
|
|
|
async manageHealthState() {
|
2022-02-20 10:12:25 +01:00
|
|
|
let lastHP = await this.getFlag("world", "lastHP")
|
|
|
|
if ( lastHP != this.data.data.resources.hp.value ) {
|
|
|
|
await this.setFlag("world", "lastHP", this.data.data.resources.hp.value)
|
|
|
|
if (this.data.data.resources.hp.value <= 0 ) {
|
|
|
|
ChatMessage.create({
|
|
|
|
alias: this.name,
|
|
|
|
whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
|
|
|
|
content: await renderTemplate('systems/bol/templates/chat/chat-vitality-zero.hbs', { name: this.name, hp: this.data.data.resources.hp.value} )
|
|
|
|
})
|
|
|
|
}
|
2021-12-29 19:15:06 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-16 22:53:41 +01:00
|
|
|
/*-------------------------------------------- */
|
|
|
|
registerInit(initScore, isCritical, isFumble) {
|
|
|
|
this.update( { 'data.combat.lastinit': initScore, 'data.combat.iscritical': isCritical, 'data.combat.isfumble': isFumble} )
|
|
|
|
}
|
|
|
|
|
|
|
|
/*-------------------------------------------- */
|
|
|
|
getLastInitData() {
|
|
|
|
return this.data.data.combat
|
|
|
|
}
|
|
|
|
|
2021-12-29 19:15:06 +01:00
|
|
|
/*-------------------------------------------- */
|
|
|
|
async subHeroPoints( nb) {
|
|
|
|
let newHeroP = this.data.data.resources.hero.value - nb;
|
|
|
|
newHeroP = (newHeroP < 0 ) ? 0 : newHeroP;
|
|
|
|
await this.update( { 'data.resources.hero.value': newHeroP} );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*-------------------------------------------- */
|
|
|
|
async sufferDamage( damage) {
|
|
|
|
let newHP = this.data.data.resources.hp.value - damage;
|
|
|
|
await this.update( { 'data.resources.hp.value': newHP} );
|
|
|
|
}
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
getArmorFormula( ) {
|
2022-02-15 20:53:13 +01:00
|
|
|
let protectWorn = this.protections.filter( item => item.data.worn)
|
2021-12-29 19:15:06 +01:00
|
|
|
let formula = ""
|
|
|
|
for (let protect of protectWorn) {
|
|
|
|
if ( protect.data.subtype == 'helm') {
|
|
|
|
formula += "+1"
|
2022-01-01 23:32:48 +01:00
|
|
|
} else if ( protect.data.subtype == 'armor') {
|
2022-02-23 20:39:58 +01:00
|
|
|
if ( BoLUtility.this.getRollArmor() ) {
|
|
|
|
if ( !protect.data.properties.soak.formula || protect.data.properties.soak.formula=="") {
|
|
|
|
ui.notifications.warn(`L'armure ${protect.name} n'a pas de formule pour la protection !`)
|
|
|
|
} else {
|
|
|
|
formula += "+" + protect.data.properties.soak.formula
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if ( protect.data.properties.soak.value == undefined ) {
|
|
|
|
ui.notifications.warn(`L'armure ${protect.name} n'a pas de valeur fixe pour la protection !`)
|
|
|
|
} else {
|
|
|
|
formula += "+ " + protect.data.properties.soak.value
|
|
|
|
}
|
|
|
|
}
|
2021-12-29 19:15:06 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
console.log("Protect Formula", formula)
|
2022-02-15 20:53:13 +01:00
|
|
|
return (formula == "") ? "0" :formula;
|
2021-12-29 19:15:06 +01:00
|
|
|
}
|
|
|
|
|
2022-01-16 22:06:49 +01:00
|
|
|
/* -------------------------------------------- */
|
|
|
|
rollProtection( itemId) {
|
|
|
|
let armor = this.data.items.get( itemId )
|
|
|
|
if ( armor ) {
|
|
|
|
let armorFormula = armor.data.data.properties.soak.formula;
|
|
|
|
let rollArmor = new Roll(armorFormula)
|
|
|
|
rollArmor.roll( {async: false} ).toMessage();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
rollWeaponDamage( itemId) {
|
|
|
|
let weapon = this.data.items.get(itemId )
|
|
|
|
if ( weapon ) {
|
|
|
|
let r = new BoLDefaultRoll( { id: randomID(16), isSuccess: true, mode: "weapon", weapon: weapon, actor: this} )
|
|
|
|
r.setSuccess(true)
|
2022-02-02 09:35:32 +01:00
|
|
|
r.rollDamage()
|
2022-01-16 22:06:49 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-01 00:28:42 +01:00
|
|
|
/* -------------------------------------------- */
|
2021-11-07 20:23:02 +01:00
|
|
|
toggleEquipItem(item) {
|
|
|
|
const equipable = item.data.data.properties.equipable;
|
|
|
|
if(equipable){
|
|
|
|
let itemData = duplicate(item.data);
|
|
|
|
itemData.data.worn = !itemData.data.worn;
|
|
|
|
return item.update(itemData);
|
|
|
|
}
|
|
|
|
}
|
2021-07-08 10:12:12 +02:00
|
|
|
}
|