Foundry v10 version

This commit is contained in:
2022-07-01 15:48:54 +02:00
parent d27b78d1d2
commit cc1964093d
23 changed files with 320 additions and 330 deletions

View File

@ -9,15 +9,14 @@ export class BoLActor extends Actor {
/** @override */
prepareData() {
const actorData = this.data;
if (actorData.type === 'character') {
actorData.type = 'player';
actorData.villainy = false;
if (this.type === 'character') {
this.chartype = 'player';
this.villainy = false;
}
if (actorData.type === 'encounter') {
actorData.type = 'tough';
actorData.villainy = true;
if (this.type === 'encounter') {
this.chartype = 'tough';
this.villainy = true;
}
super.prepareData();
}
@ -25,13 +24,13 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
updateResourcesData() {
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 newVitality = 10 + this.system.attributes.vigor.value + this.system.resources.hp.bonus
if (this.system.resources.hp.max != newVitality) {
this.update({ 'system.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 })
let newPower = 10 + this.system.attributes.mind.value + this.system.resources.power.bonus
if (this.system.resources.power.max != newPower) {
this.update({ 'system.resources.power.max': newPower })
}
}
}
@ -44,25 +43,22 @@ export class BoLActor extends Actor {
}
/* -------------------------------------------- */
get itemData() {
return Array.from(this.data.items.values()).map(i => i.data)
}
get details() {
return this.data.data.details
return this.system.details
}
get attributes() {
return Object.values(this.data.data.attributes)
return Object.values(this.system.attributes)
}
get aptitudes() {
return Object.values(this.data.data.aptitudes)
return Object.values(this.system.aptitudes)
}
/* -------------------------------------------- */
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 }])
if (fo.system.properties.used) {
this.updateEmbeddedDocuments("Item", [{ _id: fo._id, 'system.properties.used': false }])
}
}
}
@ -71,28 +67,28 @@ export class BoLActor extends Actor {
get defenseValue() {
let defMod = 0
let fo = this.getActiveFightOption()
if (fo && fo.data.properties.fightoptiontype == "intrepid") {
if (fo && fo.system.properties.fightoptiontype == "intrepid") {
defMod += -2
}
if (fo && fo.data.properties.fightoptiontype == "fulldefense") {
if (fo && fo.system.properties.fightoptiontype == "fulldefense") {
defMod += 2
}
if (fo && fo.data.properties.fightoptiontype == "twoweaponsdef" && !fo.data.properties.used) {
if (fo && fo.system.properties.fightoptiontype == "twoweaponsdef" && !fo.system.properties.used) {
defMod += 1
this.updateEmbeddedDocuments("Item", [{ _id: fo._id, 'data.properties.used': true }])
this.updateEmbeddedDocuments("Item", [{ _id: fo._id, 'system.properties.used': true }])
}
if (fo && fo.data.properties.fightoptiontype == "defense") {
if (fo && fo.system.properties.fightoptiontype == "defense") {
defMod += 1
}
if (fo && fo.data.properties.fightoptiontype == "attack") {
if (fo && fo.system.properties.fightoptiontype == "attack") {
defMod += -1
}
return this.data.data.aptitudes.def.value + defMod
return this.system.aptitudes.def.value + defMod
}
/* -------------------------------------------- */
getActiveFightOption() {
let it = this.itemData.find(i => i.type === "feature" && i.data.subtype === "fightoption" && i.data.properties.activated)
let it = this.items.find(i => i.type === "feature" && i.system.subtype === "fightoption" && i.system.properties.activated)
if (it) {
return duplicate(it)
}
@ -101,14 +97,14 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
incAttributeXP(key) {
let attr = duplicate(this.data.data.attributes[key])
let attr = duplicate(this.system.attributes[key])
if (attr) {
let nextXP = (attr.value == -1) ? 2 : attr.value + (attr.value + 1)
let xp = duplicate(this.data.data.xp)
let xp = duplicate(this.system.xp)
if (xp.total - xp.spent >= nextXP) {
attr.value += 1
xp.spent += nextXP
this.update({ [`data.attributes.${key}`]: attr, [`data.xp`]: xp })
this.update({ [`system.attributes.${key}`]: attr, [`system.xp`]: xp })
} else {
ui.notifications.warn("Pas assez de points d'expérience !")
}
@ -117,14 +113,14 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
incAptitudeXP(key) {
let apt = duplicate(this.data.data.aptitudes[key])
let apt = duplicate(this.system.aptitudes[key])
if (apt) {
let nextXP = (apt.value == -1) ? 1 : apt.value + 2
let xp = duplicate(this.data.data.xp)
let xp = duplicate(this.system.xp)
if (xp.total - xp.spent >= nextXP) {
apt.value += 1
xp.spent += nextXP
this.update({ [`data.aptitudes.${key}`]: apt, [`data.xp`]: xp })
this.update({ [`system.aptitudes.${key}`]: apt, [`system.xp`]: xp })
} else {
ui.notifications.warn("Pas assez de points d'expérience !")
}
@ -132,15 +128,15 @@ export class BoLActor extends Actor {
}
/* -------------------------------------------- */
incCareerXP(itemId) {
let career = this.data.items.get(itemId)
let career = this.items.get(itemId)
if (career) {
career = duplicate(career)
let nextXP = career.data.rank + 1
let xp = duplicate(this.data.data.xp)
let nextXP = career.system.rank + 1
let xp = duplicate(this.system.xp)
if (xp.total - xp.spent >= nextXP) {
xp.spent += nextXP
this.update({ [`data.xp`]: xp })
this.updateEmbeddedDocuments('Item', [{ _id: career._id, 'data.rank': career.data.rank + 1 }])
this.update({ [`system.xp`]: xp })
this.updateEmbeddedDocuments('Item', [{ _id: career._id, 'system.rank': career.system.rank + 1 }])
} else {
ui.notifications.warn("Pas assez de points d'expérience !")
}
@ -149,18 +145,18 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
async toggleFightOption(itemId) {
let fightOption = this.data.items.get(itemId)
let fightOption = this.items.get(itemId)
let state
let updates = []
if (fightOption) {
fightOption = duplicate(fightOption)
if (fightOption.data.properties.activated) {
if (fightOption.system.properties.activated) {
state = false
} else {
state = true
}
updates.push({ _id: fightOption._id, 'data.properties.activated': state }) // Update the selected one
updates.push({ _id: fightOption._id, 'system.properties.activated': state }) // Update the selected one
await this.updateEmbeddedDocuments("Item", updates) // Apply all changes
// Then notify
ChatMessage.create({
@ -175,13 +171,13 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
get armorMalusValue() { // used for Fight Options
for (let armor of this.armors) {
if (armor.data.properties.armorQuality.includes("light")) {
if (armor.system.properties.armorQuality.includes("light")) {
return 1
}
if (armor.data.properties.armorQuality.includes("medium")) {
if (armor.system.properties.armorQuality.includes("medium")) {
return 2
}
if (armor.data.properties.armorQuality.includes("heavy")) {
if (armor.system.properties.armorQuality.includes("heavy")) {
return 3
}
}
@ -189,112 +185,112 @@ export class BoLActor extends Actor {
}
get resources() {
return Object.values(this.data.data.resources)
return Object.values(this.system.resources)
}
get boons() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "boon");
return this.items.filter(i => i.type === "feature" && i.system.subtype === "boon");
}
get flaws() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "flaw");
return this.items.filter(i => i.type === "feature" && i.system.subtype === "flaw");
}
get careers() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "career");
return duplicate( this.items.filter(i => i.type === "feature" && i.system.subtype === "career") || [])
}
get origins() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "origin");
return this.items.filter(i => i.type === "feature" && i.system.subtype === "origin");
}
get races() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "race");
return this.items.filter(i => i.type === "feature" && i.system.subtype === "race");
}
get languages() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "language")
return this.items.filter(i => i.type === "feature" && i.system.subtype === "language")
}
get fightoptions() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "fightoption")
return this.items.filter(i => i.type === "feature" && i.system.subtype === "fightoption")
}
get godsfaith() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "godsfaith")
return this.items.filter(i => i.type === "feature" && i.system.subtype === "godsfaith")
}
get features() {
return this.itemData.filter(i => i.type === "feature")
return this.items.filter(i => i.type === "feature")
}
get equipment() {
return this.itemData.filter(i => i.type === "item")
return this.items.filter(i => i.type === "item")
}
get equipmentCreature() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && (( i.data.subtype === "weapon" && i.data.properties.natural === true) || (i.data.subtype === "armor")) )
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && (( i.system.subtype === "weapon" && i.system.properties.natural === true) || (i.system.subtype === "armor")) )
}
get armors() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "armor");
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "armor");
}
get helms() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "helm");
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "helm");
}
get shields() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "shield");
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "shield");
}
get weapons() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "weapon");
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "weapon");
}
get protections() {
return this.armors.concat(this.helms).concat(this.shields)
}
get spells() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "spell");
return this.items.filter(i => i.type === "item" && i.system.category === "spell");
}
get alchemy() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "alchemy");
return this.items.filter(i => i.type === "item" && i.system.category === "alchemy");
}
get melee() {
return this.weapons.filter(i => i.data.properties.melee === true);
return this.weapons.filter(i => i.system.properties.melee === true);
}
get natural() {
return this.weapons.filter(i => i.data.properties.natural === true);
return this.weapons.filter(i => i.system.properties.natural === true);
}
get ranged() {
return this.weapons.filter(i => i.data.properties.ranged === true);
return this.weapons.filter(i => i.system.properties.ranged === true);
}
get containers() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "container");
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "container");
}
get treasure() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "currency");
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "currency");
}
get vehicles() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "vehicle");
return this.items.filter(i => i.type === "item" && i.system.category === "vehicle");
}
get ammos() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "ammunition");
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.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"));
return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && (i.system.subtype === "other" || i.system.subtype === "container" || i.system.subtype === "scroll" || i.system.subtype === "jewel"));
}
get bonusBoons() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "boon" && i.data.properties.isbonusdice);
return this.items.filter(i => i.type === "feature" && i.system.subtype === "boon" && i.system.properties.isbonusdice);
}
get malusFlaws() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "flaw" && i.data.properties.ismalusdice);
return this.items.filter(i => i.type === "feature" && i.system.subtype === "flaw" && i.system.properties.ismalusdice);
}
isSorcerer() {
if (this.careers.find(item => item.data.properties.sorcerer == true))
if (this.careers.find(item => item.system.properties.sorcerer == true))
return true
return false
}
isAlchemist() {
if (this.careers.find(item => item.data.properties.alchemist == true))
if (this.careers.find(item => item.system.properties.alchemist == true))
return true
return false
}
isPriest() {
if (this.careers.find(item => item.data.properties.priest == true))
if (this.careers.find(item => item.system.properties.priest == true))
return true
return false
}
@ -304,8 +300,8 @@ export class BoLActor extends Actor {
let armors = this.armors
let ppCostArmor = 0
for (let armor of armors) {
if (armor.data.worn) {
ppCostArmor += Number(armor.data.properties.modifiers.powercost) || 0
if (armor.system.worn) {
ppCostArmor += Number(armor.system.properties.modifiers.powercost) || 0
}
}
return ppCostArmor
@ -314,8 +310,8 @@ export class BoLActor extends Actor {
getArmorAgiMalus() {
let malusAgi = 0
for (let armor of this.protections) {
if (armor.data.worn) {
malusAgi += Number(armor.data.properties.modifiers.agility) || 0
if (armor.system.worn) {
malusAgi += Number(armor.system.properties.modifiers.agility) || 0
}
}
return malusAgi
@ -324,8 +320,8 @@ export class BoLActor extends Actor {
getArmorInitMalus() {
let malusInit = 0
for (let armor of this.protections) {
if (armor.data.worn) {
malusInit += Number(armor.data.properties.modifiers.init) || 0
if (armor.system.worn) {
malusInit += Number(armor.system.properties.modifiers.init) || 0
}
}
return malusInit
@ -333,7 +329,7 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
spendPowerPoint(ppCost) {
let newPP = this.data.data.resources.power.value - ppCost
let newPP = this.system.resources.power.value - ppCost
newPP = (newPP < 0) ? 0 : newPP
this.update({ 'data.resources.power.value': newPP })
return newPP
@ -341,7 +337,7 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
resetAlchemyStatus(alchemyId) {
let alchemy = this.data.items.get(alchemyId)
let alchemy = this.items.get(alchemyId)
if (alchemy) {
this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'data.properties.pccurrent': 0 }])
}
@ -349,14 +345,14 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
async spendAlchemyPoint(alchemyId, pcCost) {
let alchemy = this.data.items.get(alchemyId)
let alchemy = this.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
if (this.system.resources.alchemypoints.value >= pcCost) {
let newPC = this.system.resources.alchemypoints.value - pcCost
newPC = (newPC < 0) ? 0 : newPC
this.update({ 'data.resources.alchemypoints.value': newPC })
newPC = alchemy.data.data.properties.pccurrent + pcCost
newPC = alchemy.system.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 !")
@ -366,17 +362,17 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
getAlchemistBonus() {
let sorcerer = this.careers.find(item => item.data.properties.alchemist == true)
let sorcerer = this.careers.find(item => item.system.properties.alchemist == true)
if (sorcerer) {
return sorcerer.data.rank
return sorcerer.system.rank
}
return 0;
}
/*-------------------------------------------- */
getSorcererBonus() {
let sorcerer = this.careers.find(item => item.data.properties.sorcerer == true)
let sorcerer = this.careers.find(item => item.system.properties.sorcerer == true)
if (sorcerer) {
return sorcerer.data.rank
return sorcerer.system.rank
}
return 0;
}
@ -384,10 +380,10 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
heroReroll() {
if (this.type == 'character') {
return this.data.data.resources.hero.value > 0;
return this.system.resources.hero.value > 0;
} else {
if (this.data.data.type == 'adversary') {
return this.data.data.resources.hero.value > 0;
if (this.system.type == 'adversary') {
return this.system.resources.hero.value > 0;
}
}
return false
@ -396,17 +392,17 @@ export class BoLActor extends Actor {
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
resources['hp'] = this.system.resources.hp;
if (this.system.type != 'base') {
resources['faith'] = this.system.resources.faith
resources['power'] = this.system.resources.power
}
if (this.data.data.type == 'adversary') {
resources['hero'] = duplicate(this.data.data.resources.hero)
if (this.system.type == 'adversary') {
resources['hero'] = duplicate(this.system.resources.hero)
resources['hero'].label = "BOL.resources.villainy"
}
} else {
resources = this.data.data.resources;
resources = this.system.resources;
}
return resources
}
@ -532,13 +528,13 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
buildRollList() {
let rolls = []
for (let key in this.data.data.attributes) {
let attr = this.data.data.attributes[key]
for (let key in this.system.attributes) {
let attr = this.system.attributes[key]
rolls.push({ key: key, value: attr.value, name: attr.label, type: "attribute" })
}
for (let key in this.data.data.aptitudes) {
for (let key in this.system.aptitudes) {
if (key != "def") {
let apt = this.data.data.aptitudes[key]
let apt = this.system.aptitudes[key]
rolls.push({ key: key, value: apt.value, name: apt.label, type: "aptitude" })
}
}
@ -554,13 +550,13 @@ export class BoLActor extends Actor {
async manageHealthState() {
let hpID = "lastHP" + this.id
let lastHP = await this.getFlag("world", hpID)
if (lastHP != this.data.data.resources.hp.value && game.user.isGM ) { // Only GM sends this
await this.setFlag("world", hpID, this.data.data.resources.hp.value)
if (this.data.data.resources.hp.value <= 0) {
if (lastHP != this.system.resources.hp.value && game.user.isGM ) { // Only GM sends this
await this.setFlag("world", hpID, this.system.resources.hp.value)
if (this.system.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, img: this.img, hp: this.data.data.resources.hp.value })
content: await renderTemplate('systems/bol/templates/chat/chat-vitality-zero.hbs', { name: this.name, img: this.img, hp: this.system.resources.hp.value })
})
}
}
@ -568,46 +564,46 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
registerInit(initScore, isCritical, isFumble) {
this.update({ 'data.combat.lastinit': initScore, 'data.combat.iscritical': isCritical, 'data.combat.isfumble': isFumble })
this.update({ 'system.combat.lastinit': initScore, 'system.combat.iscritical': isCritical, 'system.combat.isfumble': isFumble })
}
/*-------------------------------------------- */
getLastInitData() {
return this.data.data.combat
return this.system.combat
}
/*-------------------------------------------- */
async subHeroPoints(nb) {
let newHeroP = this.data.data.resources.hero.value - nb;
let newHeroP = this.system.resources.hero.value - nb;
newHeroP = (newHeroP < 0) ? 0 : newHeroP;
await this.update({ 'data.resources.hero.value': newHeroP });
await this.update({ 'system.resources.hero.value': newHeroP });
}
/*-------------------------------------------- */
async sufferDamage(damage) {
let newHP = this.data.data.resources.hp.value - damage
await this.update({ 'data.resources.hp.value': newHP })
let newHP = this.system.resources.hp.value - damage
await this.update({ 'system.resources.hp.value': newHP })
}
/* -------------------------------------------- */
getArmorFormula() {
let protectWorn = this.protections.filter(item => item.data.worn)
let protectWorn = this.protections.filter(item => item.system.worn)
let formula = ""
for (let protect of protectWorn) {
if (protect.data.subtype == 'helm') {
if (protect.system.subtype == 'helm') {
formula += "+1"
} else if (protect.data.subtype == 'armor') {
} else if (protect.system.subtype == 'armor') {
if (BoLUtility.getRollArmor()) {
if (!protect.data.properties.soak.formula || protect.data.properties.soak.formula == "") {
if (!protect.system.properties.soak.formula || protect.system.properties.soak.formula == "") {
ui.notifications.warn(`L'armure ${protect.name} n'a pas de formule pour la protection !`)
} else {
formula += "+" + " max(" + protect.data.properties.soak.formula +",0)"
formula += "+" + " max(" + protect.system.properties.soak.formula +",0)"
}
} else {
if (protect.data.properties.soak.value == undefined) {
if (protect.system.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
formula += "+ " + protect.system.properties.soak.value
}
}
}
@ -618,9 +614,9 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
rollProtection(itemId) {
let armor = duplicate(this.data.items.get(itemId))
let armor = duplicate(this.items.get(itemId))
if (armor) {
let armorFormula = "max("+armor.data.properties.soak.formula + ", 0)"
let armorFormula = "max("+armor.system.properties.soak.formula + ", 0)"
let rollArmor = new Roll(armorFormula)
rollArmor.roll({ async: false }).toMessage()
}
@ -628,7 +624,7 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
rollWeaponDamage(itemId) {
let weapon = duplicate(this.data.items.get(itemId))
let weapon = duplicate(this.system.items.get(itemId))
if (weapon) {
let r = new BoLDefaultRoll({ id: randomID(16), isSuccess: true, mode: "weapon", weapon: weapon, actorId: this.id, actor: this })
r.setSuccess(true)
@ -638,10 +634,10 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
toggleEquipItem(item) {
const equipable = item.data.data.properties.equipable;
const equipable = item.system.properties.equipable;
if (equipable) {
let itemData = duplicate(item.data);
itemData.data.worn = !itemData.data.worn;
let itemData = duplicate(item);
itemData.system.worn = !itemData.system.worn;
return item.update(itemData);
}
}