automatically calculate base combat values
This commit is contained in:
parent
a020cb7403
commit
ecfbe9fa2a
15 changed files with 195 additions and 27 deletions
|
@ -1,6 +1,6 @@
|
|||
import { ModifiableData } from "../common/common-data";
|
||||
import { DS4Item } from "../item/item";
|
||||
import { DS4ItemDataType, ItemType } from "../item/item-data";
|
||||
import { DS4Armor, DS4ItemDataType, DS4Shield, ItemType } from "../item/item-data";
|
||||
import { DS4ActorDataType } from "./actor-data";
|
||||
|
||||
export class DS4Actor extends Actor<DS4ActorDataType, DS4ItemDataType, DS4Item> {
|
||||
|
@ -15,12 +15,7 @@ export class DS4Actor extends Actor<DS4ActorDataType, DS4ItemDataType, DS4Item>
|
|||
const traits = data.data.traits;
|
||||
Object.values(traits).forEach((trait: ModifiableData<number>) => (trait.total = trait.base + trait.mod));
|
||||
|
||||
const combatValues = data.data.combatValues;
|
||||
Object.values(combatValues).forEach(
|
||||
(combatValue: ModifiableData<number>) => (combatValue.total = combatValue.base + combatValue.mod),
|
||||
);
|
||||
|
||||
combatValues.hitPoints.max = combatValues.hitPoints.total;
|
||||
this._prepareCombatValues();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -55,4 +50,44 @@ export class DS4Actor extends Actor<DS4ActorDataType, DS4ItemDataType, DS4Item>
|
|||
canOwnItemType(itemType: ItemType): boolean {
|
||||
return this.ownableItemTypes.includes(itemType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepares the combat values of the actor.
|
||||
*/
|
||||
private _prepareCombatValues(): void {
|
||||
const data = this.data.data;
|
||||
const armorValueOfEquippedItems = this._calculateArmorValueOfEquippedItems();
|
||||
data.combatValues.hitPoints.base =
|
||||
(data.attributes.body.total ?? 0) + (data.traits.constitution.total ?? 0) + 10;
|
||||
|
||||
data.combatValues.defense.base =
|
||||
(data.attributes.body.total ?? 0) + (data.traits.constitution.total ?? 0) + armorValueOfEquippedItems;
|
||||
data.combatValues.initiative.base = (data.attributes.mobility.total ?? 0) + (data.traits.agility.total ?? 0);
|
||||
data.combatValues.movement.base = (data.attributes.mobility.total ?? 0) / 2 + 1;
|
||||
data.combatValues.meleeAttack.base = (data.attributes.body.total ?? 0) + (data.traits.strength.total ?? 0);
|
||||
data.combatValues.rangedAttack.base =
|
||||
(data.attributes.mobility.total ?? 0) + (data.traits.dexterity.total ?? 0);
|
||||
data.combatValues.spellcasting.base =
|
||||
(data.attributes.mind.total ?? 0) + (data.traits.aura.total ?? 0) - armorValueOfEquippedItems;
|
||||
data.combatValues.targetedSpellcasting.base =
|
||||
(data.attributes.mind.total ?? 0) + (data.traits.dexterity.total ?? 0) - armorValueOfEquippedItems;
|
||||
|
||||
Object.values(data.combatValues).forEach(
|
||||
(combatValue: ModifiableData<number>) => (combatValue.total = combatValue.base + combatValue.mod),
|
||||
);
|
||||
|
||||
data.combatValues.hitPoints.max = data.combatValues.hitPoints.total;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the total armor value of all equipped items.
|
||||
*/
|
||||
private _calculateArmorValueOfEquippedItems(): number {
|
||||
return this.items
|
||||
.filter((item) => ["armor", "shield"].includes(item.type))
|
||||
.map((item) => item.data.data as DS4Armor | DS4Shield)
|
||||
.filter((itemData) => itemData.equipped)
|
||||
.map((itemData) => itemData.armorValue)
|
||||
.reduce((a, b) => a + b, 0);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ export class DS4ActorSheet extends ActorSheet<DS4ActorDataType, DS4Actor, DS4Ite
|
|||
classes: ["ds4", "sheet", "actor"],
|
||||
width: 745,
|
||||
height: 600,
|
||||
scrollY: [".sheet-body"],
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue