diff --git a/mgt2.bundle.js b/mgt2.bundle.js
index fcfd495..cb7db94 100644
--- a/mgt2.bundle.js
+++ b/mgt2.bundle.js
@@ -1,2694 +1,3129 @@
-const fields = foundry.data.fields;
-class CharacterData extends foundry.abstract.TypeDataModel {
- static defineSchema() {
- return {
- name: new fields.StringField({ required: false, blank: false, trim: true }),
- life: new fields.SchemaField({
- value: new fields.NumberField({ required: false, initial: 0, integer: true }),
- max: new fields.NumberField({ required: true, initial: 0, integer: true })
- }),
- personal: new fields.SchemaField({
- title: new fields.StringField({ required: false, blank: true, trim: true }),
- species: new fields.StringField({ required: false, blank: true, trim: true }),
- speciesText: new fields.SchemaField({
- description: new fields.StringField({ required: false, blank: true, trim: true, nullable: true }),
- descriptionLong: new fields.HTMLField({ required: false, blank: true, trim: true })
- }),
- age: new fields.StringField({ required: false, blank: true, trim: true }),
- gender: new fields.StringField({ required: false, blank: true, trim: true }),
- pronouns: new fields.StringField({ required: false, blank: true, trim: true }),
- homeworld: new fields.StringField({ required: false, blank: true, trim: true }),
- ucp: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
- traits: new fields.ArrayField(
- new fields.SchemaField({
- name: new fields.StringField({ required: true, blank: true, trim: true }),
- description: new fields.StringField({ required: false, blank: true, trim: true })
- })
- )
- }),
- biography: new fields.HTMLField({ required: false, blank: true, trim: true }),
- characteristics: new fields.SchemaField({
- strength: createCharacteristicField(true, true),
- dexterity: createCharacteristicField(true, true),
- endurance: createCharacteristicField(true, true),
- intellect: createCharacteristicField(true, false),
- education: createCharacteristicField(true, false),
- social: createCharacteristicField(true, false),
- morale: createCharacteristicField(true, false),
- luck: createCharacteristicField(true, false),
- sanity: createCharacteristicField(true, false),
- charm: createCharacteristicField(true, false),
- psionic: createCharacteristicField(true, false),
- other: createCharacteristicField(true, false)
- }),
- health: new fields.SchemaField({
- radiations: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true })
- }),
- study: new fields.SchemaField({
- skill: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
- total: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true }),
- completed: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true })
- }),
- finance: new fields.SchemaField({
- pension: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- credits: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- cashOnHand: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- debt: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- livingCost: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- monthlyShipPayments: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- notes: new fields.StringField({ required: false, blank: true, trim: true, initial: "" })
- }),
- containerView: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
- containerDropIn: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
- notes: new fields.HTMLField({ required: false, blank: true, trim: true }),
- inventory: new fields.SchemaField({
- armor: new fields.NumberField({ required: true, initial: 0, integer: true }),
- weight: new fields.NumberField({ required: true, initial: 0, min: 0, integer: false }),
- encumbrance: new fields.SchemaField({
- normal: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- heavy: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true })
- })
- }),
- states: new fields.SchemaField({
- encumbrance: new fields.BooleanField({ required: false, initial: false }),
- fatigue: new fields.BooleanField({ required: false, initial: false }),
- unconscious: new fields.BooleanField({ required: false, initial: false }),
- surgeryRequired: new fields.BooleanField({ required: false, initial: false })
- }),
- config: new fields.SchemaField({
- psionic: new fields.BooleanField({ required: false, initial: true }),
- initiative: new fields.StringField({ required: false, blank: true, initial: "dexterity" }),
- damages: new fields.SchemaField({
- rank1: new fields.StringField({ required: false, blank: true, initial: "strength" }),
- rank2: new fields.StringField({ required: false, blank: true, initial: "dexterity" }),
- rank3: new fields.StringField({ required: false, blank: true, initial: "endurance" })
- })
- })
- };
- }
-}
-class VehiculeData extends foundry.abstract.TypeDataModel {
- static defineSchema() {
- return {
- name: new fields.StringField({ required: false, blank: false, trim: true }),
- skillId: new fields.StringField({ required: false, initial: "", blank: true, trim: true }),
- speed: new fields.SchemaField({
- cruise: new fields.StringField({ required: false, initial: "Slow", blank: true }),
- maximum: new fields.StringField({ required: false, initial: "Medium", blank: true })
- }),
- agility: new fields.NumberField({ required: false, min: 0, integer: true }),
- crew: new fields.NumberField({ required: false, min: 0, integer: true }),
- passengers: new fields.NumberField({ required: false, min: 0, integer: true }),
- cargo: new fields.NumberField({ required: false, min: 0, integer: false }),
- //hull
- life: new fields.SchemaField({
- value: new fields.NumberField({ required: true, initial: 0, integer: true }),
- max: new fields.NumberField({ required: true, initial: 0, integer: true })
- }),
- shipping: new fields.NumberField({ required: false, min: 0, integer: true }),
- cost: new fields.NumberField({ required: false, min: 0, integer: true }),
- armor: new fields.SchemaField({
- front: new fields.NumberField({ required: true, initial: 0, integer: true }),
- rear: new fields.NumberField({ required: true, initial: 0, integer: true }),
- sides: new fields.NumberField({ required: true, initial: 0, integer: true })
- }),
- skills: new fields.SchemaField({
- // Skill Level
- autopilot: new fields.NumberField({ required: true, initial: 0, integer: true })
- // Communication Range
- // Navigation
- // Sensors
- // Camouflage / Recon
- // Stealth
- })
- // config: new fields.SchemaField({
- // })
- };
- }
-}
-class ItemBaseData extends foundry.abstract.TypeDataModel {
- static defineSchema() {
- const fields2 = foundry.data.fields;
- const schema = {
- //name: new fields.StringField({ required: true, blank: true, trim: true, nullable: true }),
- description: new fields2.StringField({ required: false, blank: true, trim: true, nullable: true }),
- //type: new fields.StringField({ required: false, blank: false }),
- subType: new fields2.StringField({ required: false, blank: false, nullable: true })
- };
- return schema;
- }
-}
-class PhysicalItemData extends ItemBaseData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.quantity = new fields.NumberField({ required: true, initial: 1, min: 0, integer: true });
- schema.weight = new fields.NumberField({ required: true, initial: 0, min: 0, integer: false });
- schema.weightless = new fields.BooleanField({ required: false, initial: false });
- schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });
- schema.tl = new fields.StringField({ required: true, blank: false, initial: "TL12" });
- schema.container = new fields.SchemaField({
- //inContainer: new fields.BooleanField({ required: false, initial: false }),
- id: new fields.StringField({ required: false, blank: true })
- });
- schema.roll = new fields.SchemaField({
- characteristic: new fields.StringField({ required: false, blank: true, trim: true }),
- skill: new fields.StringField({ required: false, blank: true, trim: true }),
- difficulty: new fields.StringField({ required: false, blank: true, trim: true })
- });
- schema.trash = new fields.BooleanField({ required: false, initial: false });
- return schema;
- }
-}
-class ItemData extends PhysicalItemData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.subType.initial = "loot";
- schema.software = new fields.SchemaField({
- bandwidth: new fields.NumberField({ required: false, initial: 0, min: 0, max: 10, integer: true }),
- effect: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
- computerId: new fields.StringField({ required: false, blank: true, initial: "" })
- });
- return schema;
- }
-}
-class EquipmentData extends PhysicalItemData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.equipped = new fields.BooleanField({ required: false, initial: false });
- schema.augment = new fields.SchemaField({
- improvement: new fields.StringField({ required: false, blank: true, trim: true })
- });
- schema.subType.initial = "equipment";
- return schema;
- }
-}
-class DiseaseData extends ItemBaseData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.subType.initial = "disease";
- schema.difficulty = new fields.StringField({ required: true, initial: "Average" });
- schema.damage = new fields.StringField({ required: false, blank: true });
- schema.interval = new fields.StringField({ required: false, blank: true });
- return schema;
- }
-}
-class CareerData extends ItemBaseData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.difficulty = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });
- schema.damage = new fields.StringField({ required: false, blank: true });
- schema.interval = new fields.StringField({ required: false, blank: true });
- schema.assignment = new fields.StringField({ required: false, blank: true });
- schema.terms = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.rank = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.events = new fields.ArrayField(
- new fields.SchemaField({
- age: new fields.NumberField({ required: false, integer: true }),
- description: new fields.StringField({ required: false, blank: true, trim: true })
- })
- );
- return schema;
- }
-}
-class TalentData extends ItemBaseData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.subType.initial = "skill";
- schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });
- schema.level = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });
- schema.skill = new fields.SchemaField({
- speciality: new fields.StringField({ required: false, blank: true, trim: true }),
- reduceEncumbrance: new fields.BooleanField({ required: false, initial: false })
- });
- schema.psionic = new fields.SchemaField({
- reach: new fields.StringField({ required: false, blank: true, trim: true }),
- cost: new fields.NumberField({ required: false, initial: 1, min: 0, integer: true }),
- duration: new fields.StringField({ required: false, blank: true, trim: true }),
- durationUnit: new fields.StringField({ required: false })
- });
- schema.roll = new fields.SchemaField({
- characteristic: new fields.StringField({ required: false, blank: true, trim: true }),
- skill: new fields.StringField({ required: false, blank: true, trim: true }),
- difficulty: new fields.StringField({ required: false, blank: true, trim: true })
- });
- return schema;
- }
-}
-class ContactData extends ItemBaseData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.subType.initial = "skill";
- schema.cost = new fields.NumberField({ required: true, initial: 1, min: 0, integer: true });
- schema.skill = new fields.SchemaField({
- speciality: new fields.StringField({ required: false, blank: true, trim: true }),
- characteristic: new fields.StringField({ required: false, blank: true, trim: true })
- });
- schema.status = new fields.StringField({ required: false, blank: true, trim: true, initial: "Alive" });
- schema.attitude = new fields.StringField({ required: false, blank: true, trim: true, initial: "Unknow" });
- schema.relation = new fields.StringField({ required: false, blank: true, trim: true, initial: "Contact" });
- schema.title = new fields.StringField({ required: false, blank: true, trim: true });
- schema.nickname = new fields.StringField({ required: false, blank: true, trim: true });
- schema.species = new fields.StringField({ required: false, blank: true, trim: true });
- schema.gender = new fields.StringField({ required: false, blank: true, trim: true });
- schema.pronouns = new fields.StringField({ required: false, blank: true, trim: true });
- schema.homeworld = new fields.StringField({ required: false, blank: true, trim: true });
- schema.location = new fields.StringField({ required: false, blank: true, trim: true });
- schema.occupation = new fields.StringField({ required: false, blank: true, trim: true });
- schema.notes = new fields.HTMLField({ required: false, blank: true, trim: true });
- return schema;
- }
-}
-class WeaponData extends PhysicalItemData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.equipped = new fields.BooleanField({ required: false, initial: false });
- schema.range = new fields.SchemaField({
- isMelee: new fields.BooleanField({ required: false, initial: false }),
- value: new fields.NumberField({ required: false, integer: true, nullable: true }),
- unit: new fields.StringField({ required: false, blank: true, nullable: true })
- }), //schema.tons = new fields.NumberField({ required: false, initial: 0, min: 0, integer: false });
- schema.damage = new fields.StringField({ required: false, blank: true, trim: true });
- schema.magazine = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.magazineCost = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.traits = new fields.ArrayField(
- new fields.SchemaField({
- name: new fields.StringField({ required: true, blank: true, trim: true }),
- description: new fields.StringField({ required: false, blank: true, trim: true })
- })
- );
- schema.options = new fields.ArrayField(
- new fields.SchemaField({
- name: new fields.StringField({ required: true, blank: true, trim: true }),
- description: new fields.StringField({ required: false, blank: true, trim: true })
- })
- );
- return schema;
- }
-}
-class ArmorData extends PhysicalItemData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.equipped = new fields.BooleanField({ required: false, initial: false });
- schema.radiations = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.protection = new fields.StringField({ required: false, blank: false, trim: true });
- schema.requireSkill = new fields.StringField({ required: false, blank: false });
- schema.requireSkillLevel = new fields.NumberField({ required: false, min: 0, integer: true });
- schema.powered = new fields.BooleanField({ required: false, initial: false });
- schema.options = new fields.ArrayField(
- new fields.SchemaField({
- name: new fields.StringField({ required: true, blank: true, trim: true }),
- description: new fields.StringField({ required: false, blank: true, trim: true })
- })
- );
- return schema;
- }
-}
-class ComputerData extends PhysicalItemData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.processing = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.processingUsed = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.overload = new fields.BooleanField({ required: false, initial: false });
- schema.options = new fields.ArrayField(
- new fields.SchemaField({
- name: new fields.StringField({ required: true, blank: true, trim: true }),
- description: new fields.StringField({ required: false, blank: true, trim: true })
- })
- );
- return schema;
- }
-}
-class SpeciesData extends foundry.abstract.TypeDataModel {
- static defineSchema() {
- const fields2 = foundry.data.fields;
- const schema = {
- description: new fields2.StringField({ required: false, blank: true, trim: true, nullable: true }),
- descriptionLong: new fields2.HTMLField({ required: false, blank: true, trim: true }),
- traits: new fields2.ArrayField(
- new fields2.SchemaField({
- name: new fields2.StringField({ required: true, blank: true, trim: true }),
- description: new fields2.StringField({ required: false, blank: true, trim: true })
- })
- ),
- modifiers: new fields2.ArrayField(
- new fields2.SchemaField({
- characteristic: new fields2.StringField({ required: false, blank: true, trim: true }),
- value: new fields2.NumberField({ required: false, integer: true, nullable: true })
- })
- )
- };
- return schema;
- }
-}
-class ItemContainerData extends ItemBaseData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.onHand = new fields.BooleanField({ required: false, initial: false });
- schema.location = new fields.StringField({ required: false, blank: true, trim: true });
- schema.count = new fields.NumberField({ required: false, initial: 0, integer: true });
- schema.weight = new fields.NumberField({ required: false, initial: 0, integer: false });
- schema.weightless = new fields.BooleanField({ required: false, initial: false });
- schema.locked = new fields.BooleanField({ required: false, initial: false });
- schema.lockedDescription = new fields.StringField({ required: false, blank: true, trim: true, nullable: true });
- return schema;
- }
-}
+const fields$d = foundry.data.fields;
+
function createCharacteristicField(show = true, showMax = false) {
- return new fields.SchemaField({
- value: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- max: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true }),
- dm: new fields.NumberField({ required: false, initial: 0, integer: true }),
- show: new fields.BooleanField({ required: false, initial: show }),
- showMax: new fields.BooleanField({ required: false, initial: showMax })
- });
+ return new fields$d.SchemaField({
+ value: new fields$d.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ max: new fields$d.NumberField({ required: false, initial: 0, min: 0, integer: true }),
+ dm: new fields$d.NumberField({ required: false, initial: 0, integer: true }),
+ show: new fields$d.BooleanField({ required: false, initial: show }),
+ showMax: new fields$d.BooleanField({ required: false, initial: showMax })
+ });
+}
+
+class ItemBaseData extends foundry.abstract.TypeDataModel {
+ static defineSchema() {
+ return {
+ description: new fields$d.StringField({ required: false, blank: true, trim: true, nullable: true }),
+ subType: new fields$d.StringField({ required: false, blank: false, nullable: true })
+ };
+ }
+}
+
+class PhysicalItemData extends ItemBaseData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.quantity = new fields$d.NumberField({ required: true, initial: 1, min: 0, integer: true });
+ schema.weight = new fields$d.NumberField({ required: true, initial: 0, min: 0, integer: false });
+ schema.weightless = new fields$d.BooleanField({ required: false, initial: false });
+ schema.cost = new fields$d.NumberField({ required: true, initial: 0, min: 0, integer: true });
+ schema.tl = new fields$d.StringField({ required: true, blank: false, initial: "TL12" });
+ schema.container = new fields$d.SchemaField({
+ id: new fields$d.StringField({ required: false, blank: true })
+ });
+ schema.roll = new fields$d.SchemaField({
+ characteristic: new fields$d.StringField({ required: false, blank: true, trim: true }),
+ skill: new fields$d.StringField({ required: false, blank: true, trim: true }),
+ difficulty: new fields$d.StringField({ required: false, blank: true, trim: true })
+ });
+ schema.trash = new fields$d.BooleanField({ required: false, initial: false });
+ return schema;
+ }
+}
+
+const fields$c = foundry.data.fields;
+
+class CharacterData extends foundry.abstract.TypeDataModel {
+
+ static defineSchema() {
+ return {
+ name: new fields$c.StringField({ required: false, blank: false, trim: true }),
+ life: new fields$c.SchemaField({
+ value: new fields$c.NumberField({ required: false, initial: 0, integer: true }),
+ max: new fields$c.NumberField({ required: true, initial: 0, integer: true })
+ }),
+ personal: new fields$c.SchemaField({
+ title: new fields$c.StringField({ required: false, blank: true, trim: true }),
+ species: new fields$c.StringField({ required: false, blank: true, trim: true }),
+ speciesText: new fields$c.SchemaField({
+ description: new fields$c.StringField({ required: false, blank: true, trim: true, nullable: true }),
+ descriptionLong: new fields$c.HTMLField({ required: false, blank: true, trim: true })
+ }),
+ age: new fields$c.StringField({ required: false, blank: true, trim: true }),
+ gender: new fields$c.StringField({ required: false, blank: true, trim: true }),
+ pronouns: new fields$c.StringField({ required: false, blank: true, trim: true }),
+ homeworld: new fields$c.StringField({ required: false, blank: true, trim: true }),
+ ucp: new fields$c.StringField({ required: false, blank: true, trim: true, initial: "" }),
+ traits: new fields$c.ArrayField(
+ new fields$c.SchemaField({
+ name: new fields$c.StringField({ required: true, blank: true, trim: true }),
+ description: new fields$c.StringField({ required: false, blank: true, trim: true })
+ })
+ )
+ }),
+ biography: new fields$c.HTMLField({ required: false, blank: true, trim: true }),
+
+ characteristics: new fields$c.SchemaField({
+ strength: createCharacteristicField(true, true),
+ dexterity: createCharacteristicField(true, true),
+ endurance: createCharacteristicField(true, true),
+ intellect: createCharacteristicField(true, false),
+ education: createCharacteristicField(true, false),
+ social: createCharacteristicField(true, false),
+ morale: createCharacteristicField(true, false),
+ luck: createCharacteristicField(true, false),
+ sanity: createCharacteristicField(true, false),
+ charm: createCharacteristicField(true, false),
+ psionic: createCharacteristicField(true, false),
+ other: createCharacteristicField(true, false)
+ }),
+
+ health: new fields$c.SchemaField({
+ radiations: new fields$c.NumberField({ required: false, initial: 0, min: 0, integer: true })
+ }),
+ study: new fields$c.SchemaField({
+ skill: new fields$c.StringField({ required: false, blank: true, trim: true, initial: "" }),
+ total: new fields$c.NumberField({ required: false, initial: 0, min: 0, integer: true }),
+ completed: new fields$c.NumberField({ required: false, initial: 0, min: 0, integer: true })
+ }),
+ finance: new fields$c.SchemaField({
+ pension: new fields$c.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ credits: new fields$c.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ cashOnHand: new fields$c.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ debt: new fields$c.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ livingCost: new fields$c.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ monthlyShipPayments: new fields$c.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ notes: new fields$c.StringField({ required: false, blank: true, trim: true, initial: "" })
+ }),
+ containerView: new fields$c.StringField({ required: false, blank: true, trim: true, initial: "" }),
+ containerDropIn: new fields$c.StringField({ required: false, blank: true, trim: true, initial: "" }),
+ notes: new fields$c.HTMLField({ required: false, blank: true, trim: true }),
+
+ inventory: new fields$c.SchemaField({
+ armor: new fields$c.NumberField({ required: true, initial: 0, integer: true }),
+ weight: new fields$c.NumberField({ required: true, initial: 0, min: 0, integer: false }),
+ encumbrance: new fields$c.SchemaField({
+ normal: new fields$c.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ heavy: new fields$c.NumberField({ required: true, initial: 0, min: 0, integer: true })
+ })
+ }),
+ states: new fields$c.SchemaField({
+ encumbrance: new fields$c.BooleanField({ required: false, initial: false }),
+ fatigue: new fields$c.BooleanField({ required: false, initial: false }),
+ unconscious: new fields$c.BooleanField({ required: false, initial: false }),
+ surgeryRequired: new fields$c.BooleanField({ required: false, initial: false })
+ }),
+
+ config: new fields$c.SchemaField({
+ psionic: new fields$c.BooleanField({ required: false, initial: true }),
+ initiative: new fields$c.StringField({ required: false, blank: true, initial: "dexterity" }),
+ damages: new fields$c.SchemaField({
+ rank1: new fields$c.StringField({ required: false, blank: true, initial: "strength" }),
+ rank2: new fields$c.StringField({ required: false, blank: true, initial: "dexterity" }),
+ rank3: new fields$c.StringField({ required: false, blank: true, initial: "endurance" })
+ })
+ })
+ };
+ }
+}
+
+const fields$b = foundry.data.fields;
+
+class VehiculeData extends foundry.abstract.TypeDataModel {
+
+ static defineSchema() {
+ return {
+ name: new fields$b.StringField({ required: false, blank: false, trim: true }),
+ skillId: new fields$b.StringField({ required: false, initial: "", blank: true, trim: true }),
+ speed: new fields$b.SchemaField({
+ cruise: new fields$b.StringField({ required: false, initial: "Slow", blank: true }),
+ maximum: new fields$b.StringField({ required: false, initial: "Medium", blank: true })
+ }),
+ agility: new fields$b.NumberField({ required: false, min: 0, integer: true }),
+ crew: new fields$b.NumberField({ required: false, min: 0, integer: true }),
+ passengers: new fields$b.NumberField({ required: false, min: 0, integer: true }),
+ cargo: new fields$b.NumberField({ required: false, min: 0, integer: false }),
+ life: new fields$b.SchemaField({
+ value: new fields$b.NumberField({ required: true, initial: 0, integer: true }),
+ max: new fields$b.NumberField({ required: true, initial: 0, integer: true })
+ }),
+ shipping: new fields$b.NumberField({ required: false, min: 0, integer: true }),
+ cost: new fields$b.NumberField({ required: false, min: 0, integer: true }),
+ armor: new fields$b.SchemaField({
+ front: new fields$b.NumberField({ required: true, initial: 0, integer: true }),
+ rear: new fields$b.NumberField({ required: true, initial: 0, integer: true }),
+ sides: new fields$b.NumberField({ required: true, initial: 0, integer: true })
+ }),
+ skills: new fields$b.SchemaField({
+ autopilot: new fields$b.NumberField({ required: true, initial: 0, integer: true })
+ })
+ };
+ }
+}
+
+const fields$a = foundry.data.fields;
+
+class ItemData extends PhysicalItemData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.subType.initial = "loot";
+ schema.software = new fields$a.SchemaField({
+ bandwidth: new fields$a.NumberField({ required: false, initial: 0, min: 0, max: 10, integer: true }),
+ effect: new fields$a.StringField({ required: false, blank: true, trim: true, initial: "" }),
+ computerId: new fields$a.StringField({ required: false, blank: true, initial: "" })
+ });
+ return schema;
+ }
+}
+
+const fields$9 = foundry.data.fields;
+
+class EquipmentData extends PhysicalItemData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.equipped = new fields$9.BooleanField({ required: false, initial: false });
+ schema.augment = new fields$9.SchemaField({
+ improvement: new fields$9.StringField({ required: false, blank: true, trim: true })
+ });
+ schema.subType.initial = "equipment"; // augment, clothing, trinket, toolkit, equipment
+ return schema;
+ }
+}
+
+const fields$8 = foundry.data.fields;
+
+class DiseaseData extends ItemBaseData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.subType.initial = "disease"; // disease, poison
+ schema.difficulty = new fields$8.StringField({ required: true, initial: "Average" });
+ schema.damage = new fields$8.StringField({ required: false, blank: true });
+ schema.interval = new fields$8.StringField({ required: false, blank: true });
+ return schema;
+ }
+}
+
+const fields$7 = foundry.data.fields;
+
+class CareerData extends ItemBaseData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.difficulty = new fields$7.NumberField({ required: true, initial: 0, min: 0, integer: true });
+ schema.damage = new fields$7.StringField({ required: false, blank: true });
+ schema.interval = new fields$7.StringField({ required: false, blank: true });
+ schema.assignment = new fields$7.StringField({ required: false, blank: true });
+ schema.terms = new fields$7.NumberField({ required: false, initial: 0, min: 0, integer: true });
+ schema.rank = new fields$7.NumberField({ required: false, initial: 0, min: 0, integer: true });
+ schema.events = new fields$7.ArrayField(
+ new fields$7.SchemaField({
+ age: new fields$7.NumberField({ required: false, integer: true }),
+ description: new fields$7.StringField({ required: false, blank: true, trim: true })
+ })
+ );
+ return schema;
+ }
+}
+
+const fields$6 = foundry.data.fields;
+
+class TalentData extends ItemBaseData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.subType.initial = "skill";
+ schema.cost = new fields$6.NumberField({ required: true, initial: 0, min: 0, integer: true });
+ schema.level = new fields$6.NumberField({ required: true, initial: 0, min: 0, integer: true });
+ schema.skill = new fields$6.SchemaField({
+ speciality: new fields$6.StringField({ required: false, blank: true, trim: true }),
+ reduceEncumbrance: new fields$6.BooleanField({ required: false, initial: false })
+ });
+ schema.psionic = new fields$6.SchemaField({
+ reach: new fields$6.StringField({ required: false, blank: true, trim: true }),
+ cost: new fields$6.NumberField({ required: false, initial: 1, min: 0, integer: true }),
+ duration: new fields$6.StringField({ required: false, blank: true, trim: true }),
+ durationUnit: new fields$6.StringField({ required: false })
+ });
+ schema.roll = new fields$6.SchemaField({
+ characteristic: new fields$6.StringField({ required: false, blank: true, trim: true }),
+ skill: new fields$6.StringField({ required: false, blank: true, trim: true }),
+ difficulty: new fields$6.StringField({ required: false, blank: true, trim: true })
+ });
+ return schema;
+ }
+}
+
+const fields$5 = foundry.data.fields;
+
+class ContactData extends ItemBaseData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.subType.initial = "skill";
+ schema.cost = new fields$5.NumberField({ required: true, initial: 1, min: 0, integer: true });
+ schema.skill = new fields$5.SchemaField({
+ speciality: new fields$5.StringField({ required: false, blank: true, trim: true }),
+ characteristic: new fields$5.StringField({ required: false, blank: true, trim: true })
+ });
+ schema.status = new fields$5.StringField({ required: false, blank: true, trim: true, initial: "Alive" });
+ schema.attitude = new fields$5.StringField({ required: false, blank: true, trim: true, initial: "Unknow" });
+ schema.relation = new fields$5.StringField({ required: false, blank: true, trim: true, initial: "Contact" });
+ schema.title = new fields$5.StringField({ required: false, blank: true, trim: true });
+ schema.nickname = new fields$5.StringField({ required: false, blank: true, trim: true });
+ schema.species = new fields$5.StringField({ required: false, blank: true, trim: true });
+ schema.gender = new fields$5.StringField({ required: false, blank: true, trim: true });
+ schema.pronouns = new fields$5.StringField({ required: false, blank: true, trim: true });
+ schema.homeworld = new fields$5.StringField({ required: false, blank: true, trim: true });
+ schema.location = new fields$5.StringField({ required: false, blank: true, trim: true });
+ schema.occupation = new fields$5.StringField({ required: false, blank: true, trim: true });
+ schema.notes = new fields$5.HTMLField({ required: false, blank: true, trim: true });
+ return schema;
+ }
+}
+
+const fields$4 = foundry.data.fields;
+
+class WeaponData extends PhysicalItemData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.equipped = new fields$4.BooleanField({ required: false, initial: false });
+ schema.range = new fields$4.SchemaField({
+ isMelee: new fields$4.BooleanField({ required: false, initial: false }),
+ value: new fields$4.NumberField({ required: false, integer: true, nullable: true }),
+ unit: new fields$4.StringField({ required: false, blank: true, nullable: true })
+ });
+ schema.damage = new fields$4.StringField({ required: false, blank: true, trim: true });
+ schema.magazine = new fields$4.NumberField({ required: false, initial: 0, min: 0, integer: true });
+ schema.magazineCost = new fields$4.NumberField({ required: false, initial: 0, min: 0, integer: true });
+ schema.traits = new fields$4.ArrayField(
+ new fields$4.SchemaField({
+ name: new fields$4.StringField({ required: true, blank: true, trim: true }),
+ description: new fields$4.StringField({ required: false, blank: true, trim: true })
+ })
+ );
+ schema.options = new fields$4.ArrayField(
+ new fields$4.SchemaField({
+ name: new fields$4.StringField({ required: true, blank: true, trim: true }),
+ description: new fields$4.StringField({ required: false, blank: true, trim: true })
+ })
+ );
+ return schema;
+ }
+}
+
+const fields$3 = foundry.data.fields;
+
+class ArmorData extends PhysicalItemData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.equipped = new fields$3.BooleanField({ required: false, initial: false });
+ schema.radiations = new fields$3.NumberField({ required: false, initial: 0, min: 0, integer: true });
+ schema.protection = new fields$3.StringField({ required: false, blank: false, trim: true });
+ // A Traveller suffers DM-1 to all checks per missing skill level in the required skill.
+ schema.requireSkill = new fields$3.StringField({ required: false, blank: false });
+ schema.requireSkillLevel = new fields$3.NumberField({ required: false, min: 0, integer: true });
+ // Powered armour supports its own weight and is effectively weightless for encumbrance.
+ schema.powered = new fields$3.BooleanField({ required: false, initial: false });
+ schema.options = new fields$3.ArrayField(
+ new fields$3.SchemaField({
+ name: new fields$3.StringField({ required: true, blank: true, trim: true }),
+ description: new fields$3.StringField({ required: false, blank: true, trim: true })
+ })
+ );
+ return schema;
+ }
+}
+
+const fields$2 = foundry.data.fields;
+
+class ComputerData extends PhysicalItemData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.processing = new fields$2.NumberField({ required: false, initial: 0, min: 0, integer: true });
+ schema.processingUsed = new fields$2.NumberField({ required: false, initial: 0, min: 0, integer: true });
+ schema.overload = new fields$2.BooleanField({ required: false, initial: false });
+ schema.options = new fields$2.ArrayField(
+ new fields$2.SchemaField({
+ name: new fields$2.StringField({ required: true, blank: true, trim: true }),
+ description: new fields$2.StringField({ required: false, blank: true, trim: true })
+ })
+ );
+ return schema;
+ }
+}
+
+const fields$1 = foundry.data.fields;
+
+class ItemContainerData extends ItemBaseData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.onHand = new fields$1.BooleanField({ required: false, initial: false });
+ schema.location = new fields$1.StringField({ required: false, blank: true, trim: true });
+ schema.count = new fields$1.NumberField({ required: false, initial: 0, integer: true });
+ schema.weight = new fields$1.NumberField({ required: false, initial: 0, integer: false });
+ schema.weightless = new fields$1.BooleanField({ required: false, initial: false });
+ schema.locked = new fields$1.BooleanField({ required: false, initial: false }); // GM only
+ schema.lockedDescription = new fields$1.StringField({ required: false, blank: true, trim: true, nullable: true });
+ return schema;
+ }
+}
+
+const fields = foundry.data.fields;
+
+class SpeciesData extends foundry.abstract.TypeDataModel {
+ static defineSchema() {
+ return {
+ description: new fields.StringField({ required: false, blank: true, trim: true, nullable: true }),
+ descriptionLong: new fields.HTMLField({ required: false, blank: true, trim: true }),
+ traits: new fields.ArrayField(
+ new fields.SchemaField({
+ name: new fields.StringField({ required: true, blank: true, trim: true }),
+ description: new fields.StringField({ required: false, blank: true, trim: true })
+ })
+ ),
+ modifiers: new fields.ArrayField(
+ new fields.SchemaField({
+ characteristic: new fields.StringField({ required: false, blank: true, trim: true }),
+ value: new fields.NumberField({ required: false, integer: true, nullable: true })
+ })
+ )
+ };
+ }
}
const MGT2 = {};
+
MGT2.MetricRange = Object.freeze({
- meter: "MGT2.MetricRange.meter",
- kilometer: "MGT2.MetricRange.kilometer"
+ meter: "MGT2.MetricRange.meter",
+ kilometer: "MGT2.MetricRange.kilometer"
});
+
MGT2.MetricWeight = Object.freeze({
- kilogram: "MGT2.MetricWeight.kilogram",
- ton: "MGT2.MetricWeight.ton"
+ kilogram: "MGT2.MetricWeight.kilogram",
+ ton: "MGT2.MetricWeight.ton"
});
+
MGT2.Difficulty = Object.freeze({
- NA: "MGT2.Difficulty.NA",
- Simple: "MGT2.Difficulty.Simple",
- Easy: "MGT2.Difficulty.Easy",
- Routine: "MGT2.Difficulty.Routine",
- Average: "MGT2.Difficulty.Average",
- Difficult: "MGT2.Difficulty.Difficult",
- VeryDifficult: "MGT2.Difficulty.VeryDifficult",
- Formidable: "MGT2.Difficulty.Formidable",
- Impossible: "MGT2.Difficulty.Impossible"
+ NA: "MGT2.Difficulty.NA",
+ Simple: "MGT2.Difficulty.Simple",
+ Easy: "MGT2.Difficulty.Easy",
+ Routine: "MGT2.Difficulty.Routine",
+ Average: "MGT2.Difficulty.Average",
+ Difficult: "MGT2.Difficulty.Difficult",
+ VeryDifficult: "MGT2.Difficulty.VeryDifficult",
+ Formidable: "MGT2.Difficulty.Formidable",
+ Impossible: "MGT2.Difficulty.Impossible"
});
+
MGT2.ItemSubType = Object.freeze({
- loot: "MGT2.ItemSubType.loot",
- software: "MGT2.ItemSubType.software"
+ loot: "MGT2.ItemSubType.loot",
+ software: "MGT2.ItemSubType.software"
});
+
MGT2.EquipmentSubType = Object.freeze({
- augment: "MGT2.EquipmentSubType.augment",
- clothing: "MGT2.EquipmentSubType.clothing",
- equipment: "MGT2.EquipmentSubType.equipment",
- trinket: "MGT2.EquipmentSubType.trinket",
- toolkit: "MGT2.EquipmentSubType.toolkit"
+ augment: "MGT2.EquipmentSubType.augment",
+ clothing: "MGT2.EquipmentSubType.clothing",
+ equipment: "MGT2.EquipmentSubType.equipment",
+ trinket: "MGT2.EquipmentSubType.trinket",
+ toolkit: "MGT2.EquipmentSubType.toolkit"
});
+
MGT2.TalentSubType = Object.freeze({
- skill: "MGT2.TalentSubType.skill",
- psionic: "MGT2.TalentSubType.psionic"
+ skill: "MGT2.TalentSubType.skill",
+ psionic: "MGT2.TalentSubType.psionic"
});
+
MGT2.DiseaseSubType = Object.freeze({
- disease: "MGT2.DiseaseSubType.disease",
- poison: "MGT2.DiseaseSubType.poison",
- wound: "MGT2.DiseaseSubType.wound"
+ disease: "MGT2.DiseaseSubType.disease",
+ poison: "MGT2.DiseaseSubType.poison",
+ wound: "MGT2.DiseaseSubType.wound"
});
+
MGT2.PsionicReach = Object.freeze({
- NA: "MGT2.PsionicReach.NA",
- Personal: "MGT2.PsionicReach.Personal",
- Close: "MGT2.PsionicReach.Close",
- Short: "MGT2.PsionicReach.Short",
- Medium: "MGT2.PsionicReach.Medium",
- Long: "MGT2.PsionicReach.Long",
- VeryLong: "MGT2.PsionicReach.VeryLong",
- Distant: "MGT2.PsionicReach.Distant",
- VeryDistant: "MGT2.PsionicReach.VeryDistant",
- Continental: "MGT2.PsionicReach.Continental",
- Planetary: "MGT2.PsionicReach.Planetary"
+ NA: "MGT2.PsionicReach.NA",
+ Personal: "MGT2.PsionicReach.Personal",
+ Close: "MGT2.PsionicReach.Close",
+ Short: "MGT2.PsionicReach.Short",
+ Medium: "MGT2.PsionicReach.Medium",
+ Long: "MGT2.PsionicReach.Long",
+ VeryLong: "MGT2.PsionicReach.VeryLong",
+ Distant: "MGT2.PsionicReach.Distant",
+ VeryDistant: "MGT2.PsionicReach.VeryDistant",
+ Continental: "MGT2.PsionicReach.Continental",
+ Planetary: "MGT2.PsionicReach.Planetary"
});
+
MGT2.ContactRelations = Object.freeze({
- Allie: "MGT2.Contact.Relation.Allie",
- Contact: "MGT2.Contact.Relation.Contact",
- Rival: "MGT2.Contact.Relation.Rival",
- Enemy: "MGT2.Contact.Relation.Enemy"
+ Allie: "MGT2.Contact.Relation.Allie",
+ Contact: "MGT2.Contact.Relation.Contact",
+ Rival: "MGT2.Contact.Relation.Rival",
+ Enemy: "MGT2.Contact.Relation.Enemy"
});
+
MGT2.ContactStatus = Object.freeze({
- Alive: "MGT2.Contact.Status.Alive",
- Unknow: "MGT2.Contact.Status.Unknow",
- Dead: "MGT2.Contact.Status.Dead"
+ Alive: "MGT2.Contact.Status.Alive",
+ Unknow: "MGT2.Contact.Status.Unknow",
+ Dead: "MGT2.Contact.Status.Dead"
});
+
MGT2.Attitudes = Object.freeze({
- Unknow: "MGT2.Contact.Attitude.Unknow",
- Hostile: "MGT2.Contact.Attitude.Hostile",
- Unfriendly: "MGT2.Contact.Attitude.Unfriendly",
- Indifferent: "MGT2.Contact.Attitude.Indifferent",
- Friendly: "MGT2.Contact.Attitude.Friendly",
- Helpful: "MGT2.Contact.Attitude.Helpful",
- Complicated: "MGT2.Contact.Attitude.Complicated"
+ Unknow: "MGT2.Contact.Attitude.Unknow",
+ Hostile: "MGT2.Contact.Attitude.Hostile",
+ Unfriendly: "MGT2.Contact.Attitude.Unfriendly",
+ Indifferent: "MGT2.Contact.Attitude.Indifferent",
+ Friendly: "MGT2.Contact.Attitude.Friendly",
+ Helpful: "MGT2.Contact.Attitude.Helpful",
+ Complicated: "MGT2.Contact.Attitude.Complicated"
});
+
MGT2.Characteristics = Object.freeze({
- strength: "MGT2.Characteristics.strength.name",
- dexterity: "MGT2.Characteristics.dexterity.name",
- endurance: "MGT2.Characteristics.endurance.name",
- intellect: "MGT2.Characteristics.intellect.name",
- education: "MGT2.Characteristics.education.name",
- social: "MGT2.Characteristics.social.name",
- morale: "MGT2.Characteristics.morale.name",
- luck: "MGT2.Characteristics.luck.name",
- sanity: "MGT2.Characteristics.sanity.name",
- charm: "MGT2.Characteristics.charm.name",
- psionic: "MGT2.Characteristics.psionic.name",
- other: "MGT2.Characteristics.other.name"
+ strength: "MGT2.Characteristics.strength.name",
+ dexterity: "MGT2.Characteristics.dexterity.name",
+ endurance: "MGT2.Characteristics.endurance.name",
+ intellect: "MGT2.Characteristics.intellect.name",
+ education: "MGT2.Characteristics.education.name",
+ social: "MGT2.Characteristics.social.name",
+ morale: "MGT2.Characteristics.morale.name",
+ luck: "MGT2.Characteristics.luck.name",
+ sanity: "MGT2.Characteristics.sanity.name",
+ charm: "MGT2.Characteristics.charm.name",
+ psionic: "MGT2.Characteristics.psionic.name",
+ other: "MGT2.Characteristics.other.name"
});
+
MGT2.InitiativeCharacteristics = Object.freeze({
- dexterity: "MGT2.Characteristics.dexterity.name",
- intellect: "MGT2.Characteristics.intellect.name"
+ dexterity: "MGT2.Characteristics.dexterity.name",
+ intellect: "MGT2.Characteristics.intellect.name"
});
+
MGT2.DamageCharacteristics = Object.freeze({
- strength: "MGT2.Characteristics.strength.name",
- dexterity: "MGT2.Characteristics.dexterity.name",
- endurance: "MGT2.Characteristics.endurance.name"
+ strength: "MGT2.Characteristics.strength.name",
+ dexterity: "MGT2.Characteristics.dexterity.name",
+ endurance: "MGT2.Characteristics.endurance.name"
});
+
MGT2.TL = Object.freeze({
- NA: "MGT2.TL.NA",
- Unknow: "MGT2.TL.Unknow",
- NotIdentified: "MGT2.TL.NotIdentified",
- TL00: "MGT2.TL.L00",
- TL01: "MGT2.TL.L01",
- TL02: "MGT2.TL.L02",
- TL03: "MGT2.TL.L03",
- TL04: "MGT2.TL.L04",
- TL05: "MGT2.TL.L05",
- TL06: "MGT2.TL.L06",
- TL07: "MGT2.TL.L07",
- TL08: "MGT2.TL.L08",
- TL09: "MGT2.TL.L09",
- TL10: "MGT2.TL.L10",
- TL11: "MGT2.TL.L11",
- TL12: "MGT2.TL.L12",
- TL13: "MGT2.TL.L13",
- TL14: "MGT2.TL.L14",
- TL15: "MGT2.TL.L15"
+ NA: "MGT2.TL.NA",
+ Unknow: "MGT2.TL.Unknow",
+ NotIdentified: "MGT2.TL.NotIdentified",
+ TL00: "MGT2.TL.L00",
+ TL01: "MGT2.TL.L01",
+ TL02: "MGT2.TL.L02",
+ TL03: "MGT2.TL.L03",
+ TL04: "MGT2.TL.L04",
+ TL05: "MGT2.TL.L05",
+ TL06: "MGT2.TL.L06",
+ TL07: "MGT2.TL.L07",
+ TL08: "MGT2.TL.L08",
+ TL09: "MGT2.TL.L09",
+ TL10: "MGT2.TL.L10",
+ TL11: "MGT2.TL.L11",
+ TL12: "MGT2.TL.L12",
+ TL13: "MGT2.TL.L13",
+ TL14: "MGT2.TL.L14",
+ TL15: "MGT2.TL.L15"
});
+
MGT2.Timeframes = Object.freeze({
- Normal: "MGT2.Timeframes.Normal",
- Slower: "MGT2.Timeframes.Slower",
- Faster: "MGT2.Timeframes.Faster"
+ Normal: "MGT2.Timeframes.Normal",
+ Slower: "MGT2.Timeframes.Slower",
+ Faster: "MGT2.Timeframes.Faster"
});
+
MGT2.SpeedBands = Object.freeze({
- Stoppped: "MGT2.SpeedBands.Stoppped",
- Idle: "MGT2.SpeedBands.Idle",
- VerySlow: "MGT2.SpeedBands.VerySlow",
- Slow: "MGT2.SpeedBands.Slow",
- Medium: "MGT2.SpeedBands.Medium",
- High: "MGT2.SpeedBands.High.",
- Fast: "MGT2.SpeedBands.Fast",
- VeryFast: "MGT2.SpeedBands.VeryFast",
- Subsonic: "MGT2.SpeedBands.Subsonic",
- Hypersonic: "MGT2.SpeedBands.Hypersonic"
+ Stoppped: "MGT2.SpeedBands.Stoppped",
+ Idle: "MGT2.SpeedBands.Idle",
+ VerySlow: "MGT2.SpeedBands.VerySlow",
+ Slow: "MGT2.SpeedBands.Slow",
+ Medium: "MGT2.SpeedBands.Medium",
+ High: "MGT2.SpeedBands.High.",
+ Fast: "MGT2.SpeedBands.Fast",
+ VeryFast: "MGT2.SpeedBands.VeryFast",
+ Subsonic: "MGT2.SpeedBands.Subsonic",
+ Hypersonic: "MGT2.SpeedBands.Hypersonic"
});
+
MGT2.Durations = Object.freeze({
- Seconds: "MGT2.Durations.Seconds",
- Minutes: "MGT2.Durations.Minutes",
- Heures: "MGT2.Durations.Heures"
+ Seconds: "MGT2.Durations.Seconds",
+ Minutes: "MGT2.Durations.Minutes",
+ Heures: "MGT2.Durations.Heures"
});
class ActorCharacter {
- static preCreate($this, data, options, user) {
- $this.updateSource({ prototypeToken: { actorLink: true } });
- }
- static prepareData(actorData) {
- actorData.initiative = this.getInitiative(actorData);
- }
- static getInitiative($this) {
- let c = $this.system.config.initiative;
- return $this.system.characteristics[c].dm;
- }
- static async onDeleteDescendantDocuments($this, parent, collection, documents, ids, options, userId) {
- const toDeleteIds = [];
- const itemToUpdates = [];
- for (let d of documents) {
- if (d.type === "container") {
+ static preCreate($this, data, options, user) {
+ $this.updateSource({ prototypeToken: { actorLink: true } }); // QoL
+ }
+
+ static prepareData(actorData) {
+ actorData.initiative = this.getInitiative(actorData);
+ }
+
+ static getInitiative($this) {
+ let c = $this.system.config.initiative;
+ return $this.system.characteristics[c].dm;
+ }
+
+ static async onDeleteDescendantDocuments($this, parent, collection, documents, ids, options, userId) {
+ const toDeleteIds = [];
+ const itemToUpdates = [];
+
+ for (let d of documents) {
+ if (d.type === "container") {
+ // Delete content
+ for (let item of $this.items) {
+ if (item.system.hasOwnProperty("container") && item.system.container.id === d._id)
+ toDeleteIds.push(item._id);
+ }
+ } else if (d.type === "computer") {
+ // Eject software
+ for (let item of $this.items) {
+ if (item.system.hasOwnProperty("software") && item.system.computerId === d._id) {
+ let clone = foundry.utils.deepClone(item);
+ clone.system.software.computerId = "";
+ itemToUpdates.push(clone);
+ }
+ }
+ }
+ }
+
+ if (toDeleteIds.length > 0)
+ await $this.deleteEmbeddedDocuments("Item", toDeleteIds);
+
+ if (itemToUpdates.length > 0)
+ await $this.updateEmbeddedDocuments('Item', itemToUpdates);
+
+ await this.recalculateWeight($this);
+ }
+
+ static async onUpdateDescendantDocuments($this, parent, collection, documents, changes, options, userId) {
+ await this.calculEncumbranceAndWeight($this, parent, collection, documents, changes, options, userId);
+ await this.calculComputers($this, parent, collection, documents, changes, options, userId);
+ }
+
+ static async calculComputers($this, parent, collection, documents, changes, options, userId) {
+ let change;
+ let i = 0;
+
+ let recalculProcessing = false;
+ for (let d of documents) {
+ if (changes[i].hasOwnProperty("system")) {
+ change = changes[i];
+ if (d.type === "item" && d.system.subType === "software") {
+ if (change.system.software.hasOwnProperty("bandwidth") || change.system.software.hasOwnProperty("computerId")) {
+ recalculProcessing = true;
+ break;
+ }
+ }
+ }
+ }
+
+ if (recalculProcessing) {
+ let updatedComputers = [];
+ let computerChanges = {};
+ let computers = [];
+
+ for (let item of $this.items) {
+ if (item.system.trash === true) continue;
+ if (item.type === "computer") {
+ computers.push(item);
+ computerChanges[item._id] = { processingUsed: 0 };
+ }
+ }
+
+ for (let item of $this.items) {
+ if (item.type !== "item" && item.system.subType !== "software") continue;
+
+ if (item.system.software.hasOwnProperty("computerId") && item.system.software.computerId !== "") {
+ computerChanges[item.system.software.computerId].processingUsed += item.system.software.bandwidth;
+ }
+ }
+
+ for (let computer of computers) {
+ let newProcessingUsed = computerChanges[computer._id].processingUsed;
+ if (computer.system.processingUsed !== newProcessingUsed) {
+ const cloneComputer = foundry.utils.deepClone($this.getEmbeddedDocument("Item", computer._id));
+ cloneComputer.system.processingUsed = newProcessingUsed;
+ cloneComputer.system.overload = cloneComputer.system.processingUsed > cloneComputer.system.processing;
+ updatedComputers.push(cloneComputer);
+ }
+ }
+
+ if (updatedComputers.length > 0) {
+ await $this.updateEmbeddedDocuments('Item', updatedComputers);
+ }
+ }
+ }
+
+ static async calculEncumbranceAndWeight($this, parent, collection, documents, changes, options, userId) {
+ let recalculEncumbrance = false;
+ let recalculWeight = false;
+
+ let change;
+ let i = 0;
+ for (let d of documents) {
+ if (changes[i].hasOwnProperty("system")) {
+ change = changes[i];
+
+ if (d.type === "armor" ||
+ d.type === "computer" ||
+ d.type === "gear" ||
+ d.type === "item" ||
+ d.type === "weapon") {
+ if (change.system.hasOwnProperty("quantity") ||
+ change.system.hasOwnProperty("weight") ||
+ change.system.hasOwnProperty("weightless") ||
+ change.system.hasOwnProperty("container") ||
+ change.system.hasOwnProperty("equipped") ||
+ d.type === "armor") {
+ recalculWeight = true;
+ }
+ } else if (d.type === "talent" && d.system.subType === "skill") {
+ if (change.system.level || (change.system?.hasOwnProperty("skill") && change.system?.skill.hasOwnProperty("reduceEncumbrance"))) {
+ recalculEncumbrance = true;
+ }
+ } else if (d.type === "container" && (change.system.hasOwnProperty("onHand") || change.system.hasOwnProperty("weightless"))) {
+ recalculWeight = true;
+ }
+ }
+ i++;
+ }
+
+ if (recalculEncumbrance || recalculWeight) {
+ const cloneActor = foundry.utils.deepClone($this);
+
+ await this.recalculateArmor($this, cloneActor);
+
+ if (recalculEncumbrance) {
+ //console.log("recalculEncumbrance");
+ const str = $this.system.characteristics.strength.value;
+ const end = $this.system.characteristics.endurance.value;
+ let sumSkill = 0;
+ $this.items.filter(x => x.type === "talent" && x.system.subType === "skill" && x.system.skill.reduceEncumbrance === true).forEach(x => sumSkill += x.system.level);
+ let normal = str + end + sumSkill;
+ let heavy = normal * 2;
+
+ cloneActor.system.states.encumbrance = $this.system.inventory.weight > normal;
+ cloneActor.system.encumbrance.normal = normal;
+ cloneActor.system.encumbrance.heavy = heavy;
+ }
+
+ if (recalculWeight)
+ await this.recalculateWeight($this, cloneActor);
+ }
+ }
+
+ static async recalculateArmor($this, cloneActor) {
+ if (cloneActor === null || cloneActor === undefined)
+ cloneActor = foundry.utils.deepClone($this);
+
+ let armor = 0;
for (let item of $this.items) {
- if (item.system.hasOwnProperty("container") && item.system.container.id === d._id)
- toDeleteIds.push(item._id);
+ if (item.type === "armor") {
+ if (item.system.equipped === true && !isNaN(item.system.protection)) {
+ armor += (+item.system.protection || 0);
+ }
+ }
}
- } else if (d.type === "computer") {
+
+ cloneActor.system.inventory.armor = armor;
+ }
+
+ static async recalculateWeight($this, cloneActor) {
+
+ if (cloneActor === null || cloneActor === undefined)
+ cloneActor = foundry.utils.deepClone($this);
+
+ let updatedContainers = [];
+ let containerChanges = {};
+
+ //console.log("recalculWeight");
+ let containers = [];
+
+ // List all containers
for (let item of $this.items) {
- if (item.system.hasOwnProperty("software") && item.system.computerId === d._id) {
- let clone = duplicate(item);
- clone.system.software.computerId = "";
- itemToUpdates.push(clone);
- }
+ if (item.system.trash === true) continue;
+
+ if (item.type === "container") {
+ containers.push(item);
+ containerChanges[item._id] = { count: 0, weight: 0 };
+ }
}
- }
- }
- if (toDeleteIds.length > 0)
- await $this.deleteEmbeddedDocuments("Item", toDeleteIds);
- if (itemToUpdates.length > 0)
- await $this.updateEmbeddedDocuments("Item", itemToUpdates);
- await this.recalculateWeight($this);
- }
- static async onUpdateDescendantDocuments($this, parent, collection, documents, changes, options, userId) {
- await this.calculEncumbranceAndWeight($this, parent, collection, documents, changes, options, userId);
- await this.calculComputers($this, parent, collection, documents, changes, options, userId);
- }
- static async calculComputers($this, parent, collection, documents, changes, options, userId) {
- let change;
- let i = 0;
- let recalculProcessing = false;
- for (let d of documents) {
- if (changes[i].hasOwnProperty("system")) {
- change = changes[i];
- if (d.type === "item" && d.system.subType === "software") {
- if (change.system.software.hasOwnProperty("bandwidth") || change.system.software.hasOwnProperty("computerId")) {
- recalculProcessing = true;
- break;
- }
+
+ let onHandWeight = 0;
+ for (let item of $this.items) {
+ if (item.type === "container") continue;
+ if (item.system.hasOwnProperty("weightless") && item.system.weightless === true) continue;
+
+ let itemWeight = 0;
+ if (item.system.hasOwnProperty("weight")) {
+ let itemQty = item.system.quantity;
+ if (!isNaN(itemQty) && itemQty > 0) {
+ itemWeight = item.system.weight;
+ if (itemWeight > 0) {
+ itemWeight *= itemQty;
+ }
+ }
+
+ if (item.type === "armor") {
+ if (item.system.equipped === true) {
+ if (item.system.powered === true)
+ itemWeight = 0;
+ else
+ itemWeight *= 0.25; // mass of armor that is being worn by 75% OPTIONAL
+ }
+ }
+
+ if (item.system.container && item.system.container.id && item.system.container.id !== "") {
+ // bad deleted container id
+ if (containerChanges.hasOwnProperty(item.system.container.id)) {
+ containerChanges[item.system.container.id].weight += Math.round(itemWeight * 10) / 10;
+ containerChanges[item.system.container.id].count += item.system.quantity;
+ }
+ } else {
+ onHandWeight += Math.round(itemWeight * 10) / 10;
+ }
+ }
}
- }
- }
- if (recalculProcessing) {
- let updatedComputers = [];
- let computerChanges = {};
- let computers = [];
- for (let item of $this.items) {
- if (item.system.trash === true)
- continue;
- if (item.type === "computer") {
- computers.push(item);
- computerChanges[item._id] = { processingUsed: 0 };
+
+ //cloneActor.system.inventory.weight = onHandWeight.toFixed(1);
+
+ // Check containers new weight
+ for (let container of containers) {
+ let newWeight = containerChanges[container._id].weight;
+ let newCount = containerChanges[container._id].count;
+ if (container.system.weight !== newWeight || container.system.count !== newCount) {
+ //const cloneContainer = foundry.utils.deepClone();
+ const cloneContainer = foundry.utils.deepClone($this.getEmbeddedDocument("Item", container._id));
+ //foundry.utils.setProperty(cloneContainer, "system.weight", newWeight);
+ cloneContainer.system.weight = newWeight;
+ cloneContainer.system.count = newCount;
+ updatedContainers.push(cloneContainer);
+
+ if (container.system.onHand === true &&
+ (container.system.weight > 0 || container.system.weightless !== true)) {
+ onHandWeight += container.system.weight;
+ }
+ }
}
- }
- for (let item of $this.items) {
- if (item.type !== "item" && item.system.subType !== "software")
- continue;
- if (item.system.software.hasOwnProperty("computerId") && item.system.software.computerId !== "") {
- computerChanges[item.system.software.computerId].processingUsed += item.system.software.bandwidth;
+
+ cloneActor.system.inventory.weight = onHandWeight;
+ cloneActor.system.states.encumbrance = onHandWeight > $this.system.inventory.encumbrance.normal;
+
+
+ await $this.update(cloneActor);
+
+ if (updatedContainers.length > 0) {
+ await $this.updateEmbeddedDocuments('Item', updatedContainers);
}
- }
- for (let computer of computers) {
- let newProcessingUsed = computerChanges[computer._id].processingUsed;
- if (computer.system.processingUsed !== newProcessingUsed) {
- const cloneComputer = duplicate($this.getEmbeddedDocument("Item", computer._id));
- cloneComputer.system.processingUsed = newProcessingUsed;
- cloneComputer.system.overload = cloneComputer.system.processingUsed > cloneComputer.system.processing;
- updatedComputers.push(cloneComputer);
+ }
+
+ static async preUpdate($this, changed, options, user) {
+ // Calc encumbrance
+
+ const newStr = foundry.utils.getProperty(changed, "system.characteristics.strength.value") ?? $this.system.characteristics.strength.value;
+ const newEnd = foundry.utils.getProperty(changed, "system.characteristics.endurance.value") ?? $this.system.characteristics.endurance.value;
+ if ((newStr !== $this.system.characteristics.strength.value) || (newEnd !== $this.system.characteristics.endurance.value)) {
+ let sumSkill = 0;
+ $this.items.filter(x => x.type === "talent" && x.system.subType === "skill" && x.system.skill.reduceEncumbrance === true).forEach(x => sumSkill += x.system.level);
+ let normal = newStr + newEnd + sumSkill;
+ let heavy = normal * 2;
+ foundry.utils.setProperty(changed, "system.inventory.encumbrance.normal", normal);
+ foundry.utils.setProperty(changed, "system.inventory.encumbrance.heavy", heavy);
}
- }
- if (updatedComputers.length > 0) {
- await $this.updateEmbeddedDocuments("Item", updatedComputers);
- }
+
+ //console.log(foundry.utils.getProperty(changed, "system.characteristics.strength.value"));
+ const characteristicModified = this.computeCharacteristics(changed);
+ const strengthValue = foundry.utils.getProperty(changed, "system.characteristics.strength.value") ?? $this.system.characteristics.strength.value;
+ const strengthMax = foundry.utils.getProperty(changed, "system.characteristics.strength.max") ?? $this.system.characteristics.strength.max;
+ const dexterityValue = foundry.utils.getProperty(changed, "system.characteristics.dexterity.value") ?? $this.system.characteristics.dexterity.value;
+ const dexterityMax = foundry.utils.getProperty(changed, "system.characteristics.dexterity.max") ?? $this.system.characteristics.dexterity.max;
+ const enduranceValue = foundry.utils.getProperty(changed, "system.characteristics.endurance.value") ?? $this.system.characteristics.endurance.value;
+ const enduranceMax = foundry.utils.getProperty(changed, "system.characteristics.endurance.max") ?? $this.system.characteristics.endurance.max;
+ const lifeValue = strengthValue + dexterityValue + enduranceValue;
+ const lifeMax = strengthMax + dexterityMax + enduranceMax;
+
+ if ($this.system.life.value !== lifeValue)
+ foundry.utils.setProperty(changed, "system.life.value", lifeValue);
+ if ($this.system.life.max !== lifeMax)
+ foundry.utils.setProperty(changed, "system.life.max", lifeMax);
+
+ if (characteristicModified && $this.system.personal.ucp === undefined || $this.system.personal.ucp === "") ;
+ //}
+
+ // Apply changes in Actor size to Token width/height
+ // if ( "size" in (this.system.traits || {}) ) {
+ // const newSize = foundry.utils.getProperty(changed, "system.traits.size");
+ // if ( newSize && (newSize !== this.system.traits?.size) ) {
+ // let size = CONFIG.DND5E.tokenSizes[newSize];
+ // if ( !foundry.utils.hasProperty(changed, "prototypeToken.width") ) {
+ // changed.prototypeToken ||= {};
+ // changed.prototypeToken.height = size;
+ // changed.prototypeToken.width = size;
+ // }
+ // }
+ // }
}
- }
- static async calculEncumbranceAndWeight($this, parent, collection, documents, changes, options, userId) {
- var _a, _b;
- let recalculEncumbrance = false;
- let recalculWeight = false;
- let change;
- let i = 0;
- for (let d of documents) {
- if (changes[i].hasOwnProperty("system")) {
- change = changes[i];
- if (d.type === "armor" || d.type === "computer" || d.type === "gear" || d.type === "item" || d.type === "weapon") {
- if (change.system.hasOwnProperty("quantity") || change.system.hasOwnProperty("weight") || change.system.hasOwnProperty("weightless") || change.system.hasOwnProperty("container") || change.system.hasOwnProperty("equipped") || d.type === "armor") {
- recalculWeight = true;
- }
- } else if (d.type === "talent" && d.system.subType === "skill") {
- if (change.system.level || ((_a = change.system) == null ? void 0 : _a.hasOwnProperty("skill")) && ((_b = change.system) == null ? void 0 : _b.skill.hasOwnProperty("reduceEncumbrance"))) {
- recalculEncumbrance = true;
- }
- } else if (d.type === "container" && (change.system.hasOwnProperty("onHand") || change.system.hasOwnProperty("weightless"))) {
- recalculWeight = true;
+
+ // static applyHealing($this, amount) {
+ // if (isNaN(amount) || amount === 0) return;
+
+ // const strength = $this.system.characteristics.strength;
+ // const dexterity = $this.system.characteristics.dexterity;
+ // const endurance = $this.system.characteristics.endurance;
+
+ // const data = {
+ // strength: { value: strength.value },
+ // dexterity: { value: dexterity.value },
+ // endurance: { value: endurance.value }
+ // };
+
+
+
+ // $this.update({ system: { characteristics: data } });
+ // }
+
+ static applyDamage($this, amount) {
+ if (isNaN(amount) || amount === 0) return;
+ const rank1 = $this.system.config.damages.rank1;
+ const rank2 = $this.system.config.damages.rank2;
+ const rank3 = $this.system.config.damages.rank3;
+
+ const data = {};
+ data[rank1] = { value: $this.system.characteristics[rank1].value };
+ data[rank2] = { value: $this.system.characteristics[rank2].value };
+ data[rank3] = { value: $this.system.characteristics[rank3].value };
+
+ if (amount < 0) amount = Math.abs(amount);
+
+ for (const [key, rank] of Object.entries(data)) {
+ if (rank.value > 0) {
+ if (rank.value >= amount) {
+ rank.value -= amount;
+ amount = 0;
+ } else {
+ amount -= rank.value;
+ rank.value = 0;
+ }
+ rank.dm = this.getModifier(rank.value);
+ if (amount <= 0) break;
+ }
}
- }
- i++;
+
+ $this.update({ system: { characteristics: data } });
}
- if (recalculEncumbrance || recalculWeight) {
- const cloneActorSystem = duplicate($this.system);
- await this.recalculateArmor($this, cloneActorSystem);
- if (!recalculEncumbrance && !recalculWeight)
- await $this.update({ system: cloneActorSystem });
- if (recalculEncumbrance) {
- const str = Number($this.system.characteristics.strength.value);
- const end = Number($this.system.characteristics.endurance.value);
- let sumSkill = 0;
- $this.items.filter((x) => x.type === "talent" && x.system.subType === "skill" && x.system.skill.reduceEncumbrance === true).forEach((x) => sumSkill += Number(x.system.level));
- let normal = str + end + sumSkill;
- let heavy = normal * 2;
- cloneActorSystem.states.encumbrance = $this.system.inventory.weight > normal;
- cloneActorSystem.encumbrance.normal = normal;
- cloneActorSystem.encumbrance.heavy = heavy;
- if (!recalculWeight)
- await $this.update({ system: cloneActorSystem });
- }
- if (recalculWeight)
- await this.recalculateWeight($this, cloneActorSystem);
- }
- }
- static async recalculateArmor($this, cloneActorSystem) {
- if (cloneActorSystem === null || cloneActorSystem === void 0)
- cloneActorSystem = foundry.utils.duplicate($this.system);
- let armor = 0;
- for (let item of $this.items) {
- if (item.type === "armor") {
- if (item.system.equipped === true && !isNaN(item.system.protection)) {
- armor += +item.system.protection || 0;
+
+ static getContainers($this) {
+ const containers = [];
+ for (let item of $this.items) {
+ if (item.type == "container") {
+ containers.push(item);
+ }
}
- }
+
+ containers.sort(this.compareByName);
+
+ return containers;
}
- cloneActorSystem.inventory.armor = armor;
- }
- static async recalculateWeight($this, cloneActorSystem) {
- if (cloneActorSystem === null || cloneActorSystem === void 0)
- cloneActorSystem = foundry.utils.duplicate($this.system);
- let updatedContainers = [];
- let containerChanges = {};
- let containers = [];
- for (let item of $this.items) {
- if (item.system.trash === true)
- continue;
- if (item.type === "container") {
- containers.push(item);
- containerChanges[item._id] = { count: 0, weight: 0 };
- }
- }
- let onHandWeight = 0;
- for (let item of $this.items) {
- if (item.type === "container")
- continue;
- if (item.system.hasOwnProperty("weightless") && item.system.weightless === true)
- continue;
- let itemWeight = 0;
- if (item.system.hasOwnProperty("weight")) {
- let itemQty = item.system.quantity;
- if (!isNaN(itemQty) && itemQty > 0) {
- itemWeight = item.system.weight;
- if (itemWeight > 0) {
- itemWeight *= itemQty;
- }
+
+ static getComputers($this) {
+ const containers = [];
+ for (let item of $this.items) {
+ if (item.type == "computer") {
+ containers.push(item);
+ }
}
- if (item.type === "armor") {
- if (item.system.equipped === true) {
- if (item.system.powered === true)
- itemWeight = 0;
- else
- itemWeight *= 0.25;
- }
+
+ containers.sort(this.compareByName);
+
+ return containers;
+ }
+
+ static getSkills($this) {
+ const skills = [];
+ for (let item of $this.items) {
+ if (item.type === "talent" && item.system.subType === "skill") {
+ skills.push(item);
+ }
}
- if (item.system.container && item.system.container.id && item.system.container.id !== "") {
- if (containerChanges.hasOwnProperty(item.system.container.id)) {
- containerChanges[item.system.container.id].weight += Math.round(itemWeight * 10) / 10;
- containerChanges[item.system.container.id].count += item.system.quantity;
- }
- } else {
- onHandWeight += Math.round(itemWeight * 10) / 10;
+
+ skills.sort(this.compareByName);
+
+ return skills;
+ }
+
+ static computeCharacteristics(changed) {
+ let modified = this.computeCharacteristic(changed, "strength");
+
+ if (this.computeCharacteristic(changed, "dexterity") && !modified) modified = true;
+ if (this.computeCharacteristic(changed, "endurance") && !modified) modified = true;
+ if (this.computeCharacteristic(changed, "intellect") && !modified) modified = true;
+ if (this.computeCharacteristic(changed, "education") && !modified) modified = true;
+ if (this.computeCharacteristic(changed, "social") && !modified) modified = true;
+ if (this.computeCharacteristic(changed, "morale") && !modified) modified = true;
+ if (this.computeCharacteristic(changed, "luck") && !modified) modified = true;
+ if (this.computeCharacteristic(changed, "sanity") && !modified) modified = true;
+ if (this.computeCharacteristic(changed, "charm") && !modified) modified = true;
+ if (this.computeCharacteristic(changed, "psionic") && !modified) modified = true;
+ if (this.computeCharacteristic(changed, "other") && !modified) modified = true;
+
+ return modified;
+ }
+
+ static computeCharacteristic(changed, name) {
+ //if (isNaN(c.value) || c.value <= 0) c.value = 0;
+ //c.dm = this._getModifier(c.value)
+ const path = `system.characteristics.${name}`;
+ const newValue = foundry.utils.getProperty(changed, path + ".value");// || this.system.characteristics[name].value;
+ if (newValue) {
+ const dm = this.getModifier(newValue);
+ foundry.utils.setProperty(changed, path + ".dm", dm);
+ return true;
}
- }
+
+ return false;
}
- for (let container of containers) {
- let newWeight = containerChanges[container._id].weight;
- let newCount = containerChanges[container._id].count;
- if (container.system.weight !== newWeight || container.system.count !== newCount) {
- const cloneContainer = duplicate($this.getEmbeddedDocument("Item", container._id));
- cloneContainer.system.weight = newWeight;
- cloneContainer.system.count = newCount;
- updatedContainers.push(cloneContainer);
- if (container.system.onHand === true && (container.system.weight > 0 || container.system.weightless !== true)) {
- onHandWeight += container.system.weight;
+
+ static getModifier(value) {
+ if (isNaN(value) || value <= 0) return -3;
+ if (value >= 1 && value <= 2) return -2;
+ if (value >= 3 && value <= 5) return -1;
+ if (value >= 6 && value <= 8) return 0;
+ if (value >= 9 && value <= 11) return 1;
+ if (value >= 12 && value <= 14) return 2;
+
+ return 3;
+ }
+
+ static compareByName(a, b) {
+ if (!a.hasOwnProperty("name") || !b.hasOwnProperty("name")) {
+ return 0;
}
- }
+ return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
}
- cloneActorSystem.inventory.weight = onHandWeight;
- cloneActorSystem.states.encumbrance = onHandWeight > $this.system.inventory.encumbrance.normal;
- await $this.update({ system: cloneActorSystem });
- if (updatedContainers.length > 0) {
- await $this.updateEmbeddedDocuments("Item", updatedContainers);
- }
- }
- static async preUpdate($this, changed, options, user) {
- var _a, _b, _c, _d, _e, _f, _g, _h;
- const newStr = Number((_a = foundry.utils.getProperty(changed, "system.characteristics.strength.value")) != null ? _a : $this.system.characteristics.strength.value);
- const newEnd = Number((_b = foundry.utils.getProperty(changed, "system.characteristics.endurance.value")) != null ? _b : $this.system.characteristics.endurance.value);
- if (newStr !== $this.system.characteristics.strength.value || newEnd !== $this.system.characteristics.endurance.value) {
- let sumSkill = 0;
- $this.items.filter((x) => x.type === "talent" && x.system.subType === "skill" && x.system.skill.reduceEncumbrance === true).forEach((x) => sumSkill += Number(x.system.level));
- let normal = newStr + newEnd + sumSkill;
- let heavy = normal * 2;
- foundry.utils.setProperty(changed, "system.inventory.encumbrance.normal", normal);
- foundry.utils.setProperty(changed, "system.inventory.encumbrance.heavy", heavy);
- }
- const characteristicModified = this.computeCharacteristics(changed);
- const strengthValue = Number((_c = foundry.utils.getProperty(changed, "system.characteristics.strength.value")) != null ? _c : $this.system.characteristics.strength.value);
- const strengthMax = Number((_d = foundry.utils.getProperty(changed, "system.characteristics.strength.max")) != null ? _d : $this.system.characteristics.strength.max);
- const dexterityValue = Number((_e = foundry.utils.getProperty(changed, "system.characteristics.dexterity.value")) != null ? _e : $this.system.characteristics.dexterity.value);
- const dexterityMax = Number((_f = foundry.utils.getProperty(changed, "system.characteristics.dexterity.max")) != null ? _f : $this.system.characteristics.dexterity.max);
- const enduranceValue = Number((_g = foundry.utils.getProperty(changed, "system.characteristics.endurance.value")) != null ? _g : $this.system.characteristics.endurance.value);
- const enduranceMax = Number((_h = foundry.utils.getProperty(changed, "system.characteristics.endurance.max")) != null ? _h : $this.system.characteristics.endurance.max);
- const lifeValue = strengthValue + dexterityValue + enduranceValue;
- const lifeMax = strengthMax + dexterityMax + enduranceMax;
- if ($this.system.life.value !== lifeValue)
- foundry.utils.setProperty(changed, "system.life.value", lifeValue);
- if ($this.system.life.max !== lifeMax)
- foundry.utils.setProperty(changed, "system.life.max", lifeMax);
- if (characteristicModified && $this.system.personal.ucp === void 0 || $this.system.personal.ucp === "") ;
- }
- // static applyHealing($this, amount) {
- // if (isNaN(amount) || amount === 0) return;
- // const strength = $this.system.characteristics.strength;
- // const dexterity = $this.system.characteristics.dexterity;
- // const endurance = $this.system.characteristics.endurance;
- // const data = {
- // strength: { value: strength.value },
- // dexterity: { value: dexterity.value },
- // endurance: { value: endurance.value }
- // };
- // $this.update({ system: { characteristics: data } });
- // }
- static applyDamage($this, amount) {
- if (isNaN(amount) || amount === 0)
- return;
- const rank1 = $this.system.config.damages.rank1;
- const rank2 = $this.system.config.damages.rank2;
- const rank3 = $this.system.config.damages.rank3;
- const data = {};
- data[rank1] = { value: $this.system.characteristics[rank1].value };
- data[rank2] = { value: $this.system.characteristics[rank2].value };
- data[rank3] = { value: $this.system.characteristics[rank3].value };
- if (amount < 0)
- amount = Math.abs(amount);
- for (const [key, rank] of Object.entries(data)) {
- if (rank.value > 0) {
- if (rank.value >= amount) {
- rank.value -= amount;
- amount = 0;
- } else {
- amount -= rank.value;
- rank.value = 0;
- }
- rank.dm = this.getModifier(rank.value);
- if (amount <= 0)
- break;
- }
- }
- $this.update({ system: { characteristics: data } });
- }
- static getContainers($this) {
- const containers = [];
- for (let item of $this.items) {
- if (item.type == "container") {
- containers.push(item);
- }
- }
- containers.sort(this.compareByName);
- return containers;
- }
- static getComputers($this) {
- const containers = [];
- for (let item of $this.items) {
- if (item.type == "computer") {
- containers.push(item);
- }
- }
- containers.sort(this.compareByName);
- return containers;
- }
- static getSkills($this) {
- const skills = [];
- for (let item of $this.items) {
- if (item.type === "talent" && item.system.subType === "skill") {
- skills.push(item);
- }
- }
- skills.sort(this.compareByName);
- return skills;
- }
- static computeCharacteristics(changed) {
- let modified = this.computeCharacteristic(changed, "strength");
- if (this.computeCharacteristic(changed, "dexterity") && !modified)
- modified = true;
- if (this.computeCharacteristic(changed, "endurance") && !modified)
- modified = true;
- if (this.computeCharacteristic(changed, "intellect") && !modified)
- modified = true;
- if (this.computeCharacteristic(changed, "education") && !modified)
- modified = true;
- if (this.computeCharacteristic(changed, "social") && !modified)
- modified = true;
- if (this.computeCharacteristic(changed, "morale") && !modified)
- modified = true;
- if (this.computeCharacteristic(changed, "luck") && !modified)
- modified = true;
- if (this.computeCharacteristic(changed, "sanity") && !modified)
- modified = true;
- if (this.computeCharacteristic(changed, "charm") && !modified)
- modified = true;
- if (this.computeCharacteristic(changed, "psionic") && !modified)
- modified = true;
- if (this.computeCharacteristic(changed, "other") && !modified)
- modified = true;
- return modified;
- }
- static computeCharacteristic(changed, name) {
- const path = `system.characteristics.${name}`;
- const newValue = Number(foundry.utils.getProperty(changed, path + ".value"));
- if (newValue && !isNaN(newValue)) {
- const dm = this.getModifier(newValue);
- foundry.utils.setProperty(changed, path + ".dm", dm);
- return true;
- }
- return false;
- }
- static getModifier(value) {
- if (isNaN(value) || value <= 0)
- return -3;
- if (value >= 1 && value <= 2)
- return -2;
- if (value >= 3 && value <= 5)
- return -1;
- if (value >= 6 && value <= 8)
- return 0;
- if (value >= 9 && value <= 11)
- return 1;
- if (value >= 12 && value <= 14)
- return 2;
- return 3;
- }
- static compareByName(a, b) {
- if (!a.hasOwnProperty("name") || !b.hasOwnProperty("name")) {
- return 0;
- }
- return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
- }
}
class MGT2Combatant extends Combatant {
+
}
+
class TravellerActor extends Actor {
- // _onUpdate(data, options, userId) {
- // super._onUpdate(data, options, userId);
- // console.log("_onUpdate");
- // console.log(data);
- // if (data.system?.characteristics) {
- // // Calc encumbrance
- // if (data.system.characteristics.strength || data.system.characteristics.endurance) {
- // data.system.encumbrance.normal = 0;
- // data.system.encumbrance.heavy = 0;
- // }
- // }
- // // If benefits were changed
- // //if (data.system?.benefits) {
- // // this.updateBenefitsOnActor();
- // //}
- // // this.actor.computeCharacteristics(formData);
- // }
- /*
- initiative if(!token?.combatant) return ui.notifications.warn("You are missing a selected token or combatant."); const bonus = await Dialog.prompt({ title: "Roll Initiative", content: ``, callback: (html) => html[0].querySelector("input").value, rejectClose: false }); const roll = await new Roll(`1d12 + ${bonus}`).evaluate({async: true}); await roll.toMessage({ flavor: `${token.actor.name} rolls initiative!`, speaker: ChatMessage.getSpeaker({actor: token.actor}) }); await token.combatant.update({initiative: roll.total});
- */
+
+
prepareDerivedData() {
if (this.type === "character") {
this.system.initiative = ActorCharacter.getInitiative(this);
}
}
+
async _preCreate(data, options, user) {
- if (await super._preCreate(data, options, user) === false)
- return false;
+ if ( (await super._preCreate(data, options, user)) === false ) return false;
+
if (this.type === "character") {
ActorCharacter.preCreate(this, data, options, user);
}
}
+
async _onDeleteDescendantDocuments(parent, collection, documents, ids, options, userId) {
await super._onDeleteDescendantDocuments(parent, collection, documents, ids, options, userId);
+
if (this.type === "character") {
await ActorCharacter.onDeleteDescendantDocuments(this, parent, collection, documents, ids, options, userId);
}
}
+
async _onUpdateDescendantDocuments(parent, collection, documents, changes, options, userId) {
super._onUpdateDescendantDocuments(parent, collection, documents, changes, options, userId);
+ //console.log("_onUpdateDescendantDocuments");
+
if (this.type === "character") {
await ActorCharacter.onUpdateDescendantDocuments(this, parent, collection, documents, changes, options, userId);
}
}
+
async _preUpdate(changed, options, user) {
- if (await super._preUpdate(changed, options, user) === false)
- return false;
+ if ((await super._preUpdate(changed, options, user)) === false) return false;
+
if (this.type === "character") {
await ActorCharacter.preUpdate(this, changed, options, user);
}
}
+
getInitiative($this) {
if (this.type === "character") {
return ActorCharacter.getInitiative(this);
}
}
+
applyDamage(amount) {
if (this.type === "character") {
ActorCharacter.applyDamage(this, amount);
}
}
+
getContainers() {
if (this.type === "character") {
return ActorCharacter.getContainers(this);
}
+
return [];
}
+
getComputers() {
if (this.type === "character") {
return ActorCharacter.getComputers(this);
}
+
return [];
}
+
getSkills() {
if (this.type === "character") {
return ActorCharacter.getSkills(this);
}
+
return [];
}
+
async recalculateWeight() {
if (this.type === "character") {
return ActorCharacter.recalculateWeight(this);
}
}
- async recalculateArmor() {
- if (this.type === "character") {
- return ActorCharacter.recalculateArmor(this);
- }
- }
+
}
class TravellerItem extends Item {
+
/** @inheritdoc */
prepareDerivedData() {
super.prepareDerivedData();
+
}
+
async _preUpdate(changed, options, user) {
- var _a, _b, _c;
- if (await super._preUpdate(changed, options, user) === false)
- return false;
+ if ((await super._preUpdate(changed, options, user)) === false) return false;
+
if (this.type === "computer") {
- const newProcessing = (_a = foundry.utils.getProperty(changed, "system.processing")) != null ? _a : this.system.processing;
+ // Overload
+ const newProcessing = foundry.utils.getProperty(changed, "system.processing") ?? this.system.processing;
if (newProcessing !== this.system.processing) {
let overload = this.system.processingUsed > newProcessing;
foundry.utils.setProperty(changed, "system.overload", overload);
}
}
- if (this.type === "computer" || this.type === "container" || this.type === "item" && this.system.subType === "software") {
- const newQty = (_b = foundry.utils.getProperty(changed, "system.quantity")) != null ? _b : this.system.quantity;
+
+ // Qty max 1
+ if (this.type === "computer" || this.type === "container" || (this.type === "item" && this.system.subType === "software")) {
+ const newQty = foundry.utils.getProperty(changed, "system.quantity") ?? this.system.quantity;
if (newQty !== this.system.quantity && newQty > 1) {
foundry.utils.setProperty(changed, "system.quantity", 1);
}
}
+
+ // No Weight
if (this.type === "item" && this.system.subType === "software") {
- const newWeight = (_c = foundry.utils.getProperty(changed, "system.weight")) != null ? _c : this.system.weight;
+ const newWeight = foundry.utils.getProperty(changed, "system.weight") ?? this.system.weight;
if (newWeight !== this.system.weight && newWeight > 0) {
foundry.utils.setProperty(changed, "system.weight", 0);
}
}
}
+
getRollDisplay() {
if (this.type === "talent") {
if (this.system.subType === "skill") {
let label;
- if (this.system.skill.speciality !== "" && this.system.skill.speciality !== void 0) {
+ if (this.system.skill.speciality !== "" && this.system.skill.speciality !== undefined) {
label = `${this.name} (${this.system.skill.speciality})`;
} else {
label = this.name;
}
+
if (this.system.level > 0)
label += ` (+${this.system.level})`;
else if (this.system.level < 0)
label += ` (${this.system.level})`;
+
return label;
} else if (this.system.subType === "psionic") ;
}
+
return name;
}
}
-var __defProp = Object.defineProperty;
-var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
-var __publicField = (obj, key, value) => {
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
- return value;
-};
-const _MGT2Helper = class _MGT2Helper {
- static hasValue(object, property) {
- return object !== void 0 && object.hasOwnProperty(property) && object[property] !== null && object[property] !== void 0 && object[property] !== "";
- }
- static getItemsWeight(items) {
- let weight = 0;
- for (let i of items) {
- let item = i.hasOwnProperty("system") ? i.system : i;
- if (item.hasOwnProperty("weightless") && item.weightless === true) {
- continue;
- }
- if (item.hasOwnProperty("weight")) {
- let itemQty = item.quantity;
- if (!isNaN(itemQty) && itemQty > 0) {
- let itemWeight = item.weight;
- if (itemWeight > 0) {
- weight += itemWeight * itemQty;
- }
- }
- }
- }
- return weight;
- }
- static generateUID() {
- let result = "";
- const characters = "abcdefghijklmnopqrstuvwxyz0123456789";
- for (let i = 0; i < 36; i++) {
- const randomIndex = Math.floor(Math.random() * characters.length);
- result += characters.charAt(randomIndex);
- if (i === 8 || i === 12 || i === 16 || i === 20)
- result += "-";
- }
- return result;
- }
- static compareByName(a, b) {
- if (!a.hasOwnProperty("name") || !b.hasOwnProperty("name")) {
- return 0;
- }
- return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
- }
- static getDisplayDM(dm) {
- if (dm === 0)
- return " (0)";
- if (dm > 0)
- return ` (+${dm})`;
- if (dm < 0)
- return ` (${dm})`;
- return "";
- }
- static getFormulaDM(dm) {
- if (dm === 0)
- return "+0";
- if (dm > 0)
- return `+${dm}`;
- if (dm < 0)
- return `${dm}`;
- return "";
- }
- static getDiceResults(roll) {
- const results = [];
- for (const die of roll.dice) {
- results.push(die.results);
- }
- return results.flat(2);
- }
- static getDiceTotal(roll) {
- let total = 0;
- for (const die of roll.dice) {
- total += die.total;
- }
- return total;
- }
- static getDifficultyValue(difficulty) {
- switch (difficulty) {
- case "Simple":
- return 2;
- case "Easy":
- return 4;
- case "Routine":
- return 6;
- case "Average":
- return 8;
- case "Difficult":
- return 10;
- case "VeryDifficult":
- return 12;
- case "Formidable":
- return 14;
- case "Impossible":
- return 16;
- default:
- return 0;
- }
- }
- static getDifficultyDisplay(difficulty) {
- switch (difficulty) {
- case "Simple":
- return game.i18n.localize("MGT2.Difficulty.Simple") + " (2+)";
- case "Easy":
- return game.i18n.localize("MGT2.Difficulty.Easy") + " (4+)";
- case "Routine":
- return game.i18n.localize("MGT2.Difficulty.Routine") + " (6+)";
- case "Average":
- return game.i18n.localize("MGT2.Difficulty.Average") + " (8+)";
- case "Difficult":
- return game.i18n.localize("MGT2.Difficulty.Difficult") + " (10+)";
- case "VeryDifficult":
- return game.i18n.localize("MGT2.Difficulty.VeryDifficult") + " (12+)";
- case "Formidable":
- return game.i18n.localize("MGT2.Difficulty.Formidable") + " (14+)";
- case "Impossible":
- return game.i18n.localize("MGT2.Difficulty.Impossible") + " (16+)";
- default:
- return null;
- }
- }
- static getRangeDisplay(range) {
- let value = Number(range.value);
- if (isNaN(value))
- return null;
- let label;
- if (range.unit !== null && range.unit !== void 0 && range.unit !== "")
- label = game.i18n.localize(`MGT2.MetricRange.${range.unit}`).toLowerCase();
- else
- label = "";
- return `${value}${label}`;
- }
- static getWeightLabel() {
- return game.i18n.localize("MGT2.MetricSystem.Weight.kg");
- }
- static getDistanceLabel() {
- return game.i18n.localize("MGT2.MetricSystem.Distance.km");
- }
- static getIntegerFromInput(data) {
- return Math.trunc(this.getNumberFromInput(data));
- }
- static getNumberFromInput(data) {
- if (data === void 0 || data === null)
- return 0;
- if (typeof data === "string") {
- let converted2 = Number(data.replace(/\s+/g, "").replace(this.badDecimalSeparator, this.decimalSeparator).trim());
- if (isNaN(converted2))
- return 0;
- return converted2;
- }
- let converted = Number(data);
- if (isNaN(converted))
- return 0;
- return converted;
- }
- static convertWeightForDisplay(weight) {
- return weight;
- }
- static convertWeightFromInput(weight) {
- return Math.round(weight * 10) / 10;
- }
- static getDataFromDropEvent(event) {
- var _a;
- try {
- return JSON.parse((_a = event.dataTransfer) == null ? void 0 : _a.getData("text/plain"));
- } catch (err) {
- return false;
- }
- }
- static async getItemDataFromDropData(dropData) {
- var _a;
- let item;
- if (((_a = game.modules.get("monks-enhanced-journal")) == null ? void 0 : _a.active) && dropData.itemId && dropData.uuid.includes("JournalEntry")) {
- await fromUuid(dropData.uuid);
- } else if (dropData.hasOwnProperty("uuid")) {
- item = await fromUuid(dropData.uuid);
- } else {
- let uuid = `${dropData.type}.${dropData.data._id}`;
- item = await fromUuid(uuid);
- }
- if (!item) {
- throw new Error(game.i18n.localize("Errors.CouldNotFindItem").replace("_ITEM_ID_", dropData.uuid));
- }
- if (item.pack) {
- const pack = game.packs.get(item.pack);
- item = await (pack == null ? void 0 : pack.getDocument(item._id));
- }
- return foundry.utils.deepClone(item);
- }
-};
-__publicField(_MGT2Helper, "POUNDS_CONVERT", 2.20462262185);
-__publicField(_MGT2Helper, "decimalSeparator");
-__publicField(_MGT2Helper, "badDecimalSeparator");
-_MGT2Helper.decimalSeparator = Number(1.1).toLocaleString().charAt(1);
-_MGT2Helper.badDecimalSeparator = _MGT2Helper.decimalSeparator === "." ? "," : ".";
-__publicField(_MGT2Helper, "format", function() {
- var s = arguments[0];
- for (var i = 0; i < arguments.length - 1; i++) {
- var reg = new RegExp("\\{" + i + "\\}", "gm");
- s = s.replace(reg, arguments[i + 1]);
- }
- return s;
-});
-let MGT2Helper = _MGT2Helper;
+const { HandlebarsApplicationMixin: HandlebarsApplicationMixin$1 } = foundry.applications.api;
-class TravellerItemSheet extends ItemSheet {
- /** @inheritdoc */
- static get defaultOptions() {
- const options = super.defaultOptions;
- return foundry.utils.mergeObject(options, {
- classes: ["mgt2", game.settings.get("mgt2", "theme"), "sheet"],
- width: 630,
- tabs: [{ navSelector: ".horizontal-tabs", contentSelector: ".itemsheet-panel", initial: "tab1" }]
- });
- }
- /* -------------------------------------------- */
- get template() {
- const path = "systems/mgt2/templates/items";
- return `${path}/${this.item.type}-sheet.html`;
- }
- /** @inheritdoc */
- async getData(options) {
- const context = await super.getData(options);
- const item = context.item;
- const source = item.toObject();
- context.config = CONFIG.MGT2;
- const settings = {};
- settings.usePronouns = game.settings.get("mgt2", "usePronouns");
- let containers = null;
- let computers = null;
- let hadContainer;
- if (context.item.actor != null) {
- hadContainer = true;
- containers = [{ "name": "", "_id": "" }].concat(context.item.actor.getContainers());
- computers = [{ "name": "", "_id": "" }].concat(context.item.actor.getComputers());
- } else {
- hadContainer = false;
+class MGT2ActorSheet extends HandlebarsApplicationMixin$1(foundry.applications.sheets.ActorSheetV2) {
+
+ static SHEET_MODES = { EDIT: 0, PLAY: 1 }
+
+ constructor(options = {}) {
+ super(options);
+ this._sheetMode = this.constructor.SHEET_MODES.PLAY;
}
- let weight = null;
- if (item.system.hasOwnProperty("weight")) {
- weight = MGT2Helper.convertWeightForDisplay(item.system.weight);
+
+ /** @override */
+ static DEFAULT_OPTIONS = {
+ classes: ["mgt2", "sheet", "actor"],
+ position: {
+ width: 780,
+ },
+ form: {
+ submitOnChange: true,
+ closeOnSubmit: false,
+ },
+ window: {
+ resizable: true,
+ },
+ dragDrop: [{ dragSelector: ".drag-item-list", dropSelector: ".drop-item-list" }],
+ actions: {
+ toggleSheet: MGT2ActorSheet.#onToggleSheet,
+ },
}
- let unitlabels = {
- weight: MGT2Helper.getWeightLabel()
- };
- let skills = [];
- if (this.actor !== null) {
- for (let item2 of this.actor.items) {
- if (item2.type === "talent") {
- if (item2.system.subType === "skill")
- skills.push({ _id: item2._id, name: item2.getRollDisplay() });
+
+ get isPlayMode() {
+ if (this._sheetMode === undefined) this._sheetMode = this.constructor.SHEET_MODES.PLAY;
+ return this._sheetMode === this.constructor.SHEET_MODES.PLAY;
+ }
+
+ get isEditMode() {
+ if (this._sheetMode === undefined) this._sheetMode = this.constructor.SHEET_MODES.PLAY;
+ return this._sheetMode === this.constructor.SHEET_MODES.EDIT;
+ }
+
+ tabGroups = { primary: "stats" }
+
+ /** @override */
+ async _prepareContext() {
+ const base = await super._prepareContext();
+ const actor = this.document;
+ return {
+ ...base,
+ actor: actor,
+ // Flat shorthands for template backward-compat (AppV1 style)
+ name: actor.name,
+ img: actor.img,
+ cssClass: this.isEditable ? "editable" : "locked",
+ system: actor.system,
+ source: actor.toObject(),
+ fields: actor.schema.fields,
+ systemFields: actor.system.schema.fields,
+ isEditable: this.isEditable,
+ isEditMode: this.isEditMode,
+ isPlayMode: this.isPlayMode,
+ isGM: game.user.isGM,
+ config: CONFIG.MGT2,
+ };
+ }
+
+ /** @override */
+ _onRender(context, options) {
+ super._onRender(context, options);
+ this._activateTabGroups();
+ }
+
+ _activateTabGroups() {
+ for (const [group, activeTab] of Object.entries(this.tabGroups)) {
+ const nav = this.element.querySelector(`nav[data-group="${group}"]`);
+ if (!nav) continue;
+
+ nav.querySelectorAll('[data-tab]').forEach(link => {
+ link.classList.toggle('active', link.dataset.tab === activeTab);
+ link.addEventListener('click', event => {
+ event.preventDefault();
+ this.tabGroups[group] = link.dataset.tab;
+ this.render();
+ });
+ });
+
+ this.element.querySelectorAll(`[data-group="${group}"][data-tab]`).forEach(content => {
+ content.classList.toggle('active', content.dataset.tab === activeTab);
+ });
}
- }
}
- skills.sort(MGT2Helper.compareByName);
- skills = [{ _id: "NP", name: game.i18n.localize("MGT2.Items.NotProficient") }].concat(skills);
- foundry.utils.mergeObject(context, {
- source: source.system,
- system: item.system,
- settings,
- containers,
- computers,
- hadContainer,
- weight,
- unitlabels,
- editable: this.isEditable,
- isGM: game.user.isGM,
- skills,
- config: CONFIG
- //rollData: this.item.getRollData(),
- });
- return context;
- }
- /* -------------------------------------------- */
- /** @inheritdoc */
- activateListeners(html) {
- super.activateListeners(html);
- if (!this.isEditable)
- return;
- html.find("div.itemsheet-panel").each((i, li) => {
- });
- if (this.item.type == "career") {
- html.find(".event-create").click(this._onCareerEventCreate.bind(this));
- html.find(".event-delete").click(this._onCareerEventDelete.bind(this));
- } else if (this.item.type == "armor" || this.item.type == "computer" || this.item.type == "species" || this.item.type == "weapon") {
- html.find(".options-create").click(this._onOptionCreate.bind(this));
- html.find(".options-delete").click(this._onOptionDelete.bind(this));
+
+ /** @override */
+ _canDragDrop(selector) {
+ return this.isEditable;
}
- if (this.item.type == "species") {
- html.find(".modifiers-create").click(this._onModifierEventCreate.bind(this));
- html.find(".modifiers-delete").click(this._onModifierEventDelete.bind(this));
+
+ static async #onToggleSheet(event) {
+ event.preventDefault();
+ this._sheetMode = this.isPlayMode
+ ? this.constructor.SHEET_MODES.EDIT
+ : this.constructor.SHEET_MODES.PLAY;
+ this.render();
}
- }
- async _onModifierEventCreate(event) {
- event.preventDefault();
- await this._onSubmit(event);
- let modifiers = this.item.system.modifiers;
- let index;
- if (modifiers.length === 0) {
- modifiers = {};
- modifiers["0"] = { characteristic: "Endurance", value: null };
- } else {
- index = Math.max(...Object.keys(modifiers));
- index++;
- modifiers[index] = { characteristic: "Endurance", value: null };
+}
+
+class MGT2Helper {
+ static POUNDS_CONVERT = 2.20462262185;
+
+ static decimalSeparator;
+ static badDecimalSeparator;
+
+ static {
+ this.decimalSeparator = Number(1.1).toLocaleString().charAt(1);
+ this.badDecimalSeparator = (this.decimalSeparator === "." ? "," : ".");
}
- let update = {
- system: {
- modifiers
- }
- };
- return this.item.update(update);
- }
- async _onModifierEventDelete(event) {
- event.preventDefault();
- await this._onSubmit(event);
- const element = event.currentTarget.closest(".modifiers-part");
- const modifiers = foundry.utils.deepClone(this.item.system.modifiers);
- let index = Number(element.dataset.modifiersPart);
- const newModifiers = [];
- let entries = Object.entries(modifiers);
- if (entries.length > 1) {
- for (const [key, value] of entries) {
- if (key != index)
- newModifiers.push(value);
- }
- }
- let update = {
- system: {
- modifiers: newModifiers
- }
- };
- return this.item.update(update);
- }
- async _onCareerEventCreate(event) {
- event.preventDefault();
- await this._onSubmit(event);
- let events = this.item.system.events;
- let index;
- if (events.length === 0) {
- events = {};
- events["0"] = { age: "", description: "" };
- } else {
- index = Math.max(...Object.keys(events));
- index++;
- events[index] = { age: "", description: "" };
- }
- let update = {
- system: {
- events
- }
- };
- return this.item.update(update);
- }
- async _onCareerEventDelete(event) {
- event.preventDefault();
- await this._onSubmit(event);
- const element = event.currentTarget.closest(".events-part");
- const events = foundry.utils.deepClone(this.item.system.events);
- let index = Number(element.dataset.eventsPart);
- const newEvents = [];
- let entries = Object.entries(events);
- if (entries.length > 1) {
- for (const [key, value] of entries) {
- if (key != index)
- newEvents.push(value);
- }
- }
- let update = {
- system: {
- events: newEvents
- }
- };
- return this.item.update(update);
- }
- async _onOptionCreate(event) {
- event.preventDefault();
- await this._onSubmit(event);
- const property = event.currentTarget.dataset.property;
- let options = this.item.system[property];
- let index;
- if (options.length === 0) {
- options = {};
- options["0"] = { name: "", description: "" };
- } else {
- index = Math.max(...Object.keys(options));
- index++;
- options[index] = { name: "", description: "" };
- }
- let update = {};
- update[`system.${property}`] = options;
- return this.item.update(update);
- }
- async _onOptionDelete(event) {
- event.preventDefault();
- await this._onSubmit(event);
- const element = event.currentTarget.closest(".options-part");
- const property = element.dataset.property;
- const options = foundry.utils.deepClone(this.item.system[property]);
- let index = Number(element.dataset.optionsPart);
- const newOptions = [];
- let entries = Object.entries(options);
- if (entries.length > 1) {
- for (const [key, value] of entries) {
- if (key != index)
- newOptions.push(value);
- }
- }
- let update = {};
- update[`system.${property}`] = newOptions;
- return this.item.update(update);
- }
- // async _onTraitCreate(event) {
- // event.preventDefault();
- // await this._onSubmit(event);
- // const traits = this.item.system.traits;
- // return this.item.update({ "system.traits.parts": traits.parts.concat([["", ""]]) });
- // }
- // async _onTraitDelete(event) {
- // event.preventDefault();
- // await this._onSubmit(event);
- // const element = event.currentTarget.closest(".traits-part");
- // const traits = foundry.utils.deepClone(this.item.system.traits);
- // traits.parts.splice(Number(element.dataset.traitsPart), 1);
- // return this.item.update({ "system.traits.parts": traits.parts });
- // }
- _getSubmitData(updateData = {}) {
- const formData = foundry.utils.expandObject(super._getSubmitData(updateData));
- if (formData.hasOwnProperty("system") && formData.system.hasOwnProperty("container") && this.item.system.hasOwnProperty("equipped")) {
- const equippedChange = this.item.system.equipped !== formData.system.equipped;
- const containerChange = this.item.system.container.id !== formData.system.container.id;
- if (equippedChange) {
- if (formData.system.equipped === true) {
- formData.system.container = {
- //inContainer: false,
- id: ""
- };
+
+ static format = function() {
+ var s = arguments[0];
+ for (var i = 0; i < arguments.length - 1; i++) {
+ var reg = new RegExp("\\{" + i + "\\}", "gm");
+ s = s.replace(reg, arguments[i + 1]);
}
- } else if (containerChange) {
- if (formData.system.container.id !== "" && (this.item.system.container.id === "" || this.item.system.container.id === null)) {
- formData.system.equipped = false;
+ return s;
+ }
+
+ static hasValue(object, property) {
+ return object !== undefined && object.hasOwnProperty(property) && object[property] !== null && object[property] !== undefined && object[property] !== "";
+ }
+
+ static getItemsWeight(items) {
+ let weight = 0;
+ for (let i of items) {
+ let item = i.hasOwnProperty("system") ? i.system : i;
+ if (item.hasOwnProperty("weightless") && item.weightless === true) {
+ continue;
+ }
+
+ if (item.hasOwnProperty("weight")) {
+ let itemQty = item.quantity;
+ if (!isNaN(itemQty) && itemQty > 0) {
+ let itemWeight = item.weight;
+ if (itemWeight > 0) {
+ weight += itemWeight * itemQty;
+ }
+ }
+ }
}
- }
+ return weight;
}
- if (formData.hasOwnProperty("weight")) {
- formData.system.weight = MGT2Helper.convertWeightFromInput(formData.weight);
- delete formData.weight;
+
+ static generateUID() {
+ let result = '';
+ const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
+
+ for (let i = 0; i < 36; i++) {
+ const randomIndex = Math.floor(Math.random() * characters.length);
+ result += characters.charAt(randomIndex);
+ if (i === 8 || i === 12 || i === 16 || i === 20)
+ result += "-";
+ }
+
+ return result;
}
- if (formData.system.hasOwnProperty("quantity")) {
- formData.system.quantity = MGT2Helper.getIntegerFromInput(formData.system.quantity);
+
+ static compareByName(a, b) {
+ if (!a.hasOwnProperty("name") || !b.hasOwnProperty("name")) {
+ return 0;
+ }
+ return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
}
- if (formData.system.hasOwnProperty("cost")) {
- formData.system.cost = MGT2Helper.getIntegerFromInput(formData.system.cost);
+
+ static getDisplayDM(dm) {
+ if (dm === 0) return " (0)";
+ if (dm > 0) return ` (+${dm})`;
+ if (dm < 0) return ` (${dm})`;
+ return "";
+ }
+ static getFormulaDM(dm) {
+ if (dm === 0) return "+0";
+ if (dm > 0) return `+${dm}`;
+ if (dm < 0) return `${dm}`;
+ return "";
+ }
+
+ static getDiceResults(roll) {
+ const results = [];
+ for (const die of roll.dice) {
+ results.push(die.results);
+ }
+ return results.flat(2);
+ }
+
+ static getDiceTotal(roll) {
+ let total = 0;
+ for (const die of roll.dice) {
+ total += die.total;
+ }
+ return total;
+ }
+
+ static getDifficultyValue(difficulty) {
+ switch(difficulty) {
+ case "Simple": return 2;
+ case "Easy": return 4;
+ case "Routine": return 6;
+ case "Average": return 8;
+ case "Difficult": return 10;
+ case "VeryDifficult": return 12;
+ case "Formidable": return 14;
+ case "Impossible": return 16;
+ default:
+ return 0;
+ }
+ }
+
+ static getDifficultyDisplay(difficulty) {
+ switch(difficulty) {
+ case "Simple": return game.i18n.localize("MGT2.Difficulty.Simple") + " (2+)";
+ case "Easy": return game.i18n.localize("MGT2.Difficulty.Easy") + " (4+)";
+ case "Routine": return game.i18n.localize("MGT2.Difficulty.Routine") + " (6+)";
+ case "Average": return game.i18n.localize("MGT2.Difficulty.Average") + " (8+)";
+ case "Difficult": return game.i18n.localize("MGT2.Difficulty.Difficult") + " (10+)";
+ case "VeryDifficult": return game.i18n.localize("MGT2.Difficulty.VeryDifficult") + " (12+)";
+ case "Formidable": return game.i18n.localize("MGT2.Difficulty.Formidable") + " (14+)";
+ case "Impossible": return game.i18n.localize("MGT2.Difficulty.Impossible") + " (16+)";
+ default:
+ return null;
+ }
+ }
+
+ static getRangeDisplay(range) {
+ let value = Number(range.value);
+
+ if (isNaN(value)) return null;
+
+ let label;
+ //if (game.settings.get("mgt2", "useDistanceMetric") === true) {
+ if (range.unit !== null && range.unit !== undefined && range.unit !== "")
+ label = game.i18n.localize(`MGT2.MetricRange.${range.unit}`).toLowerCase();
+ else
+ label = "";
+ //} else {
+ // TODO
+ //}
+
+ return `${value}${label}`;
+ }
+
+ static getWeightLabel() {
+ //const label = game.settings.get("mgt2", "useWeightMetric") === true ? "MGT2.MetricSystem.Weight.kg" : "MGT2.ImperialSystem.Weight.lb";
+ //return game.i18n.localize(label);
+ return game.i18n.localize("MGT2.MetricSystem.Weight.kg");
+ }
+
+ static getDistanceLabel() {
+ //const label = game.settings.get("mgt2", "useDistanceMetric") === true ? "MGT2.MetricSystem.Distance.km" : "MGT2.ImperialSystem.Distance.mi";
+ //return game.i18n.localize(label);
+ return game.i18n.localize("MGT2.MetricSystem.Distance.km");
+ }
+
+ static getIntegerFromInput(data) {
+ return Math.trunc(this.getNumberFromInput(data));
+ }
+
+ static getNumberFromInput(data) {
+ if (data === undefined || data === null) return 0;
+
+ if (typeof data === "string") {
+ let converted = Number(data.replace(/\s+/g, '').replace(this.badDecimalSeparator, this.decimalSeparator).trim());
+ if (isNaN(converted))
+ return 0;
+
+ return converted;
+ }
+
+ let converted = Number(data);
+
+ if (isNaN(converted))
+ return 0;
+
+ return converted;
+ }
+
+ static convertWeightForDisplay(weight) {
+ //if (game.settings.get("mgt2", "useWeightMetric") === true || weight === 0)
+ return weight;
+
+ // Metric to Imperial
+ //const pounds = weight * this.POUNDS_CONVERT;
+ //return Math.round(pounds * 10) / 10;
+ }
+
+ static convertWeightFromInput(weight) {
+ //if (game.settings.get("mgt2", "useWeightMetric") === true || weight === 0)
+ return Math.round(weight * 10) / 10;
+
+ // Imperial to Metric
+ //const kg = this.POUNDS_CONVERT / weight;
+ //return Math.round(kg * 10) / 10;
+ }
+
+ static getDataFromDropEvent(event) {
+ try {
+ return JSON.parse(event.dataTransfer?.getData("text/plain"));
+ } catch (err) {
+ return false;
+ }
+
+ //if ( data.type !== "Item" ) return false;
+ //const item = await Item.implementation.fromDropData(data);
+ }
+
+ static async getItemDataFromDropData(dropData) {
+ //console.log("getItemDataFromDropData");
+ let item;
+ if (game.modules.get("monks-enhanced-journal")?.active && dropData.itemId && dropData.uuid.includes("JournalEntry")) {
+ await fromUuid(dropData.uuid);
+ } else if (dropData.hasOwnProperty("uuid")) {
+ item = await fromUuid(dropData.uuid);
+ } else {
+ let uuid = `${dropData.type}.${dropData.data._id}`;
+ item = await fromUuid(uuid);
+ }
+
+ if (!item) {
+ throw new Error(game.i18n.localize("Errors.CouldNotFindItem").replace("_ITEM_ID_", dropData.uuid));
+ }
+ if (item.pack) {
+ const pack = game.packs.get(item.pack);
+ item = await pack?.getDocument(item._id);
+ }
+ return deepClone(item);
}
- return foundry.utils.flattenObject(formData);
- }
}
class RollPromptDialog extends Dialog {
- constructor(dialogData = {}, options = {}) {
- super(dialogData, options);
- this.options.classes = ["mgt2", game.settings.get("mgt2", "theme"), "sheet", "dialog"];
- }
- static async create(options) {
- const htmlContent = await renderTemplate("systems/mgt2/templates/roll-prompt.html", {
- config: CONFIG.MGT2,
- //formula: formula,
- characteristics: options.characteristics,
- characteristic: options.characteristic,
- skills: options.skills,
- skill: options.skill,
- fatigue: options.fatigue,
- encumbrance: options.encumbrance,
- difficulty: options.difficulty
- });
- const results = new Promise((resolve) => {
- new this({
- title: options.title,
- content: htmlContent,
- buttons: {
- boon: {
- label: game.i18n.localize("MGT2.RollPrompt.Boon"),
- callback: (html) => {
- const formData = new FormDataExtended(html[0].querySelector("form")).object;
- formData.diceModifier = "dl";
- resolve(formData);
- }
- },
- submit: {
- label: game.i18n.localize("MGT2.RollPrompt.Roll"),
- icon: '',
- callback: (html) => {
- const formData = new FormDataExtended(html[0].querySelector("form")).object;
- resolve(formData);
- }
- },
- bane: {
- label: game.i18n.localize("MGT2.RollPrompt.Bane"),
- //icon: '',
- callback: (html) => {
- const formData = new FormDataExtended(html[0].querySelector("form")).object;
- formData.diceModifier = "dh";
- resolve(formData);
- }
- }
- }
- //close: () => { resolve(false) }
- }).render(true);
- });
- return results;
- }
+ constructor(dialogData = {}, options = {}) {
+ super(dialogData, options);
+ this.options.classes = ["mgt2", game.settings.get("mgt2", "theme"), "sheet", "dialog"];
+ }
+
+ static async create(options) {
+
+ const htmlContent = await renderTemplate('systems/mgt2/templates/roll-prompt.html', {
+ config: CONFIG.MGT2,
+ //formula: formula,
+ characteristics: options.characteristics,
+ characteristic: options.characteristic,
+ skills: options.skills,
+ skill: options.skill,
+ fatigue: options.fatigue,
+ encumbrance: options.encumbrance,
+ difficulty: options.difficulty
+ });
+
+ const results = new Promise(resolve => {
+ new this({
+ title: options.title,
+ content: htmlContent,
+ buttons: {
+ boon: {
+ label: game.i18n.localize("MGT2.RollPrompt.Boon"),
+ callback: (html) => {
+ const formData = new FormDataExtended(html[0].querySelector('form')).object;
+ formData.diceModifier = "dl";
+ resolve(formData);
+ }
+ },
+ submit: {
+ label: game.i18n.localize("MGT2.RollPrompt.Roll"),
+ icon: '',
+ callback: (html) => {
+ const formData = new FormDataExtended(html[0].querySelector('form')).object;
+ resolve(formData);
+ },
+ },
+ bane: {
+ label: game.i18n.localize("MGT2.RollPrompt.Bane"),
+ //icon: '',
+ callback: (html) => {
+ const formData = new FormDataExtended(html[0].querySelector('form')).object;
+ formData.diceModifier = "dh";
+ resolve(formData);
+ }
+ }
+ }
+ //close: () => { resolve(false) }
+ }).render(true);
+ });
+
+ //console.log(Promise.resolve(results));
+ return results;
+ }
}
+
class RollPromptHelper {
- static async roll(options) {
- return await RollPromptDialog.create(options);
- }
- static async promptForFruitTraits() {
- const htmlContent = await renderTemplate("systems/mgt2/templateschat/chat/roll-prompt.html");
- return new Promise((resolve, reject) => {
- const dialog = new Dialog({
- title: "Fruit Traits",
- content: htmlContent,
- buttons: {
- submit: {
- label: "Roll",
- icon: '',
- callback: (html) => {
- const formData = new FormDataExtended(html[0].querySelector("form")).toObject();
- resolve(formData);
- }
- },
- skip: {
- label: "Cancel",
- callback: () => resolve(null)
- }
- },
- render: (html) => {
- },
- close: () => {
- reject("User closed dialog without making a selection.");
- }
- });
- dialog.render(true);
- });
- }
+
+ static async roll(options) {
+ return await RollPromptDialog.create(options);
+ }
+
+ static async promptForFruitTraits() {
+ const htmlContent = await renderTemplate('systems/mgt2/templateschat/chat/roll-prompt.html');
+
+ return new Promise((resolve, reject) => {
+ const dialog = new Dialog({
+ title: "Fruit Traits",
+ content: htmlContent,
+ buttons: {
+ submit: {
+ label: "Roll",
+ icon: '',
+ callback: (html) => {
+ const formData = new FormDataExtended(html[0].querySelector('form'))
+ .toObject();
+
+ //verifyFruitInputs(formData);
+
+ resolve(formData);
+ },
+ },
+ skip: {
+ label: "Cancel",
+ callback: () => resolve(null),
+ }
+ },
+ render: (html) => {
+ //html.on('click', 'button[data-preset]', handleFruitPreset);
+ },
+ close: () => {
+ reject('User closed dialog without making a selection.');
+ },
+ });
+
+ dialog.render(true);
+ });
+ }
}
class EditorFullViewDialog extends Dialog {
- constructor(dialogData = {}, options = {}) {
- super(dialogData, options);
- this.options.classes = ["mgt2", game.settings.get("mgt2", "theme"), "sheet"];
- this.options.resizable = true;
- }
- static async create(title, html) {
- const htmlContent = await renderTemplate("systems/mgt2/templates/editor-fullview.html", {
- config: CONFIG.MGT2,
- html
- });
- const results = new Promise((resolve) => {
- new this({
- title,
- content: htmlContent,
- buttons: {
- //close: { label: game.i18n.localize("MGT2.Close") }
- }
- }).render(true);
- });
- return results;
- }
+ constructor(dialogData = {}, options = {}) {
+ super(dialogData, options);
+ this.options.classes = ["mgt2", game.settings.get("mgt2", "theme"), "sheet"];
+ this.options.resizable = true;
+ }
+
+ static async create(title, html) {
+ const htmlContent = await renderTemplate("systems/mgt2/templates/editor-fullview.html", {
+ config: CONFIG.MGT2,
+ html: html
+ });
+
+ const results = new Promise(resolve => {
+ new this({
+ title: title,
+ content: htmlContent,
+ buttons: {
+ //close: { label: game.i18n.localize("MGT2.Close") }
+ }
+ }).render(true);
+ });
+
+ return results;
+ }
}
+
class ActorConfigDialog extends Dialog {
- constructor(dialogData = {}, options = {}) {
- super(dialogData, options);
- this.options.classes = ["mgt2", game.settings.get("mgt2", "theme"), "sheet"];
- }
- static async create(system) {
- const htmlContent = await renderTemplate("systems/mgt2/templates/actors/actor-config-sheet.html", {
- config: CONFIG.MGT2,
- system
- });
- const results = new Promise((resolve) => {
- new this({
- title: "Configuration",
- content: htmlContent,
- buttons: {
- submit: {
- label: game.i18n.localize("MGT2.Save"),
- icon: '',
- callback: (html) => {
- const formData = new FormDataExtended(html[0].querySelector("form")).object;
- resolve(formData);
- }
- }
- }
- }).render(true);
- });
- return results;
- }
+ constructor(dialogData = {}, options = {}) {
+ super(dialogData, options);
+ this.options.classes = ["mgt2", game.settings.get("mgt2", "theme"), "sheet"];
+ }
+
+ static async create(system) {
+ const htmlContent = await renderTemplate("systems/mgt2/templates/actors/actor-config-sheet.html", {
+ config: CONFIG.MGT2,
+ system: system
+ });
+
+ const results = new Promise(resolve => {
+ new this({
+ title: "Configuration",
+ content: htmlContent,
+ buttons: {
+ submit: {
+ label: game.i18n.localize("MGT2.Save"),
+ icon: '',
+ callback: (html) => {
+ const formData = new FormDataExtended(html[0].querySelector('form')).object;
+ resolve(formData);
+ },
+ }
+ }
+ }).render(true);
+ });
+
+ return results;
+ }
}
+
class ActorCharacteristicDialog extends Dialog {
- // https://foundryvtt.wiki/en/development/api/dialog
- constructor(dialogData = {}, options = {}) {
- super(dialogData, options);
- this.options.classes = ["mgt2", game.settings.get("mgt2", "theme"), "sheet"];
- }
- static async create(name, show, showMax, showAll = false) {
- const htmlContent = await renderTemplate("systems/mgt2/templates/actors/actor-config-characteristic-sheet.html", {
- name,
- show,
- showMax,
- showAll
- });
- const results = new Promise((resolve) => {
- new this({
- title: "Configuration: " + name,
- content: htmlContent,
- buttons: {
- submit: {
- label: game.i18n.localize("MGT2.Save"),
- icon: '',
- callback: (html) => {
- const formData = new FormDataExtended(html[0].querySelector("form")).object;
- resolve(formData);
- }
- }
- }
- }).render(true);
- });
- return results;
- }
+ // https://foundryvtt.wiki/en/development/api/dialog
+ constructor(dialogData = {}, options = {}) {
+ super(dialogData, options);
+ this.options.classes = ["mgt2", game.settings.get("mgt2", "theme"), "sheet"];
+ }
+
+ static async create(name, show, showMax, showAll = false) {
+ const htmlContent = await renderTemplate("systems/mgt2/templates/actors/actor-config-characteristic-sheet.html", {
+ name: name,
+ show: show,
+ showMax: showMax,
+ showAll: showAll
+ });
+
+ const results = new Promise(resolve => {
+ new this({
+ title: "Configuration: " + name,
+ content: htmlContent,
+ buttons: {
+ submit: {
+ label: game.i18n.localize("MGT2.Save"),
+ icon: '',
+ callback: (html) => {
+ const formData = new FormDataExtended(html[0].querySelector('form')).object;
+ resolve(formData);
+ },
+ }
+ }
+ }).render(true);
+ });
+
+ return results;
+ }
}
+
class TraitEditDialog extends Dialog {
- constructor(dialogData = {}, options = {}) {
- super(dialogData, options);
- this.options.classes = ["mgt2", game.settings.get("mgt2", "theme"), "sheet"];
- }
- static async create(data) {
- const htmlContent = await renderTemplate("systems/mgt2/templates/actors/trait-sheet.html", {
- config: CONFIG.MGT2,
- data
- });
- const title = data.hasOwnProperty("name") && data.name !== void 0 ? data.name : game.i18n.localize("MGT2.Actor.EditTrait");
- const results = new Promise((resolve) => {
- new this({
- title,
- content: htmlContent,
- buttons: {
- submit: {
- label: game.i18n.localize("MGT2.Save"),
- icon: '',
- callback: (html) => {
- const formData = new FormDataExtended(html[0].querySelector("form")).object;
- resolve(formData);
- }
- }
- //cancel: { label: "Cancel" }
- }
- // close: (html) => {
- // console.log("This always is logged no matter which option is chosen");
- // const formData = new FormDataExtended(html[0].querySelector('form')).object;
- // resolve(formData);
- // }
- }).render(true);
- });
- return results;
- }
+ constructor(dialogData = {}, options = {}) {
+ super(dialogData, options);
+ this.options.classes = ["mgt2", game.settings.get("mgt2", "theme"), "sheet"];
+ }
+
+ static async create(data) {
+ const htmlContent = await renderTemplate("systems/mgt2/templates/actors/trait-sheet.html", {
+ config: CONFIG.MGT2,
+ data: data
+ });
+ const title = data.hasOwnProperty("name") && data.name !== undefined ? data.name : game.i18n.localize("MGT2.Actor.EditTrait");
+ const results = new Promise(resolve => {
+ new this({
+ title: title,
+ content: htmlContent,
+ buttons: {
+ submit: {
+ label: game.i18n.localize("MGT2.Save"),
+ icon: '',
+ callback: (html) => {
+ const formData = new FormDataExtended(html[0].querySelector('form')).object;
+ resolve(formData);
+ },
+ }
+ //cancel: { label: "Cancel" }
+ }
+ // close: (html) => {
+ // console.log("This always is logged no matter which option is chosen");
+ // const formData = new FormDataExtended(html[0].querySelector('form')).object;
+ // resolve(formData);
+ // }
+ }).render(true);
+ });
+
+ return results;
+ }
}
+
class CharacterPrompts {
- static async openConfig(system) {
- return await ActorConfigDialog.create(system);
- }
- static async openCharacteristic(name, hide, showMax, showAll = false) {
- return await ActorCharacteristicDialog.create(name, hide, showMax, showAll);
- }
- static async openTraitEdit(data) {
- return await TraitEditDialog.create(data);
- }
- static async openEditorFullView(title, html) {
- return await EditorFullViewDialog.create(title, html);
- }
+
+ static async openConfig(system) {
+ return await ActorConfigDialog.create(system);
+ }
+
+ static async openCharacteristic(name, hide, showMax, showAll = false) {
+ return await ActorCharacteristicDialog.create(name, hide, showMax, showAll);
+ }
+
+ static async openTraitEdit(data) {
+ return await TraitEditDialog.create(data);
+ }
+
+ static async openEditorFullView(title, html) {
+ return await EditorFullViewDialog.create(title, html);
+ }
}
-class TravellerActorSheet extends ActorSheet {
- /** @inheritdoc */
- static get defaultOptions() {
- const options = super.defaultOptions;
- if (game.user.isGM || options.editable)
- options.dragDrop.push({ dragSelector: ".drag-item-list", dropSelector: ".drop-item-list" });
- return foundry.utils.mergeObject(options, {
- classes: ["mgt2", game.settings.get("mgt2", "theme"), "sheet", "actor", "character", "nopad"],
- template: "systems/mgt2/templates/actors/actor-sheet.html",
- width: 780,
- //height: 600,
- tabs: [
- { navSelector: ".sheet-sidebar", contentSelector: "form" },
- { navSelector: "nav[data-group='characteristics']", contentSelector: "section.characteristics-panel", initial: "core" },
- { navSelector: "nav[data-group='inventory']", contentSelector: "div.tab[data-tab='inventory']", initial: "onhand" }
- ]
- });
- }
- async getData(options) {
- const context = super.getData(options);
- this._prepareCharacterItems(context);
- return context.data;
- }
- _prepareCharacterItems(sheetData) {
- const actorData = sheetData.data;
- actorData.isGM = game.user.isGM;
- actorData.showTrash = false;
- actorData.initiative = this.actor.getInitiative();
- const weapons = [];
- const armors = [];
- const augments = [];
- const computers = [];
- const softwares = [];
- const items = [];
- const equipments = [];
- const containerItems = [];
- const careers = [];
- const skills = [];
- const psionics = [];
- const diseases = [];
- const wounds = [];
- const contacts = [];
- const settings = {
- weightUnit: "kg",
- //weightUnit: game.settings.get("mgt2", "useWeightMetric") ? "kg" : "lb",
- usePronouns: game.settings.get("mgt2", "usePronouns"),
- useGender: game.settings.get("mgt2", "useGender"),
- showLife: game.settings.get("mgt2", "showLife")
- };
- actorData.settings = settings;
- const actorContainers = [];
- for (let item of sheetData.items) {
- if (item.type === "container") {
- actorContainers.push(item);
- } else if (item.type === "computer") {
- computers.push(item);
- item.subItems = [];
- if (item.system.overload === true)
- item.overloadClass = "computer-overload";
- }
+class TravellerCharacterSheet extends MGT2ActorSheet {
+
+ /** @override */
+ static DEFAULT_OPTIONS = {
+ ...super.DEFAULT_OPTIONS,
+ classes: [...super.DEFAULT_OPTIONS.classes, "character", "nopad"],
+ window: {
+ ...super.DEFAULT_OPTIONS.window,
+ title: "TYPES.Actor.character",
+ },
+ actions: {
+ ...super.DEFAULT_OPTIONS.actions,
+ createItem: TravellerCharacterSheet.#onCreateItem,
+ editItem: TravellerCharacterSheet.#onEditItem,
+ deleteItem: TravellerCharacterSheet.#onDeleteItem,
+ equipItem: TravellerCharacterSheet.#onEquipItem,
+ itemStorageIn: TravellerCharacterSheet.#onItemStorageIn,
+ itemStorageOut: TravellerCharacterSheet.#onItemStorageOut,
+ softwareEject: TravellerCharacterSheet.#onSoftwareEject,
+ createContainer: TravellerCharacterSheet.#onContainerCreate,
+ editContainer: TravellerCharacterSheet.#onContainerEdit,
+ deleteContainer: TravellerCharacterSheet.#onContainerDelete,
+ roll: TravellerCharacterSheet.#onRoll,
+ openConfig: TravellerCharacterSheet.#onOpenConfig,
+ openCharacteristic: TravellerCharacterSheet.#onOpenCharacteristic,
+ traitCreate: TravellerCharacterSheet.#onTraitCreate,
+ traitEdit: TravellerCharacterSheet.#onTraitEdit,
+ traitDelete: TravellerCharacterSheet.#onTraitDelete,
+ openEditor: TravellerCharacterSheet.#onOpenEditor,
+ },
}
- actorContainers.sort(MGT2Helper.compareByName);
- const containers = [{ "name": game.i18n.localize("MGT2.Items.SelectAll"), "_id": "", "display": game.i18n.localize("MGT2.Items.SelectAll") }].concat(actorContainers);
- const containerIndex = /* @__PURE__ */ new Map();
- for (let c of actorContainers) {
- containerIndex.set(c._id, c);
- if (c.system.weight > 0) {
- c.weight = MGT2Helper.convertWeightForDisplay(c.system.weight) + " " + settings.weightUnit;
- c.display = c.name.length > 12 ? `${c.name.substring(0, 12)}... (${c.weight})` : `${c.name} (${c.weight})`;
- } else {
- c.display = c.name.length > 12 ? c.name.substring(0, 12) + "..." : c.name;
- }
- if (c.system.onHand === true)
- c.subItems = [];
+
+ /** @override */
+ static PARTS = {
+ sheet: {
+ template: "systems/mgt2/templates/actors/actor-sheet.html",
+ },
}
- let currentContainerView;
- if (actorData.system.containerView !== "") {
- currentContainerView = containerIndex.get(actorData.system.containerView);
- if (currentContainerView !== void 0) {
- actorData.containerView = currentContainerView;
- actorData.containerWeight = MGT2Helper.convertWeightForDisplay(currentContainerView.system.weight);
- } else {
- currentContainerView = null;
- actorData.containerWeight = MGT2Helper.convertWeightForDisplay(0);
- }
- } else {
- currentContainerView = null;
- actorData.containerWeight = MGT2Helper.convertWeightForDisplay(0);
+
+ /** @override */
+ tabGroups = {
+ primary: "inventory",
+ characteristics: "core",
+ inventory: "onhand",
}
- actorData.containerShowAll = actorData.system.containerView === "";
- for (let i of sheetData.items) {
- let item = i.system;
- if (i.system.hasOwnProperty("weight") && i.system.weight > 0) {
- if (isNaN(i.system.quantity))
- i.weight = MGT2Helper.convertWeightForDisplay(i.system.weight) + " " + settings.weightUnit;
- else
- i.weight = MGT2Helper.convertWeightForDisplay(i.system.weight * i.system.quantity) + " " + settings.weightUnit;
- }
- if (item.hasOwnProperty("container") && item.container.id !== "" && item.container.id !== void 0) {
- let container = containerIndex.get(item.container.id);
- if (container === void 0) {
- if (actorData.containerShowAll) {
- i.containerName = "#deleted#";
- containerItems.push(i);
- }
- continue;
+
+ /** @override */
+ async _prepareContext() {
+ const context = await super._prepareContext();
+ const actor = this.document;
+
+ context.settings = {
+ weightUnit: "kg",
+ usePronouns: game.settings.get("mgt2", "usePronouns"),
+ useGender: game.settings.get("mgt2", "useGender"),
+ showLife: game.settings.get("mgt2", "showLife"),
+ };
+ context.isGM = game.user.isGM;
+ context.showTrash = false;
+ context.initiative = actor.getInitiative();
+
+ this._prepareCharacterItems(context);
+
+ return context;
+ }
+
+ _prepareCharacterItems(context) {
+ const actor = this.document;
+ const settings = context.settings;
+ const items = actor.items;
+
+ const weapons = [], armors = [], augments = [], computers = [], softwares = [];
+ const miscItems = [], equipments = [], containerItems = [], careers = [];
+ const skills = [], psionics = [], diseases = [], wounds = [], contacts = [];
+ const actorContainers = [];
+
+ for (let i of items) {
+ if (i.type === "container") {
+ actorContainers.push(i);
+ } else if (i.type === "computer") {
+ computers.push(i);
+ i._subItems = [];
+ if (i.system.overload === true)
+ i._overloadClass = "computer-overload";
+ }
}
- if (container.system.locked && !game.user.isGM)
- continue;
- if (container.system.onHand === true) {
- container.subItems.push(i);
- }
- if (actorData.containerShowAll || !actorData.containerShowAll && actorData.system.containerView == item.container.id) {
- if (container === void 0)
- i.containerName = "#deleted#";
- else
- i.containerName = container.name;
- containerItems.push(i);
- }
- continue;
- }
- if (i.system.hasOwnProperty("equipped")) {
- i.canEquip = true;
- if (i.system.equipped === true)
- i.toggleClass = "active";
- } else {
- i.canEquip = false;
- }
- switch (i.type) {
- case "equipment":
- switch (i.system.subType) {
- case "augment":
- augments.push(i);
- break;
- default:
- equipments.push(i);
- break;
- }
- break;
- case "armor":
- armors.push(i);
- if (i.system.options && i.system.options.length > 0) {
- i.subInfo = i.system.options.map((x) => x.name).join(", ");
- }
- break;
- case "computer":
- if (i.system.options && i.system.options.length > 0) {
- i.subInfo = i.system.options.map((x) => x.name).join(", ");
- }
- break;
- case "item":
- if (i.system.subType === "software") {
- if (i.system.software.computerId && i.system.software.computerId !== "") {
- const computer = computers.find((x) => x._id === i.system.software.computerId);
- if (computer !== void 0)
- computer.subItems.push(i);
- else
- softwares.push(i);
+
+ actorContainers.sort(MGT2Helper.compareByName);
+
+ const containers = [{ name: "(tous)", _id: "" }].concat(actorContainers);
+ const containerIndex = new Map();
+
+ for (let c of actorContainers) {
+ containerIndex.set(c._id, c);
+
+ if (c.system.weight > 0) {
+ const w = MGT2Helper.convertWeightForDisplay(c.system.weight) + " " + settings.weightUnit;
+ c._display = c.name.length > 12 ? `${c.name.substring(0, 12)}... (${w})` : `${c.name} (${w})`;
} else {
- if (i.system.software.bandwidth > 0)
- i.display = `${i.name} (${i.system.software.bandwidth})`;
- else
- i.display = i.name;
- softwares.push(i);
+ c._display = c.name.length > 12 ? c.name.substring(0, 12) + "..." : c.name;
}
- } else {
- items.push(i);
- }
- break;
- case "weapon":
- if (i.system.range.isMelee)
- i.range = game.i18n.localize("MGT2.Melee");
- else {
- i.range = MGT2Helper.getRangeDisplay(i.system.range);
- }
- if (i.system.traits && i.system.traits.length > 0) {
- i.subInfo = i.system.traits.map((x) => x.name).join(", ");
- }
- weapons.push(i);
- break;
- case "career":
- careers.push(i);
- break;
- case "contact":
- contacts.push(i);
- break;
- case "disease":
- switch (i.system.subType) {
- case "wound":
- wounds.push(i);
- break;
- default:
- diseases.push(i);
- break;
- }
- break;
- case "talent":
- if (i.system.subType === "skill") {
- skills.push(i);
- } else {
- if (MGT2Helper.hasValue(i.system.psionic, "reach")) {
- i.reach = game.i18n.localize(`MGT2.PsionicReach.${i.system.psionic.reach}`);
+
+ if (c.system.onHand === true)
+ c._subItems = [];
+ }
+
+ const containerView = actor.system.containerView;
+ let currentContainerView = containerView !== "" ? containerIndex.get(containerView) : null;
+
+ context.containerView = currentContainerView || null;
+ context.containerWeight = currentContainerView
+ ? MGT2Helper.convertWeightForDisplay(currentContainerView.system.weight)
+ : MGT2Helper.convertWeightForDisplay(0);
+ context.containerShowAll = containerView === "";
+
+ for (let i of items) {
+ const item = i.system;
+
+ if (item.hasOwnProperty("weight") && item.weight > 0) {
+ i._weight = isNaN(item.quantity)
+ ? MGT2Helper.convertWeightForDisplay(item.weight) + " " + settings.weightUnit
+ : MGT2Helper.convertWeightForDisplay(item.weight * item.quantity) + " " + settings.weightUnit;
}
- if (MGT2Helper.hasValue(i.system.roll, "difficulty")) {
- i.difficulty = game.i18n.localize(`MGT2.Difficulty.${i.system.roll.difficulty}`);
+
+ if (item.hasOwnProperty("container") && item.container.id !== "" && item.container.id !== undefined) {
+ const container = containerIndex.get(item.container.id);
+ if (container === undefined) {
+ if (context.containerShowAll) {
+ i._containerName = "#deleted#";
+ containerItems.push(i);
+ }
+ continue;
+ }
+
+ if (container.system.locked && !game.user.isGM) continue;
+
+ if (container.system.onHand === true)
+ container._subItems.push(i);
+
+ if (context.containerShowAll || actor.system.containerView === item.container.id) {
+ i._containerName = container.name;
+ containerItems.push(i);
+ }
+ continue;
}
- psionics.push(i);
- }
- break;
- case "container":
- if (i.system.onHand === true) {
- items.push(i);
- }
- break;
- }
- }
- actorData.encumbranceNormal = MGT2Helper.convertWeightForDisplay(actorData.system.inventory.encumbrance.normal);
- actorData.encumbranceHeavy = MGT2Helper.convertWeightForDisplay(actorData.system.inventory.encumbrance.heavy);
- if (actorData.system.inventory.weight > actorData.system.inventory.encumbrance.heavy) {
- actorData.encumbranceClasses = "encumbrance-heavy";
- actorData.encumbrance = 2;
- } else if (actorData.system.inventory.weight > actorData.system.inventory.encumbrance.normal) {
- actorData.encumbranceClasses = "encumbrance-normal";
- actorData.encumbrance = 1;
- } else {
- actorData.encumbrance = 0;
- }
- if (softwares.length > 0) {
- softwares.sort(MGT2Helper.compareByName);
- actorData.softwares = softwares;
- }
- augments.sort(this.compareEquippedByName);
- actorData.augments = augments;
- armors.sort(this.compareEquippedByName);
- actorData.armors = armors;
- computers.sort(this.compareEquippedByName);
- actorData.computers = computers;
- actorData.careers = careers;
- contacts.sort(MGT2Helper.compareByName);
- actorData.contacts = contacts;
- containers.sort(MGT2Helper.compareByName);
- actorData.containers = containers;
- diseases.sort(MGT2Helper.compareByName);
- actorData.diseases = diseases;
- actorData.wounds = wounds;
- equipments.sort(this.compareEquippedByName);
- actorData.equipments = equipments;
- items.sort(this.compareEquippedByName);
- actorData.items = items;
- actorContainers.sort(MGT2Helper.compareByName);
- actorData.actorContainers = actorContainers;
- skills.sort(MGT2Helper.compareByName);
- actorData.skills = skills;
- psionics.sort(MGT2Helper.compareByName);
- actorData.psionics = psionics;
- weapons.sort(this.compareEquippedByName);
- actorData.weapons = weapons;
- if (containerItems.length > 0) {
- containerItems.sort((a, b) => {
- const containerResult = a.containerName.localeCompare(b.containerName);
- if (containerResult !== 0)
- return containerResult;
- return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
- });
- }
- actorData.containerItems = containerItems;
- }
- compareEquippedByName(a, b) {
- return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
- }
- activateListeners(html) {
- super.activateListeners(html);
- if (!this.options.editable)
- return;
- html.find(".container-create").click(this._onContainerCreate.bind(this));
- html.find(".container-edit").click((ev) => {
- const container = this.actor.getEmbeddedDocument("Item", this.actor.system.containerView);
- container.sheet.render(true);
- });
- html.find(".container-delete").click((ev) => {
- ev.preventDefault();
- const containers = this.actor.getContainers();
- const container = containers.find((x) => x._id == this.actor.system.containerView);
- const containerItems = this.actor.items.filter((x) => x.system.hasOwnProperty("container") && x.system.container.id === container._id);
- if (containerItems.length > 0) {
- for (let item of containerItems) {
- let clone = duplicate(item);
- clone.system.container.id = "";
- this.actor.updateEmbeddedDocuments("Item", [clone]);
- }
- }
- const cloneActor = duplicate(this.actor);
- cloneActor.system.containerView = "";
- if (cloneActor.system.containerDropIn === container._id) {
- cloneActor.system.containerDropIn = "";
- const remainingContainers = containers.filter((x) => x._id !== container._id);
- if (remainingContainers.length > 0)
- cloneActor.system.containerDropIn = remainingContainers[0]._id;
- }
- this.actor.deleteEmbeddedDocuments("Item", [container._id]);
- this.actor.update(cloneActor);
- });
- html.find(".item-create").click(this._onItemCreate.bind(this));
- html.find(".item-edit").click((ev) => {
- ev.preventDefault();
- const html2 = $(ev.currentTarget).parents("[data-item-id]");
- const item = this.actor.getEmbeddedDocument("Item", html2.data("itemId"));
- item.sheet.render(true);
- });
- html.find(".item-delete").click((ev) => {
- ev.preventDefault();
- const html2 = $(ev.currentTarget).parents("[data-item-id]");
- this.actor.deleteEmbeddedDocuments("Item", [html2.data("itemId")]);
- html2.slideUp(200, () => this.render(false));
- });
- html.find("a.item-equip").click(this._onItemEquip.bind(this));
- html.find("a.item-storage-out").click(this._onItemStorageOut.bind(this));
- html.find("a.item-storage-in").click(this._onItemStorageIn.bind(this));
- html.find("a.software-eject").click(this._onSoftwareEject.bind(this));
- html.find("a[data-roll]").click(this._onRoll.bind(this));
- html.find('a[name="config"]').click(this._onOpenConfig.bind(this));
- html.find("a[data-cfg-characteristic]").click(this._onOpenCharacteristic.bind(this));
- html.find(".traits-create").click(this._onTraitCreate.bind(this));
- html.find(".traits-edit").click(this._onTraitEdit.bind(this));
- html.find(".traits-delete").click(this._onTraitDelete.bind(this));
- html.find('a[data-editor="open"]').click(this._onOpenEditor.bind(this));
- }
- async _onOpenEditor(event) {
- event.preventDefault();
- await CharacterPrompts.openEditorFullView(this.actor.system.personal.species, this.actor.system.personal.speciesText.descriptionLong);
- }
- async _onTraitCreate(event) {
- event.preventDefault();
- await this._onSubmit(event);
- let traits = this.actor.system.personal.traits;
- let index;
- if (traits.length === 0) {
- traits = {};
- traits["0"] = { name: "", description: "" };
- } else {
- index = Math.max(...Object.keys(traits));
- index++;
- traits[index] = { name: "", description: "" };
- }
- return this.actor.update({ system: { personal: { traits } } });
- }
- async _onTraitEdit(event) {
- event.preventDefault();
- const index = $(event.currentTarget).parents("[data-traits-part]").data("traits-part");
- const trait = this.actor.system.personal.traits[index];
- let result = await CharacterPrompts.openTraitEdit(trait);
- const traits = this.actor.system.personal.traits;
- traits[index].name = result.name;
- traits[index].description = result.description;
- return this.actor.update({ system: { personal: { traits } } });
- }
- async _onTraitDelete(event) {
- event.preventDefault();
- await this._onSubmit(event);
- const element = event.currentTarget.closest(".traits-part");
- const traits = foundry.utils.deepClone(this.actor.system.personal.traits);
- let index = Number(element.dataset.traitsPart);
- const newTraits = [];
- let entries = Object.entries(traits);
- if (entries.length > 1) {
- for (const [key, value] of entries) {
- if (key != index)
- newTraits.push(value);
- }
- }
- return this.actor.update({ system: { personal: { traits: newTraits } } });
- }
- async _onOpenConfig(ev) {
- ev.preventDefault();
- const userConfig = await CharacterPrompts.openConfig(this.actor.system);
- if (userConfig) {
- this.actor.update({ "system.config": userConfig });
- }
- }
- async _onOpenCharacteristic(ev) {
- ev.preventDefault();
- const name = ev.currentTarget.dataset.cfgCharacteristic;
- const c = this.actor.system.characteristics[name];
- let showAll = false;
- for (const [key, value] of Object.entries(this.actor.system.characteristics)) {
- if (!value.show) {
- showAll = true;
- break;
- }
- }
- const userConfig = await CharacterPrompts.openCharacteristic(game.i18n.localize(`MGT2.Characteristics.${name}.name`), c.show, c.showMax, showAll);
- if (userConfig) {
- const data = {
- system: {
- characteristics: {}
- }
- };
- data.system.characteristics[name] = {
- show: userConfig.show,
- showMax: userConfig.showMax
- };
- if (userConfig.showAll === true) {
- for (const [key, value] of Object.entries(this.actor.system.characteristics)) {
- if (key !== name && !value.show) {
- data.system.characteristics[key] = { show: true };
- }
- }
- }
- this.actor.update(data);
- }
- }
- async _onRoll(event) {
- event.preventDefault();
- const rollOptions = {
- rollTypeName: game.i18n.localize("MGT2.RollPrompt.Roll"),
- rollObjectName: "",
- characteristics: [{ _id: "", name: "" }],
- characteristic: "",
- skills: [],
- skill: "",
- fatigue: this.actor.system.states.fatigue,
- encumbrance: this.actor.system.states.encumbrance,
- difficulty: null,
- damageFormula: null
- };
- const cardButtons = [];
- for (const [key, label] of Object.entries(MGT2.Characteristics)) {
- const c = this.actor.system.characteristics[key];
- if (c.show) {
- rollOptions.characteristics.push({ _id: key, name: game.i18n.localize(label) + MGT2Helper.getDisplayDM(c.dm) });
- }
- }
- for (let item of this.actor.items) {
- if (item.type === "talent") {
- if (item.system.subType === "skill")
- rollOptions.skills.push({ _id: item._id, name: item.getRollDisplay() });
- }
- }
- rollOptions.skills.sort(MGT2Helper.compareByName);
- rollOptions.skills = [{ _id: "NP", name: game.i18n.localize("MGT2.Items.NotProficient") }].concat(rollOptions.skills);
- let itemObj = null;
- let isInitiative = false;
- const button = event.currentTarget;
- if (button.dataset.roll === "initiative") {
- rollOptions.rollTypeName = game.i18n.localize("MGT2.RollPrompt.InitiativeRoll");
- rollOptions.characteristic = this.actor.system.config.initiative;
- isInitiative = true;
- } else if (button.dataset.roll === "characteristic") {
- rollOptions.characteristic = button.dataset.rollCharacteristic;
- rollOptions.rollTypeName = game.i18n.localize("MGT2.RollPrompt.CharacteristicRoll");
- rollOptions.rollObjectName = game.i18n.localize(`MGT2.Characteristics.${rollOptions.characteristic}.name`);
- } else {
- if (button.dataset.roll === "skill") {
- rollOptions.skill = button.dataset.rollSkill;
- itemObj = this.actor.getEmbeddedDocument("Item", rollOptions.skill);
- rollOptions.rollTypeName = game.i18n.localize("MGT2.RollPrompt.SkillRoll");
- rollOptions.rollObjectName = itemObj.name;
- } else {
- if (button.dataset.roll === "psionic") {
- rollOptions.rollTypeName = game.i18n.localize("MGT2.RollPrompt.PsionicRoll");
- }
- }
- if (itemObj === null && button.dataset.itemId) {
- itemObj = this.actor.getEmbeddedDocument("Item", button.dataset.itemId);
- rollOptions.rollObjectName = itemObj.name;
- if (itemObj.type === "weapon")
- rollOptions.rollTypeName = game.i18n.localize("TYPES.Item.weapon");
- else if (itemObj.type === "armor")
- rollOptions.rollTypeName = game.i18n.localize("TYPES.Item.armor");
- else if (itemObj.type === "computer")
- rollOptions.rollTypeName = game.i18n.localize("TYPES.Item.computer");
- }
- if (button.dataset.roll === "psionic") {
- rollOptions.rollObjectName = itemObj.name;
- if (MGT2Helper.hasValue(itemObj.system.psionic, "duration")) {
- cardButtons.push({
- label: game.i18n.localize("MGT2.Items.Duration"),
- formula: itemObj.system.psionic.duration,
- message: {
- objectName: itemObj.name,
- flavor: "{0} ".concat(game.i18n.localize(`MGT2.Durations.${itemObj.system.psionic.durationUnit}`))
+
+ if (item.hasOwnProperty("equipped")) {
+ i._canEquip = true;
+ i._toggleClass = item.equipped ? "active" : "";
+ } else {
+ i._canEquip = false;
+ }
+
+ switch (i.type) {
+ case "equipment":
+ (i.system.subType === "augment" ? augments : equipments).push(i);
+ break;
+
+ case "armor":
+ if (i.system.options?.length > 0)
+ i._subInfo = i.system.options.map(x => x.name).join(", ");
+ armors.push(i);
+ break;
+
+ case "computer":
+ if (i.system.options?.length > 0)
+ i._subInfo = i.system.options.map(x => x.name).join(", ");
+ break;
+
+ case "item":
+ if (i.system.subType === "software") {
+ if (i.system.software.computerId && i.system.software.computerId !== "") {
+ const computer = computers.find(x => x._id === i.system.software.computerId);
+ if (computer !== undefined) computer._subItems.push(i);
+ else softwares.push(i);
+ } else {
+ i._display = i.system.software.bandwidth > 0
+ ? `${i.name} (${i.system.software.bandwidth})`
+ : i.name;
+ softwares.push(i);
+ }
+ } else {
+ miscItems.push(i);
+ }
+ break;
+
+ case "weapon":
+ i._range = i.system.range.isMelee
+ ? game.i18n.localize("MGT2.Melee")
+ : MGT2Helper.getRangeDisplay(i.system.range);
+ if (i.system.traits?.length > 0)
+ i._subInfo = i.system.traits.map(x => x.name).join(", ");
+ weapons.push(i);
+ break;
+
+ case "career":
+ careers.push(i);
+ break;
+
+ case "contact":
+ contacts.push(i);
+ break;
+
+ case "disease":
+ (i.system.subType === "wound" ? wounds : diseases).push(i);
+ break;
+
+ case "talent":
+ if (i.system.subType === "skill") {
+ skills.push(i);
+ } else {
+ if (MGT2Helper.hasValue(i.system.psionic, "reach"))
+ i._reach = game.i18n.localize(`MGT2.PsionicReach.${i.system.psionic.reach}`);
+ if (MGT2Helper.hasValue(i.system.roll, "difficulty"))
+ i._difficulty = game.i18n.localize(`MGT2.Difficulty.${i.system.roll.difficulty}`);
+ psionics.push(i);
+ }
+ break;
+
+ case "container":
+ if (i.system.onHand === true)
+ miscItems.push(i);
+ break;
}
- });
}
- }
- if (itemObj.system.hasOwnProperty("damage")) {
- rollOptions.damageFormula = itemObj.system.damage;
- if (itemObj.type === "disease") {
- if (itemObj.system.subTypetype === "disease") {
- rollOptions.rollTypeName = game.i18n.localize("MGT2.DiseaseSubType.disease");
- } else if (itemObj.system.subTypetype === "poison") {
- rollOptions.rollTypeName = game.i18n.localize("MGT2.DiseaseSubType.poison");
- }
- }
- }
- if (itemObj.system.hasOwnProperty("roll")) {
- if (MGT2Helper.hasValue(itemObj.system.roll, "characteristic")) {
- rollOptions.characteristic = itemObj.system.roll.characteristic;
- }
- if (MGT2Helper.hasValue(itemObj.system.roll, "skill")) {
- rollOptions.skill = itemObj.system.roll.skill;
- }
- if (MGT2Helper.hasValue(itemObj.system.roll, "difficulty")) {
- rollOptions.difficulty = itemObj.system.roll.difficulty;
- }
- }
- }
- const userRollData = await RollPromptHelper.roll(rollOptions);
- const rollModifiers = [];
- const rollFormulaParts = [];
- if (userRollData.diceModifier) {
- rollFormulaParts.push("3d6");
- rollFormulaParts.push(userRollData.diceModifier);
- } else {
- rollFormulaParts.push("2d6");
- }
- if (userRollData.hasOwnProperty("characteristic") && userRollData.characteristic !== "") {
- let c = this.actor.system.characteristics[userRollData.characteristic];
- let dm = c.dm;
- rollFormulaParts.push(MGT2Helper.getFormulaDM(dm));
- rollModifiers.push(game.i18n.localize(`MGT2.Characteristics.${userRollData.characteristic}.name`) + MGT2Helper.getDisplayDM(dm));
- }
- if (userRollData.hasOwnProperty("skill") && userRollData.skill !== "") {
- if (userRollData.skill === "NP") {
- rollFormulaParts.push("-3");
- rollModifiers.push(game.i18n.localize("MGT2.Items.NotProficient"));
- } else {
- const skillObj = this.actor.getEmbeddedDocument("Item", userRollData.skill);
- rollFormulaParts.push(MGT2Helper.getFormulaDM(skillObj.system.level));
- rollModifiers.push(skillObj.getRollDisplay());
- }
- }
- if (userRollData.hasOwnProperty("psionic") && userRollData.psionic !== "") {
- let psionicObj = this.actor.getEmbeddedDocument("Item", userRollData.psionic);
- rollFormulaParts.push(MGT2Helper.getFormulaDM(psionicObj.system.level));
- rollModifiers.push(psionicObj.getRollDisplay());
- }
- if (userRollData.hasOwnProperty("timeframes") && userRollData.timeframes !== "" && userRollData.timeframes !== "Normal") {
- rollModifiers.push(game.i18n.localize(`MGT2.Timeframes.${userRollData.timeframes}`));
- rollFormulaParts.push(userRollData.timeframes === "Slower" ? "+2" : "-2");
- }
- if (userRollData.hasOwnProperty("encumbrance") && userRollData.encumbrance === true) {
- rollFormulaParts.push("-2");
- rollModifiers.push(game.i18n.localize("MGT2.Actor.Encumbrance") + " -2");
- }
- if (userRollData.hasOwnProperty("fatigue") && userRollData.fatigue === true) {
- rollFormulaParts.push("-2");
- rollModifiers.push(game.i18n.localize("MGT2.Actor.Fatigue") + " -2");
- }
- if (userRollData.hasOwnProperty("customDM") && userRollData.customDM !== "") {
- let s = userRollData.customDM.trim();
- if (/^[0-9]/.test(s))
- rollFormulaParts.push("+");
- rollFormulaParts.push(s);
- }
- if (MGT2Helper.hasValue(userRollData, "difficulty")) {
- rollOptions.difficulty = userRollData.difficulty;
- }
- const rollData = this.actor.getRollData();
- const rollFormula = rollFormulaParts.join("");
- if (!Roll.validate(rollFormula)) {
- ui.notifications.error(game.i18n.localize("MGT2.Errors.InvalidRollFormula"));
- return;
- }
- let roll = await new Roll(rollFormula, rollData).roll({ async: true, rollMode: userRollData.rollMode });
- if (isInitiative && this.token && this.token.combatant) {
- await this.token.combatant.update({ initiative: roll.total });
- }
- const chatData = {
- user: game.user.id,
- speaker: this.actor ? ChatMessage.getSpeaker({ actor: this.actor }) : null,
- formula: roll._formula,
- //flavor: isPrivate ? null : flavor,
- tooltip: await roll.getTooltip(),
- total: Math.round(roll.total * 100) / 100,
- type: CONST.CHAT_MESSAGE_TYPES.ROLL,
- showButtons: true,
- showLifeButtons: false,
- showRollRequest: false,
- rollTypeName: rollOptions.rollTypeName,
- rollObjectName: rollOptions.rollObjectName,
- rollModifiers,
- showRollDamage: rollOptions.damageFormula !== null && rollOptions.damageFormula !== "",
- cardButtons
- };
- if (MGT2Helper.hasValue(rollOptions, "difficulty")) {
- chatData.rollDifficulty = rollOptions.difficulty;
- chatData.rollDifficultyLabel = game.i18n.localize(`MGT2.Difficulty.${rollOptions.difficulty}`);
- if (roll.total >= MGT2Helper.getDifficultyValue(rollOptions.difficulty)) {
- chatData.rollSuccess = true;
- } else {
- chatData.rollFailure = true;
- }
- }
- const html = await renderTemplate("systems/mgt2/templates/chat/roll.html", chatData);
- chatData.content = html;
- let flags = null;
- if (rollOptions.damageFormula !== null && rollOptions.damageFormula !== "") {
- flags = { mgt2: { damage: { formula: rollOptions.damageFormula, rollObjectName: rollOptions.rollObjectName, rollTypeName: rollOptions.rollTypeName } } };
- }
- if (cardButtons.length > 0) {
- if (flags === null)
- flags = { mgt2: {} };
- flags.mgt2.buttons = cardButtons;
- }
- if (flags !== null)
- chatData.flags = flags;
- return roll.toMessage(chatData);
- }
- _onItemCreate(ev) {
- ev.preventDefault();
- const html = $(ev.currentTarget);
- const data = {
- name: html.data("create-name"),
- type: html.data("type-item")
- };
- if (html.data("subtype")) {
- data.system = {
- subType: html.data("subtype")
- };
- }
- const cls = getDocumentClass("Item");
- return cls.create(data, { parent: this.actor });
- }
- _onItemEquip(ev) {
- ev.preventDefault();
- const html = $(ev.currentTarget).parents("[data-item-id]");
- const item = duplicate(this.actor.getEmbeddedDocument("Item", html.data("itemId")));
- item.system.equipped = !item.system.equipped;
- this.actor.updateEmbeddedDocuments("Item", [item]);
- }
- _onItemStorageIn(ev) {
- ev.preventDefault();
- const html = $(ev.currentTarget).parents("[data-item-id]");
- const item = duplicate(this.actor.getEmbeddedDocument("Item", html.data("itemId")));
- if (item.type === "container") {
- item.system.onHand = false;
- } else {
- let container;
- const containers = this.actor.getContainers();
- if (this.actor.system.containerDropIn == "" || this.actor.system.containerDropIn === null) {
- if (containers.length === 0) {
- const cls = getDocumentClass("Item");
- container = cls.create({ name: game.i18n.localize("MGT2.Actor.NewContainer"), type: "container" }, { parent: this.actor });
+
+ const byName = MGT2Helper.compareByName;
+ const byEquipName = (a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase());
+
+ context.encumbranceNormal = MGT2Helper.convertWeightForDisplay(actor.system.inventory.encumbrance.normal);
+ context.encumbranceHeavy = MGT2Helper.convertWeightForDisplay(actor.system.inventory.encumbrance.heavy);
+
+ const totalWeight = actor.system.inventory.weight;
+ if (totalWeight > actor.system.inventory.encumbrance.heavy) {
+ context.encumbranceClasses = "encumbrance-heavy";
+ context.encumbrance = 2;
+ } else if (totalWeight > actor.system.inventory.encumbrance.normal) {
+ context.encumbranceClasses = "encumbrance-normal";
+ context.encumbrance = 1;
} else {
- container = containers[0];
+ context.encumbrance = 0;
}
- } else {
- container = containers.find((x) => x._id == this.actor.system.containerDropIn);
- }
- if (container.system.locked) {
- if (game.user.isGM) {
- item.system.container.id = container._id;
- } else {
- ui.notifications.error("Objet verrouill\xE9");
+
+ if (softwares.length > 0) { softwares.sort(byName); context.softwares = softwares; }
+ augments.sort(byEquipName); context.augments = augments;
+ armors.sort(byEquipName); context.armors = armors;
+ computers.sort(byEquipName); context.computers = computers;
+ context.careers = careers;
+ contacts.sort(byName); context.contacts = contacts;
+ containers.sort(byName); context.containers = containers;
+ diseases.sort(byName); context.diseases = diseases;
+ context.wounds = wounds;
+ equipments.sort(byEquipName); context.equipments = equipments;
+ miscItems.sort(byEquipName); context.items = miscItems;
+ actorContainers.sort(byName); context.actorContainers = actorContainers;
+ skills.sort(byName); context.skills = skills;
+ psionics.sort(byName); context.psionics = psionics;
+ weapons.sort(byEquipName); context.weapons = weapons;
+
+ if (containerItems.length > 0) {
+ containerItems.sort((a, b) => {
+ const r = a._containerName.localeCompare(b._containerName);
+ return r !== 0 ? r : a.name.toLowerCase().localeCompare(b.name.toLowerCase());
+ });
}
- } else {
- item.system.container.id = container._id;
- }
+ context.containerItems = containerItems;
}
- this.actor.updateEmbeddedDocuments("Item", [item]);
- }
- _onItemStorageOut(ev) {
- ev.preventDefault();
- const html = $(ev.currentTarget).parents("[data-item-id]");
- const item = duplicate(this.actor.getEmbeddedDocument("Item", html.data("itemId")));
- item.system.container.id = "";
- this.actor.updateEmbeddedDocuments("Item", [item]);
- }
- _onSoftwareEject(ev) {
- ev.preventDefault();
- const html = $(ev.currentTarget).parents("[data-item-id]");
- const item = duplicate(this.actor.getEmbeddedDocument("Item", html.data("itemId")));
- item.system.software.computerId = "";
- this.actor.updateEmbeddedDocuments("Item", [item]);
- }
- _onContainerCreate(ev) {
- ev.preventDefault();
- const cls = getDocumentClass("Item");
- return cls.create({ name: game.i18n.localize("MGT2.Actor.NewContainer"), type: "container" }, { parent: this.actor });
- }
- _canDragDrop(selector) {
- return this.isEditable;
- }
- async _onDrop(event) {
- event.preventDefault();
- event.stopImmediatePropagation();
- const dropData = MGT2Helper.getDataFromDropEvent(event);
- if (!dropData)
- return false;
- const sourceItemData = await MGT2Helper.getItemDataFromDropData(dropData);
- if (sourceItemData.type === "species") {
- const update = {
- system: {
- personal: {
- species: sourceItemData.name,
- speciesText: {
- description: sourceItemData.system.description,
- descriptionLong: sourceItemData.system.descriptionLong
+
+ // =========================================================
+ // Event Binding (AppV2 _onRender — replaces jQuery activateListeners)
+ // Templates still use CSS class selectors, so we bind manually here.
+ // =========================================================
+
+ /** @override */
+ _onRender(context, options) {
+ super._onRender(context, options);
+ const html = this.element;
+ if (!this.isEditable) return;
+
+ this._bindClassEvent(html, ".roll", "click", TravellerCharacterSheet.#onRoll);
+ this._bindClassEvent(html, ".cfg-characteristic", "click", TravellerCharacterSheet.#onOpenCharacteristic);
+ this._bindClassEvent(html, ".item-create", "click", TravellerCharacterSheet.#onCreateItem);
+ this._bindClassEvent(html, ".item-edit", "click", TravellerCharacterSheet.#onEditItem);
+ this._bindClassEvent(html, ".item-delete", "click", TravellerCharacterSheet.#onDeleteItem);
+ this._bindClassEvent(html, ".item-equip", "click", TravellerCharacterSheet.#onEquipItem);
+ this._bindClassEvent(html, ".item-storage-in", "click", TravellerCharacterSheet.#onItemStorageIn);
+ this._bindClassEvent(html, ".item-storage-out", "click", TravellerCharacterSheet.#onItemStorageOut);
+ this._bindClassEvent(html, ".software-eject", "click", TravellerCharacterSheet.#onSoftwareEject);
+ this._bindClassEvent(html, ".container-create", "click", TravellerCharacterSheet.#onContainerCreate);
+ this._bindClassEvent(html, ".container-edit", "click", TravellerCharacterSheet.#onContainerEdit);
+ this._bindClassEvent(html, ".container-delete", "click", TravellerCharacterSheet.#onContainerDelete);
+ this._bindClassEvent(html, ".traits-create", "click", TravellerCharacterSheet.#onTraitCreate);
+ this._bindClassEvent(html, ".traits-edit", "click", TravellerCharacterSheet.#onTraitEdit);
+ this._bindClassEvent(html, ".traits-delete", "click", TravellerCharacterSheet.#onTraitDelete);
+ this._bindClassEvent(html, "[data-editor='open']", "click", TravellerCharacterSheet.#onOpenEditor);
+ html.querySelector("[name='config']")?.addEventListener("click", (ev) => TravellerCharacterSheet.#onOpenConfig.call(this, ev, ev.currentTarget));
+ }
+
+ /** Helper: bind a handler to all matching elements, with `this` set to the sheet instance */
+ _bindClassEvent(html, selector, event, handler) {
+ for (const el of html.querySelectorAll(selector)) {
+ el.addEventListener(event, (ev) => handler.call(this, ev, ev.currentTarget));
+ }
+ }
+
+ // =========================================================
+ // Drag & Drop
+ // =========================================================
+
+ /** @override */
+ async _onDrop(event) {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ const dropData = MGT2Helper.getDataFromDropEvent(event);
+ if (!dropData) return false;
+
+ const sourceItemData = await MGT2Helper.getItemDataFromDropData(dropData);
+
+ if (sourceItemData.type === "species") {
+ const update = {
+ system: {
+ personal: {
+ species: sourceItemData.name,
+ speciesText: {
+ description: sourceItemData.system.description,
+ descriptionLong: sourceItemData.system.descriptionLong,
+ },
+ },
+ },
+ };
+ update.system.personal.traits = this.actor.system.personal.traits.concat(sourceItemData.system.traits);
+
+ if (sourceItemData.system.modifiers?.length > 0) {
+ update.system.characteristics = {};
+ for (let modifier of sourceItemData.system.modifiers) {
+ if (MGT2Helper.hasValue(modifier, "characteristic") && MGT2Helper.hasValue(modifier, "value")) {
+ const c = this.actor.system.characteristics[modifier.characteristic];
+ const updateValue = { value: c.value + modifier.value };
+ if (c.showMax) updateValue.max = c.max + modifier.value;
+ update.system.characteristics[modifier.characteristic] = updateValue;
+ }
+ }
}
- }
+
+ this.actor.update(update);
+ return true;
}
- };
- update.system.personal.traits = this.actor.system.personal.traits.concat(sourceItemData.system.traits);
- if (sourceItemData.system.modifiers && sourceItemData.system.modifiers.length > 0) {
- update.system.characteristics = {};
- for (let modifier of sourceItemData.system.modifiers) {
- if (MGT2Helper.hasValue(modifier, "characteristic") && MGT2Helper.hasValue(modifier, "value")) {
- const c = this.actor.system.characteristics[modifier.characteristic];
- const updateValue = { value: c.value };
- updateValue.value += modifier.value;
- if (c.showMax) {
- updateValue.max = c.max + modifier.value;
+
+ if (["contact", "disease", "career", "talent"].includes(sourceItemData.type)) {
+ let transferData = {};
+ try { transferData = sourceItemData.toJSON(); } catch (e) { transferData = sourceItemData; }
+ delete transferData._id;
+ delete transferData.id;
+ await this.actor.createEmbeddedDocuments("Item", [transferData]);
+ return true;
+ }
+
+ if (!["armor", "weapon", "computer", "container", "item", "equipment"].includes(sourceItemData.type)) return false;
+
+ const target = event.target.closest(".table-row");
+ let targetId = null;
+ let targetItem = null;
+ if (target !== null) {
+ targetId = target.dataset.itemId;
+ targetItem = this.actor.getEmbeddedDocument("Item", targetId);
+ }
+
+ let sourceItem = this.actor.getEmbeddedDocument("Item", sourceItemData.id);
+ if (sourceItem) {
+ if (!targetItem) return false;
+ sourceItem = foundry.utils.deepClone(sourceItem);
+ if (sourceItem._id === targetId) return false;
+
+ if (targetItem.type === "item" || targetItem.type === "equipment") {
+ if (targetItem.system.subType === "software")
+ sourceItem.system.software.computerId = targetItem.system.software.computerId;
+ else
+ sourceItem.system.container.id = targetItem.system.container.id;
+ this.actor.updateEmbeddedDocuments("Item", [sourceItem]);
+ return true;
+ } else if (targetItem.type === "computer") {
+ sourceItem.system.software.computerId = targetId;
+ this.actor.updateEmbeddedDocuments("Item", [sourceItem]);
+ return true;
+ } else if (targetItem.type === "container") {
+ if (targetItem.system.locked && !game.user.isGM) {
+ ui.notifications.error("Verrouillé");
+ } else {
+ sourceItem.system.container.id = targetId;
+ this.actor.updateEmbeddedDocuments("Item", [sourceItem]);
+ return true;
+ }
}
- update.system.characteristics[modifier.characteristic] = updateValue;
- }
- }
- }
- this.actor.update(update);
- return true;
- }
- if (sourceItemData.type === "contact" || sourceItemData.type === "disease" || sourceItemData.type === "career" || sourceItemData.type === "talent") {
- let transferData = {};
- try {
- transferData = sourceItemData.toJSON();
- } catch (err) {
- transferData = sourceItemData;
- }
- delete transferData._id;
- delete transferData.id;
- await this.actor.createEmbeddedDocuments("Item", [transferData]);
- return true;
- }
- if (sourceItemData.type !== "armor" && sourceItemData.type !== "weapon" && sourceItemData.type !== "computer" && sourceItemData.type !== "container" && sourceItemData.type !== "item" && sourceItemData.type !== "equipment")
- return false;
- const target = event.target.closest(".table-row");
- let targetId = null;
- let targetItem = null;
- if (target !== null && target !== void 0) {
- targetId = target.dataset.itemId;
- targetItem = this.actor.getEmbeddedDocument("Item", targetId);
- }
- let sourceItem = this.actor.getEmbeddedDocument("Item", sourceItemData.id);
- if (sourceItem) {
- if (targetItem === null || targetItem === void 0)
- return false;
- sourceItem = duplicate(sourceItem);
- if (sourceItem._id === targetId)
- return false;
- if (targetItem.type === "item" || targetItem.type === "equipment") {
- if (targetItem.system.subType === "software") {
- sourceItem.system.software.computerId = targetItem.system.software.computerId;
} else {
- sourceItem.system.container.id = targetItem.system.container.id;
+ let transferData = {};
+ try { transferData = sourceItemData.toJSON(); } catch (e) { transferData = sourceItemData; }
+ delete transferData._id;
+ delete transferData.id;
+
+ const recalcWeight = transferData.system.hasOwnProperty("weight");
+
+ if (transferData.system.hasOwnProperty("container")) transferData.system.container.id = "";
+ if (transferData.type === "item" && transferData.system.subType === "software") transferData.system.software.computerId = "";
+ if (transferData.type === "container") transferData.system.onHand = true;
+ if (transferData.system.hasOwnProperty("equipment")) transferData.system.equipped = false;
+
+ if (targetItem !== null) {
+ if (transferData.type === "item" && transferData.system.subType === "software") {
+ if (targetItem.type === "item" && targetItem.system.subType === "software")
+ transferData.system.software.computerId = targetItem.system.software.computerId;
+ else if (targetItem.type === "computer")
+ transferData.system.software.computerId = targetItem._id;
+ } else if (["armor", "computer", "equipment", "item", "weapon"].includes(transferData.type)) {
+ if (targetItem.type === "container") {
+ if (!targetItem.system.locked || game.user.isGM)
+ transferData.system.container.id = targetId;
+ } else {
+ transferData.system.container.id = targetItem.system.container.id;
+ }
+ }
+ }
+
+ await this.actor.createEmbeddedDocuments("Item", [transferData]);
+ if (recalcWeight) await this.actor.recalculateWeight();
}
- this.actor.updateEmbeddedDocuments("Item", [sourceItem]);
return true;
- } else if (targetItem.type === "computer") {
- sourceItem.system.software.computerId = targetId;
- this.actor.updateEmbeddedDocuments("Item", [sourceItem]);
- return true;
- } else if (targetItem.type === "container") {
- if (targetItem.system.locked && !game.user.isGM)
- ui.notifications.error("Verrouill\xE9");
- else {
- sourceItem.system.container.id = targetId;
- this.actor.updateEmbeddedDocuments("Item", [sourceItem]);
- return true;
+ }
+
+ // =========================================================
+ // Actions (static private methods)
+ // =========================================================
+
+ static async #onCreateItem(event, target) {
+ event.preventDefault();
+ const data = {
+ name: target.dataset.createName,
+ type: target.dataset.typeItem,
+ };
+ if (target.dataset.subtype) {
+ data.system = { subType: target.dataset.subtype };
}
- }
- } else {
- let transferData = {};
- try {
- transferData = sourceItemData.toJSON();
- } catch (err) {
- transferData = sourceItemData;
- }
- delete transferData._id;
- delete transferData.id;
- const recalcWeight = transferData.system.hasOwnProperty("weight");
- if (transferData.system.hasOwnProperty("container"))
- transferData.system.container.id = "";
- if (transferData.type === "item" && transferData.system.subType === "software")
- transferData.system.software.computerId = "";
- if (transferData.type === "container")
- transferData.onHand = true;
- if (transferData.system.hasOwnProperty("equipment"))
- transferData.system.equipped = false;
- if (targetItem !== null) {
- if (transferData.type === "item" && transferData.system.subType === "software") {
- if (targetItem.type === "item" && targetItem.system.subType === "software") {
- transferData.system.software.computerId = targetItem.system.software.computerId;
- } else if (targetItem.type === "computer") {
- transferData.system.software.computerId = targetItem._id;
- }
- } else if (transferData.type === "armor" || transferData.type === "computer" || transferData.type === "equipment" || transferData.type === "item" || transferData.type === "weapon") {
- if (targetItem.type === "container") {
- if (!targetItem.system.locked || game.user.isGM) {
- transferData.system.container.id = targetId;
+ const cls = getDocumentClass("Item");
+ return cls.create(data, { parent: this.actor });
+ }
+
+ static async #onEditItem(event, target) {
+ event.preventDefault();
+ const li = target.closest("[data-item-id]");
+ const item = this.actor.getEmbeddedDocument("Item", li?.dataset.itemId);
+ if (item) item.sheet.render(true);
+ }
+
+ static async #onDeleteItem(event, target) {
+ event.preventDefault();
+ const li = target.closest("[data-item-id]");
+ if (!li?.dataset.itemId) return;
+ this.actor.deleteEmbeddedDocuments("Item", [li.dataset.itemId]);
+ }
+
+ static async #onEquipItem(event, target) {
+ event.preventDefault();
+ const li = target.closest("[data-item-id]");
+ const item = foundry.utils.deepClone(this.actor.getEmbeddedDocument("Item", li?.dataset.itemId));
+ if (!item) return;
+ item.system.equipped = !item.system.equipped;
+ this.actor.updateEmbeddedDocuments("Item", [item]);
+ }
+
+ static async #onItemStorageIn(event, target) {
+ event.preventDefault();
+ const li = target.closest("[data-item-id]");
+ const item = foundry.utils.deepClone(this.actor.getEmbeddedDocument("Item", li?.dataset.itemId));
+ if (!item) return;
+
+ if (item.type === "container") {
+ item.system.onHand = false;
+ } else {
+ const containers = this.actor.getContainers();
+ let container;
+ const dropInId = this.actor.system.containerDropIn;
+
+ if (!dropInId) {
+ container = containers.length === 0
+ ? await getDocumentClass("Item").create({ name: "New container", type: "container" }, { parent: this.actor })
+ : containers[0];
+ } else {
+ container = containers.find(x => x._id === dropInId);
}
- } else {
- if (MGT2Helper.hasValue(targetItem.system.container, "id"))
- transferData.system.container.id = targetItem.system.container.id;
+
+ if (container?.system.locked && !game.user.isGM) {
+ ui.notifications.error("Objet verrouillé");
+ return;
+ }
+ item.system.container.id = container._id;
+ }
+ this.actor.updateEmbeddedDocuments("Item", [item]);
+ }
+
+ static async #onItemStorageOut(event, target) {
+ event.preventDefault();
+ const li = target.closest("[data-item-id]");
+ const item = foundry.utils.deepClone(this.actor.getEmbeddedDocument("Item", li?.dataset.itemId));
+ if (!item) return;
+ item.system.container.id = "";
+ this.actor.updateEmbeddedDocuments("Item", [item]);
+ }
+
+ static async #onSoftwareEject(event, target) {
+ event.preventDefault();
+ const li = target.closest("[data-item-id]");
+ const item = foundry.utils.deepClone(this.actor.getEmbeddedDocument("Item", li?.dataset.itemId));
+ if (!item) return;
+ item.system.software.computerId = "";
+ this.actor.updateEmbeddedDocuments("Item", [item]);
+ }
+
+ static async #onContainerCreate(event) {
+ event.preventDefault();
+ const cls = getDocumentClass("Item");
+ return cls.create({ name: "New container", type: "container" }, { parent: this.actor });
+ }
+
+ static async #onContainerEdit(event) {
+ event.preventDefault();
+ const container = this.actor.getEmbeddedDocument("Item", this.actor.system.containerView);
+ if (container) container.sheet.render(true);
+ }
+
+ static async #onContainerDelete(event) {
+ event.preventDefault();
+ const containers = this.actor.getContainers();
+ const container = containers.find(x => x._id === this.actor.system.containerView);
+ if (!container) return;
+
+ const containerItems = this.actor.items.filter(
+ x => x.system.hasOwnProperty("container") && x.system.container.id === container._id
+ );
+
+ if (containerItems.length > 0) {
+ for (let item of containerItems) {
+ let clone = foundry.utils.deepClone(item);
+ clone.system.container.id = "";
+ this.actor.updateEmbeddedDocuments("Item", [clone]);
+ }
+ }
+
+ const cloneActor = foundry.utils.deepClone(this.actor);
+ cloneActor.system.containerView = "";
+ if (cloneActor.system.containerDropIn === container._id) {
+ cloneActor.system.containerDropIn = "";
+ const remaining = containers.filter(x => x._id !== container._id);
+ if (remaining.length > 0) cloneActor.system.containerDropIn = remaining[0]._id;
+ }
+
+ this.actor.deleteEmbeddedDocuments("Item", [container._id]);
+ this.actor.update(cloneActor);
+ }
+
+ static async #onRoll(event, target) {
+ event.preventDefault();
+
+ const rollOptions = {
+ rollTypeName: game.i18n.localize("MGT2.RollPrompt.Roll"),
+ rollObjectName: "",
+ characteristics: [{ _id: "", name: "" }],
+ characteristic: "",
+ skills: [],
+ skill: "",
+ fatigue: this.actor.system.states.fatigue,
+ encumbrance: this.actor.system.states.encumbrance,
+ difficulty: null,
+ damageFormula: null,
+ };
+
+ const cardButtons = [];
+ for (const [key, label] of Object.entries(MGT2.Characteristics)) {
+ const c = this.actor.system.characteristics[key];
+ if (c.show) {
+ rollOptions.characteristics.push({
+ _id: key,
+ name: game.i18n.localize(label) + MGT2Helper.getDisplayDM(c.dm),
+ });
+ }
+ }
+
+ for (let item of this.actor.items) {
+ if (item.type === "talent" && item.system.subType === "skill")
+ rollOptions.skills.push({ _id: item._id, name: item.getRollDisplay() });
+ }
+
+ rollOptions.skills.sort(MGT2Helper.compareByName);
+ rollOptions.skills = [{ _id: "NP", name: game.i18n.localize("MGT2.Items.NotProficient") }].concat(rollOptions.skills);
+
+ let itemObj = null;
+ let isInitiative = false;
+ const rollType = target.dataset.roll;
+
+ if (rollType === "initiative") {
+ rollOptions.rollTypeName = game.i18n.localize("MGT2.RollPrompt.InitiativeRoll");
+ rollOptions.characteristic = this.actor.system.config.initiative;
+ isInitiative = true;
+ } else if (rollType === "characteristic") {
+ rollOptions.characteristic = target.dataset.rollCharacteristic;
+ rollOptions.rollTypeName = game.i18n.localize("MGT2.RollPrompt.CharacteristicRoll");
+ rollOptions.rollObjectName = game.i18n.localize(`MGT2.Characteristics.${rollOptions.characteristic}.name`);
+ } else {
+ if (rollType === "skill") {
+ rollOptions.skill = target.dataset.rollSkill;
+ itemObj = this.actor.getEmbeddedDocument("Item", rollOptions.skill);
+ rollOptions.rollTypeName = game.i18n.localize("MGT2.RollPrompt.SkillRoll");
+ rollOptions.rollObjectName = itemObj.name;
+ } else if (rollType === "psionic") {
+ rollOptions.rollTypeName = game.i18n.localize("MGT2.RollPrompt.PsionicRoll");
+ }
+
+ if (itemObj === null && target.dataset.itemId) {
+ itemObj = this.actor.getEmbeddedDocument("Item", target.dataset.itemId);
+ rollOptions.rollObjectName = itemObj.name;
+ if (itemObj.type === "weapon") rollOptions.rollTypeName = game.i18n.localize("TYPES.Item.weapon");
+ else if (itemObj.type === "armor") rollOptions.rollTypeName = game.i18n.localize("TYPES.Item.armor");
+ else if (itemObj.type === "computer") rollOptions.rollTypeName = game.i18n.localize("TYPES.Item.computer");
+ }
+
+ if (rollType === "psionic" && itemObj) {
+ rollOptions.rollObjectName = itemObj.name;
+ if (MGT2Helper.hasValue(itemObj.system.psionic, "duration")) {
+ cardButtons.push({
+ label: game.i18n.localize("MGT2.Items.Duration"),
+ formula: itemObj.system.psionic.duration,
+ message: {
+ objectName: itemObj.name,
+ flavor: "{0} ".concat(game.i18n.localize(`MGT2.Durations.${itemObj.system.psionic.durationUnit}`)),
+ },
+ });
+ }
+ }
+
+ if (itemObj?.system.hasOwnProperty("damage")) {
+ rollOptions.damageFormula = itemObj.system.damage;
+ if (itemObj.type === "disease") {
+ if (itemObj.system.subType === "disease")
+ rollOptions.rollTypeName = game.i18n.localize("MGT2.DiseaseSubType.disease");
+ else if (itemObj.system.subType === "poison")
+ rollOptions.rollTypeName = game.i18n.localize("MGT2.DiseaseSubType.poison");
+ }
+ }
+
+ if (itemObj?.system.hasOwnProperty("roll")) {
+ if (MGT2Helper.hasValue(itemObj.system.roll, "characteristic")) rollOptions.characteristic = itemObj.system.roll.characteristic;
+ if (MGT2Helper.hasValue(itemObj.system.roll, "skill")) rollOptions.skill = itemObj.system.roll.skill;
+ if (MGT2Helper.hasValue(itemObj.system.roll, "difficulty")) rollOptions.difficulty = itemObj.system.roll.difficulty;
+ }
+ }
+
+ const userRollData = await RollPromptHelper.roll(rollOptions);
+
+ const rollModifiers = [];
+ const rollFormulaParts = [];
+
+ if (userRollData.diceModifier) {
+ rollFormulaParts.push("3d6", userRollData.diceModifier);
+ } else {
+ rollFormulaParts.push("2d6");
+ }
+
+ if (userRollData.characteristic) {
+ const c = this.actor.system.characteristics[userRollData.characteristic];
+ rollFormulaParts.push(MGT2Helper.getFormulaDM(c.dm));
+ rollModifiers.push(game.i18n.localize(`MGT2.Characteristics.${userRollData.characteristic}.name`) + MGT2Helper.getDisplayDM(c.dm));
+ }
+
+ if (userRollData.skill) {
+ if (userRollData.skill === "NP") {
+ rollFormulaParts.push("-3");
+ rollModifiers.push(game.i18n.localize("MGT2.Items.NotProficient"));
+ } else {
+ const skillObj = this.actor.getEmbeddedDocument("Item", userRollData.skill);
+ rollFormulaParts.push(MGT2Helper.getFormulaDM(skillObj.system.level));
+ rollModifiers.push(skillObj.getRollDisplay());
+ }
+ }
+
+ if (userRollData.psionic) {
+ const psionicObj = this.actor.getEmbeddedDocument("Item", userRollData.psionic);
+ rollFormulaParts.push(MGT2Helper.getFormulaDM(psionicObj.system.level));
+ rollModifiers.push(psionicObj.getRollDisplay());
+ }
+
+ if (userRollData.timeframes && userRollData.timeframes !== "" && userRollData.timeframes !== "Normal") {
+ rollModifiers.push(game.i18n.localize(`MGT2.Timeframes.${userRollData.timeframes}`));
+ rollFormulaParts.push(userRollData.timeframes === "Slower" ? "+2" : "-2");
+ }
+
+ if (userRollData.encumbrance === true) {
+ rollFormulaParts.push("-2");
+ rollModifiers.push(game.i18n.localize("MGT2.Actor.Encumbrance") + " -2");
+ }
+
+ if (userRollData.fatigue === true) {
+ rollFormulaParts.push("-2");
+ rollModifiers.push(game.i18n.localize("MGT2.Actor.Fatigue") + " -2");
+ }
+
+ if (userRollData.customDM) {
+ const s = userRollData.customDM.trim();
+ if (/^[0-9]/.test(s)) rollFormulaParts.push("+");
+ rollFormulaParts.push(s);
+ }
+
+ if (MGT2Helper.hasValue(userRollData, "difficulty")) rollOptions.difficulty = userRollData.difficulty;
+
+ const rollFormula = rollFormulaParts.join("");
+ if (!Roll.validate(rollFormula)) {
+ ui.notifications.error(game.i18n.localize("MGT2.Errors.InvalidRollFormula"));
+ return;
+ }
+
+ let roll = await new Roll(rollFormula, this.actor.getRollData()).roll({ async: true, rollMode: userRollData.rollMode });
+
+ if (isInitiative && this.token?.combatant) {
+ await this.token.combatant.update({ initiative: roll.total });
+ }
+
+ const chatData = {
+ user: game.user.id,
+ speaker: this.actor ? ChatMessage.getSpeaker({ actor: this.actor }) : null,
+ formula: roll._formula,
+ tooltip: await roll.getTooltip(),
+ total: Math.round(roll.total * 100) / 100,
+ type: CONST.CHAT_MESSAGE_TYPES.ROLL,
+ showButtons: true,
+ showLifeButtons: false,
+ showRollRequest: false,
+ rollTypeName: rollOptions.rollTypeName,
+ rollObjectName: rollOptions.rollObjectName,
+ rollModifiers: rollModifiers,
+ showRollDamage: rollOptions.damageFormula !== null && rollOptions.damageFormula !== "",
+ cardButtons: cardButtons,
+ };
+
+ if (MGT2Helper.hasValue(rollOptions, "difficulty")) {
+ chatData.rollDifficulty = rollOptions.difficulty;
+ chatData.rollDifficultyLabel = MGT2Helper.getDifficultyDisplay(rollOptions.difficulty);
+ if (roll.total >= MGT2Helper.getDifficultyValue(rollOptions.difficulty))
+ chatData.rollSuccess = true;
else
- transferData.system.container.id = "";
- }
+ chatData.rollFailure = true;
}
- }
- (await this.actor.createEmbeddedDocuments("Item", [transferData]))[0];
- if (transferData.actor) ;
- if (recalcWeight) {
- await this.actor.recalculateWeight(this.actor);
- }
+
+ const html = await renderTemplate("systems/mgt2/templates/chat/roll.html", chatData);
+ chatData.content = html;
+
+ let flags = null;
+ if (rollOptions.damageFormula) {
+ flags = { mgt2: { damage: { formula: rollOptions.damageFormula, rollObjectName: rollOptions.rollObjectName, rollTypeName: rollOptions.rollTypeName } } };
+ }
+ if (cardButtons.length > 0) {
+ if (!flags) flags = { mgt2: {} };
+ flags.mgt2.buttons = cardButtons;
+ }
+ if (flags) chatData.flags = flags;
+
+ return roll.toMessage(chatData);
+ }
+
+ static async #onOpenConfig(event) {
+ event.preventDefault();
+ const userConfig = await CharacterPrompts.openConfig(this.actor.system);
+ if (userConfig) this.actor.update({ "system.config": userConfig });
+ }
+
+ static async #onOpenCharacteristic(event, target) {
+ event.preventDefault();
+ const name = target.dataset.cfgCharacteristic;
+ const c = this.actor.system.characteristics[name];
+
+ let showAll = false;
+ for (const value of Object.values(this.actor.system.characteristics)) {
+ if (!value.show) { showAll = true; break; }
+ }
+
+ const userConfig = await CharacterPrompts.openCharacteristic(
+ game.i18n.localize(`MGT2.Characteristics.${name}.name`),
+ c.show, c.showMax, showAll
+ );
+
+ if (userConfig) {
+ const data = { system: { characteristics: {} } };
+ data.system.characteristics[name] = { show: userConfig.show, showMax: userConfig.showMax };
+
+ if (userConfig.showAll === true) {
+ for (const [key, value] of Object.entries(this.actor.system.characteristics)) {
+ if (key !== name && !value.show)
+ data.system.characteristics[key] = { show: true };
+ }
+ }
+ this.actor.update(data);
+ }
+ }
+
+ static async #onTraitCreate(event) {
+ event.preventDefault();
+ let traits = this.actor.system.personal.traits;
+ let newTraits;
+ if (traits.length === 0) {
+ newTraits = [{ name: "", description: "" }];
+ } else {
+ newTraits = [...traits, { name: "", description: "" }];
+ }
+ return this.actor.update({ system: { personal: { traits: newTraits } } });
+ }
+
+ static async #onTraitEdit(event, target) {
+ event.preventDefault();
+ const element = target.closest("[data-traits-part]");
+ const index = Number(element.dataset.traitsPart);
+ const trait = this.actor.system.personal.traits[index];
+ const result = await CharacterPrompts.openTraitEdit(trait);
+ const traits = [...this.actor.system.personal.traits];
+ traits[index] = { ...traits[index], name: result.name, description: result.description };
+ return this.actor.update({ system: { personal: { traits: traits } } });
+ }
+
+ static async #onTraitDelete(event, target) {
+ event.preventDefault();
+ const element = target.closest("[data-traits-part]");
+ const index = Number(element.dataset.traitsPart);
+ const traits = foundry.utils.deepClone(this.actor.system.personal.traits);
+ const newTraits = Object.entries(traits)
+ .filter(([key]) => Number(key) !== index)
+ .map(([, value]) => value);
+ return this.actor.update({ system: { personal: { traits: newTraits } } });
+ }
+
+ static async #onOpenEditor(event) {
+ event.preventDefault();
+ await CharacterPrompts.openEditorFullView(
+ this.actor.system.personal.species,
+ this.actor.system.personal.speciesText.descriptionLong
+ );
}
- return true;
- }
- _getSubmitData(updateData = {}) {
- const formData = foundry.utils.expandObject(super._getSubmitData(updateData));
- return foundry.utils.flattenObject(formData);
- }
}
+class TravellerVehiculeSheet extends MGT2ActorSheet {
+
+ /** @override */
+ static DEFAULT_OPTIONS = {
+ ...super.DEFAULT_OPTIONS,
+ classes: [...super.DEFAULT_OPTIONS.classes, "vehicule", "nopad"],
+ window: {
+ ...super.DEFAULT_OPTIONS.window,
+ title: "TYPES.Actor.vehicule",
+ },
+ }
+
+ /** @override */
+ static PARTS = {
+ sheet: {
+ template: "systems/mgt2/templates/actors/vehicule-sheet.html",
+ },
+ }
+
+ /** @override */
+ tabGroups = { primary: "stats" }
+}
+
+const { HandlebarsApplicationMixin } = foundry.applications.api;
+
+class TravellerItemSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2) {
+
+ /** @override */
+ static DEFAULT_OPTIONS = {
+ classes: ["mgt2", "sheet", "item"],
+ position: { width: 630 },
+ form: {
+ submitOnChange: true,
+ closeOnSubmit: false,
+ },
+ window: { resizable: true },
+ actions: {
+ careerEventCreate: TravellerItemSheet.#onCareerEventCreate,
+ careerEventDelete: TravellerItemSheet.#onCareerEventDelete,
+ optionCreate: TravellerItemSheet.#onOptionCreate,
+ optionDelete: TravellerItemSheet.#onOptionDelete,
+ modifierCreate: TravellerItemSheet.#onModifierCreate,
+ modifierDelete: TravellerItemSheet.#onModifierDelete,
+ },
+ }
+
+ /** @override */
+ static PARTS = {
+ sheet: {
+ // template is dynamic — resolved in _prepareContext / _renderHTML
+ template: "",
+ },
+ }
+
+ /** Resolve template dynamically based on item type */
+ get template() {
+ return `systems/mgt2/templates/items/${this.document.type}-sheet.html`;
+ }
+
+ tabGroups = { primary: "tab1" }
+
+ /** @override */
+ async _prepareContext() {
+ const item = this.document;
+ const source = item.toObject();
+
+ const settings = {
+ usePronouns: game.settings.get("mgt2", "usePronouns"),
+ };
+
+ let containers = null;
+ let computers = null;
+ let hadContainer = false;
+
+ if (item.actor !== null) {
+ hadContainer = true;
+ containers = [{ name: "", _id: "" }].concat(item.actor.getContainers());
+ computers = [{ name: "", _id: "" }].concat(item.actor.getComputers());
+ }
+
+ let weight = null;
+ if (item.system.hasOwnProperty("weight")) {
+ weight = MGT2Helper.convertWeightForDisplay(item.system.weight);
+ }
+
+ let skills = [];
+ if (this.actor !== null) {
+ for (let actorItem of this.actor.items) {
+ if (actorItem.type === "talent" && actorItem.system.subType === "skill")
+ skills.push({ _id: actorItem._id, name: actorItem.getRollDisplay() });
+ }
+ }
+ skills.sort(MGT2Helper.compareByName);
+ skills = [{ _id: "NP", name: game.i18n.localize("MGT2.Items.NotProficient") }].concat(skills);
+
+ return {
+ item: item,
+ document: item,
+ cssClass: this.isEditable ? "editable" : "locked",
+ system: item.system,
+ source: source.system,
+ fields: item.schema.fields,
+ systemFields: item.system.schema.fields,
+ isEditable: this.isEditable,
+ isGM: game.user.isGM,
+ config: CONFIG,
+ settings: settings,
+ containers: containers,
+ computers: computers,
+ hadContainer: hadContainer,
+ weight: weight,
+ unitlabels: { weight: MGT2Helper.getWeightLabel() },
+ skills: skills,
+ };
+ }
+
+ /** @override — resolve the per-type template before rendering */
+ async _renderHTML(context, options) {
+ const templatePath = `systems/mgt2/templates/items/${this.document.type}-sheet.html`;
+ const html = await renderTemplate(templatePath, context);
+ return { sheet: html };
+ }
+
+ /** @override — put rendered HTML into the window content */
+ _replaceHTML(result, content, options) {
+ content.innerHTML = result.sheet;
+ this._activateTabGroups();
+ this._bindItemEvents();
+ }
+
+ /** Bind CSS class-based events (templates not yet migrated to data-action) */
+ _bindItemEvents() {
+ const html = this.element;
+ if (!this.isEditable) return;
+ const bind = (sel, handler) => {
+ for (const el of html.querySelectorAll(sel)) {
+ el.addEventListener("click", (ev) => handler.call(this, ev, ev.currentTarget));
+ }
+ };
+ bind(".event-create", TravellerItemSheet.#onCareerEventCreate);
+ bind(".event-delete", TravellerItemSheet.#onCareerEventDelete);
+ bind(".options-create", TravellerItemSheet.#onOptionCreate);
+ bind(".options-delete", TravellerItemSheet.#onOptionDelete);
+ bind(".modifiers-create", TravellerItemSheet.#onModifierCreate);
+ bind(".modifiers-delete", TravellerItemSheet.#onModifierDelete);
+ }
+
+ _activateTabGroups() {
+ for (const [group, activeTab] of Object.entries(this.tabGroups)) {
+ const nav = this.element.querySelector(`nav[data-group="${group}"], .horizontal-tabs`);
+ if (!nav) continue;
+
+ nav.querySelectorAll('[data-tab]').forEach(link => {
+ link.classList.toggle('active', link.dataset.tab === activeTab);
+ link.addEventListener('click', event => {
+ event.preventDefault();
+ this.tabGroups[group] = link.dataset.tab;
+ this.render();
+ });
+ });
+
+ this.element.querySelectorAll(`.itemsheet-panel [data-tab], [data-group="${group}"][data-tab]`).forEach(content => {
+ content.classList.toggle('active', content.dataset.tab === activeTab);
+ });
+ }
+ }
+
+ /** @override — process form data before submit (weight/qty/cost conversions + container logic) */
+ _prepareSubmitData(event, form, formData) {
+ const data = foundry.utils.expandObject(formData.object);
+
+ if (data.hasOwnProperty("weight")) {
+ data.system = data.system || {};
+ data.system.weight = MGT2Helper.convertWeightFromInput(data.weight);
+ delete data.weight;
+ }
+
+ if (data.system?.hasOwnProperty("quantity")) {
+ data.system.quantity = MGT2Helper.getIntegerFromInput(data.system.quantity);
+ }
+
+ if (data.system?.hasOwnProperty("cost")) {
+ data.system.cost = MGT2Helper.getIntegerFromInput(data.system.cost);
+ }
+
+ // Container/equipped logic
+ if (data.system?.hasOwnProperty("container") && this.document.system.hasOwnProperty("equipped")) {
+ const equippedChange = this.document.system.equipped !== data.system.equipped;
+ const containerChange = this.document.system.container?.id !== data.system.container?.id;
+
+ if (equippedChange && data.system.equipped === true) {
+ data.system.container = { id: "" };
+ } else if (containerChange && data.system.container?.id !== "" && this.document.system.container?.id === "") {
+ data.system.equipped = false;
+ }
+ }
+
+ return foundry.utils.flattenObject(data);
+ }
+
+ // =========================================================
+ // Actions
+ // =========================================================
+
+ static async #onCareerEventCreate(event) {
+ event.preventDefault();
+ const events = this.document.system.events;
+ let newEvents;
+ if (!events || events.length === 0) {
+ newEvents = [{ age: "", description: "" }];
+ } else {
+ newEvents = [...events, { age: "", description: "" }];
+ }
+ return this.document.update({ system: { events: newEvents } });
+ }
+
+ static async #onCareerEventDelete(event, target) {
+ event.preventDefault();
+ const element = target.closest("[data-events-part]");
+ const index = Number(element.dataset.eventsPart);
+ const events = foundry.utils.deepClone(this.document.system.events);
+ const newEvents = Object.entries(events)
+ .filter(([key]) => Number(key) !== index)
+ .map(([, val]) => val);
+ return this.document.update({ system: { events: newEvents } });
+ }
+
+ static async #onOptionCreate(event, target) {
+ event.preventDefault();
+ const property = target.dataset.property;
+ const options = this.document.system[property];
+ let newOptions;
+ if (!options || options.length === 0) {
+ newOptions = [{ name: "", description: "" }];
+ } else {
+ newOptions = [...options, { name: "", description: "" }];
+ }
+ return this.document.update({ [`system.${property}`]: newOptions });
+ }
+
+ static async #onOptionDelete(event, target) {
+ event.preventDefault();
+ const element = target.closest("[data-options-part]");
+ const property = element.dataset.property;
+ const index = Number(element.dataset.optionsPart);
+ const options = foundry.utils.deepClone(this.document.system[property]);
+ const newOptions = Object.entries(options)
+ .filter(([key]) => Number(key) !== index)
+ .map(([, val]) => val);
+ return this.document.update({ [`system.${property}`]: newOptions });
+ }
+
+ static async #onModifierCreate(event) {
+ event.preventDefault();
+ const modifiers = this.document.system.modifiers;
+ let newModifiers;
+ if (!modifiers || modifiers.length === 0) {
+ newModifiers = [{ characteristic: "Endurance", value: null }];
+ } else {
+ newModifiers = [...modifiers, { characteristic: "Endurance", value: null }];
+ }
+ return this.document.update({ system: { modifiers: newModifiers } });
+ }
+
+ static async #onModifierDelete(event, target) {
+ event.preventDefault();
+ const element = target.closest("[data-modifiers-part]");
+ const index = Number(element.dataset.modifiersPart);
+ const modifiers = foundry.utils.deepClone(this.document.system.modifiers);
+ const newModifiers = Object.entries(modifiers)
+ .filter(([key]) => Number(key) !== index)
+ .map(([, val]) => val);
+ return this.document.update({ system: { modifiers: newModifiers } });
+ }
+}
+
+/**
+ * Define a set of template paths to pre-load
+ * Pre-loaded templates are compiled and cached for fast access when rendering
+ * @return {Promise}
+ */
const preloadHandlebarsTemplates = async function() {
- const templatePaths = [
- "systems/mgt2/templates/items/parts/sheet-configuration.html",
- "systems/mgt2/templates/items/parts/sheet-physical-item.html",
- "systems/mgt2/templates/roll-prompt.html",
- "systems/mgt2/templates/chat/roll.html",
- //"systems/mgt2/templates/chat/roll-characteristic.html",
- "systems/mgt2/templates/actors/actor-config-sheet.html",
- "systems/mgt2/templates/actors/actor-config-characteristic-sheet.html",
- "systems/mgt2/templates/actors/trait-sheet.html",
- "systems/mgt2/templates/editor-fullview.html"
- //"systems/mgt2/templates/actors/parts/actor-characteristic.html"
- ];
- return loadTemplates(templatePaths);
-};
+
+ const templatePaths = [
+ "systems/mgt2/templates/items/parts/sheet-configuration.html",
+ "systems/mgt2/templates/items/parts/sheet-physical-item.html",
+ "systems/mgt2/templates/roll-prompt.html",
+ "systems/mgt2/templates/chat/roll.html",
+ //"systems/mgt2/templates/chat/roll-characteristic.html",
+ "systems/mgt2/templates/actors/actor-config-sheet.html",
+ "systems/mgt2/templates/actors/actor-config-characteristic-sheet.html",
+ "systems/mgt2/templates/actors/trait-sheet.html",
+ "systems/mgt2/templates/editor-fullview.html"
+ //"systems/mgt2/templates/actors/parts/actor-characteristic.html"
+ ];
+
+ return loadTemplates(templatePaths);
+ };
class ChatHelper {
- // _injectContent(message, type, html) {
- // _setupCardListeners(message, html);
- // }
- static setupCardListeners(message, html, messageData) {
- if (!message || !html) {
- return;
+
+
+ // _injectContent(message, type, html) {
+
+ // _setupCardListeners(message, html);
+
+ // }
+
+
+ static setupCardListeners(message, html, messageData) {
+ if (!message || !html) {
+ return;
+ }
+ // if (SettingsUtility.getSettingValue(SETTING_NAMES.MANUAL_DAMAGE_MODE) > 0) {
+ // html.find('.card-buttons').find(`[data-action='rsr-${ROLL_TYPE.DAMAGE}']`).click(async event => {
+ // await _processDamageButtonEvent(message, event);
+ // });
+ // }
+ html.find('button[data-action="rollDamage"]').click(async event => {
+ //ui.notifications.warn("rollDamage");
+ await this._processRollDamageButtonEvent(message, event);
+ });
+
+ html.find('button[data-action="damage"]').click(async event => {
+ //ui.notifications.warn("damage");
+ await this._applyChatCardDamage(message, event);
+ //await _processApplyButtonEvent(message, event);
+ });
+
+ html.find('button[data-action="healing"]').click(async event => {
+ ui.notifications.warn("healing");
+ //await _processApplyTotalButtonEvent(message, event);
+ });
+
+ html.find('button[data-index]').click(async event => {
+
+ await this._processRollButtonEvent(message, event);
+ });
}
- html.find('button[data-action="rollDamage"]').click(async (event) => {
- await this._processRollDamageButtonEvent(message, event);
- });
- html.find('button[data-action="damage"]').click(async (event) => {
- await this._applyChatCardDamage(message, event);
- });
- html.find('button[data-action="healing"]').click(async (event) => {
- ui.notifications.warn("healing");
- });
- html.find("button[data-index]").click(async (event) => {
- await this._processRollButtonEvent(message, event);
- });
- }
- static async _processRollButtonEvent(message, event) {
- event.preventDefault();
- event.stopPropagation();
- let buttons = message.flags.mgt2.buttons;
- const index = event.target.dataset.index;
- const button = buttons[index];
- let roll = await new Roll(button.formula, {}).roll({ async: true });
- const chatData = {
- user: game.user.id,
- speaker: message.speaker,
- formula: roll._formula,
- tooltip: await roll.getTooltip(),
- total: Math.round(roll.total * 100) / 100,
- //formula: isPrivate ? "???" : roll._formula,
- //tooltip: isPrivate ? "" : await roll.getTooltip(),
- //total: isPrivate ? "?" : Math.round(roll.total * 100) / 100,
- type: CONST.CHAT_MESSAGE_TYPES.ROLL,
- rollObjectName: button.message.objectName,
- rollMessage: MGT2Helper.format(button.message.flavor, Math.round(roll.total * 100) / 100)
- };
- const html = await renderTemplate("systems/mgt2/templates/chat/roll.html", chatData);
- chatData.content = html;
- return roll.toMessage(chatData);
- }
- static async _processRollDamageButtonEvent(message, event) {
- event.preventDefault();
- event.stopPropagation();
- let rollFormula = message.flags.mgt2.damage.formula;
- let roll = await new Roll(rollFormula, {}).roll({ async: true });
- let speaker;
- let selectTokens = canvas.tokens.controlled;
- if (selectTokens.length > 0) {
- speaker = selectTokens[0].actor;
- } else {
- speaker = game.user.character;
+
+ static async _processRollButtonEvent(message, event) {
+ event.preventDefault();
+ event.stopPropagation();
+ let buttons = message.flags.mgt2.buttons;
+ const index = event.target.dataset.index;
+ const button = buttons[index];
+ let roll = await new Roll(button.formula, {}).roll({ async: true });
+ //console.log(message);
+
+ const chatData = {
+ user: game.user.id,
+ speaker: message.speaker,
+ formula: roll._formula,
+ tooltip: await roll.getTooltip(),
+ total: Math.round(roll.total * 100) / 100,
+ //formula: isPrivate ? "???" : roll._formula,
+ //tooltip: isPrivate ? "" : await roll.getTooltip(),
+ //total: isPrivate ? "?" : Math.round(roll.total * 100) / 100,
+ type: CONST.CHAT_MESSAGE_TYPES.ROLL,
+ rollObjectName: button.message.objectName,
+ rollMessage: MGT2Helper.format(button.message.flavor, Math.round(roll.total * 100) / 100),
+ };
+
+ const html = await renderTemplate("systems/mgt2/templates/chat/roll.html", chatData);
+ chatData.content = html;
+ return roll.toMessage(chatData);
+ }
+
+ static async _processRollDamageButtonEvent(message, event) {
+ event.preventDefault();
+ event.stopPropagation();
+ let rollFormula = message.flags.mgt2.damage.formula;
+
+ let roll = await new Roll(rollFormula, {}).roll({ async: true });
+
+ let speaker;
+ let selectTokens = canvas.tokens.controlled;
+ if (selectTokens.length > 0) {
+ speaker = selectTokens[0].actor;
+ } else {
+ speaker = game.user.character;
+ }
+
+ let rollTypeName = message.flags.mgt2.damage.rollTypeName ? message.flags.mgt2.damage.rollTypeName + " DAMAGE" : null;
+
+ const chatData = {
+ user: game.user.id,
+ speaker: ChatMessage.getSpeaker({ actor: speaker }),
+ formula: roll._formula,
+ tooltip: await roll.getTooltip(),
+ total: Math.round(roll.total * 100) / 100,
+ type: CONST.CHAT_MESSAGE_TYPES.ROLL,
+ showButtons: true,
+ hasDamage: true,
+ rollTypeName: rollTypeName,
+ rollObjectName: message.flags.mgt2.damage.rollObjectName
+ };
+
+ const html = await renderTemplate("systems/mgt2/templates/chat/roll.html", chatData);
+ chatData.content = html;
+
+ return roll.toMessage(chatData);
+ }
+
+ async _processDamageButtonEvent(message, event) {
+ event.preventDefault();
+ event.stopPropagation();
+
+ //message.flags[MODULE_SHORT].manualDamage = false
+ //message.flags[MODULE_SHORT].renderDamage = true;
+ // current user/actor
+
+ await ItemUtility.runItemAction(null, message, ROLL_TYPE.DAMAGE);
+ }
+
+ static _applyChatCardDamage(message, event) {
+ const roll = message.rolls[0];
+ return Promise.all(canvas.tokens.controlled.map(t => {
+ const a = t.actor;
+ return a.applyDamage(roll.total);
+ }));
}
- let rollTypeName = message.flags.mgt2.damage.rollTypeName ? message.flags.mgt2.damage.rollTypeName + " DAMAGE" : null;
- const chatData = {
- user: game.user.id,
- speaker: ChatMessage.getSpeaker({ actor: speaker }),
- formula: roll._formula,
- tooltip: await roll.getTooltip(),
- total: Math.round(roll.total * 100) / 100,
- type: CONST.CHAT_MESSAGE_TYPES.ROLL,
- showButtons: true,
- hasDamage: true,
- rollTypeName,
- rollObjectName: message.flags.mgt2.damage.rollObjectName
- };
- const html = await renderTemplate("systems/mgt2/templates/chat/roll.html", chatData);
- chatData.content = html;
- return roll.toMessage(chatData);
- }
- async _processDamageButtonEvent(message, event) {
- event.preventDefault();
- event.stopPropagation();
- await ItemUtility.runItemAction(null, message, ROLL_TYPE.DAMAGE);
- }
- static _applyChatCardDamage(message, event) {
- const roll = message.rolls[0];
- return Promise.all(canvas.tokens.controlled.map((t) => {
- const a = t.actor;
- return a.applyDamage(roll.total);
- }));
- }
}
-const registerSettings = function() {
- game.settings.register("mgt2", "theme", {
- name: "MGT2.Settings.theme.name",
- hint: "MGT2.Settings.theme.hint",
- scope: "client",
- config: true,
- default: "black-and-red",
- type: String,
- choices: {
- "black-and-red": "MGT2.Themes.BlackAndRed",
- "mwamba": "MGT2.Themes.Mwamba",
- "blue": "MGT2.Themes.Blue"
- },
- requiresReload: true
- });
- game.settings.register("mgt2", "usePronouns", {
- name: "MGT2.Settings.usePronouns.name",
- hint: "MGT2.Settings.usePronouns.hint",
- default: false,
- scope: "world",
- type: Boolean,
- config: true,
- requiresReload: false
- });
- game.settings.register("mgt2", "useGender", {
- name: "MGT2.Settings.useGender.name",
- hint: "MGT2.Settings.useGender.hint",
- default: false,
- scope: "world",
- type: Boolean,
- config: true,
- requiresReload: false
- });
- game.settings.register("mgt2", "showLife", {
- name: "MGT2.Settings.showLife.name",
- hint: "MGT2.Settings.showLife.hint",
- default: false,
- scope: "world",
- type: Boolean,
- config: true,
- requiresReload: false
- });
+const registerSettings = function () {
+
+ game.settings.register("mgt2", "theme", {
+ name: "MGT2.Settings.theme.name",
+ hint: "MGT2.Settings.theme.hint",
+ scope: "client",
+ config: true,
+ default: "black-and-red",
+ type: String,
+ choices: {
+ "black-and-red": "MGT2.Themes.BlackAndRed",
+ "mwamba": "MGT2.Themes.Mwamba",
+ "blue": "MGT2.Themes.Blue"
+ },
+ requiresReload: true
+ });
+
+ game.settings.register('mgt2', 'usePronouns', {
+ name: "MGT2.Settings.usePronouns.name",
+ hint: "MGT2.Settings.usePronouns.hint",
+ default: false,
+ scope: 'world',
+ type: Boolean,
+ config: true,
+ requiresReload: false
+ });
+
+ game.settings.register('mgt2', 'useGender', {
+ name: "MGT2.Settings.useGender.name",
+ hint: "MGT2.Settings.useGender.hint",
+ default: false,
+ scope: 'world',
+ type: Boolean,
+ config: true,
+ requiresReload: false
+ });
+
+ game.settings.register('mgt2', 'showLife', {
+ name: "MGT2.Settings.showLife.name",
+ hint: "MGT2.Settings.showLife.hint",
+ default: false,
+ scope: 'world',
+ type: Boolean,
+ config: true,
+ requiresReload: false
+ });
+
+ // game.settings.register('mgt2', 'useWeightMetric', {
+ // name: "MGT2.Settings.useWeightMetric.name",
+ // hint: "MGT2.Settings.useWeightMetric.hint",
+ // default: true,
+ // scope: 'world',
+ // type: Boolean,
+ // config: true,
+ // requiresReload: true
+ // });
+
+ // game.settings.register('mgt2', 'useDistanceMetric', {
+ // name: "MGT2.Settings.useDistanceMetric.name",
+ // hint: "MGT2.Settings.useDistanceMetric.hint",
+ // default: true,
+ // scope: 'world',
+ // type: Boolean,
+ // config: true,
+ // requiresReload: true
+ // });
+
+ // game.settings.register('mgt2', 'showTrash', {
+ // name: "Show Trash tab to Player",
+ // hint: "Player can see the Trash tab and recover item",
+ // default: false,
+ // scope: 'world',
+ // type: Boolean,
+ // config: true,
+ // requiresReload: false
+ // });
+
+ /*game.settings.register('mgt2', 'containerDropIn', {
+ name: "Test",
+ hint: "Mon hint",
+ default: true,
+ scope: 'client',
+ type: Boolean,
+ config: true
+ });*/
};
function registerHandlebarsHelpers() {
- Handlebars.registerHelper("showDM", function(dm) {
- if (dm === 0)
- return "0";
- if (dm > 0)
- return `+${dm}`;
- if (dm < 0)
- return `${dm}`;
+ Handlebars.registerHelper('showDM', function (dm) {
+ if (dm === 0) return "0";
+ if (dm > 0) return `+${dm}`;
+ if (dm < 0) return `${dm}`;
return "";
});
}
-Hooks.once("init", async function() {
+
+Hooks.once("init", async function () {
CONFIG.MGT2 = MGT2;
CONFIG.Combat.initiative = {
formula: "2d6 + @initiative",
decimals: 2
};
+
CONFIG.Actor.trackableAttributes = {
character: {
- bar: [
- "life",
+ bar: ["life",
"characteristics.strength",
"characteristics.dexterity",
"characteristics.endurance",
@@ -2702,9 +3137,8 @@ Hooks.once("init", async function() {
"characteristics.psionic",
"characteristics.other"
],
- value: [
- "life.value",
- "health.radiations",
+ value: ["life.value",
+ "health.radiations",
"characteristics.strength.value",
"characteristics.dexterity.value",
"characteristics.endurance.value",
@@ -2716,26 +3150,34 @@ Hooks.once("init", async function() {
"characteristics.sanity.value",
"characteristics.charm.value",
"characteristics.psionic.value",
- "characteristics.other.value"
- ]
+ "characteristics.other.value"]
}
};
+
game.mgt2 = {
TravellerActor,
TravellerItem
};
+
registerHandlebarsHelpers();
registerSettings();
+
CONFIG.Combatant.documentClass = MGT2Combatant;
CONFIG.Actor.documentClass = TravellerActor;
CONFIG.Item.documentClass = TravellerItem;
- Actors.unregisterSheet("core", ActorSheet);
- Actors.registerSheet("mgt2", TravellerActorSheet, { types: ["character"], makeDefault: true, label: "Traveller Sheet" });
- Items.unregisterSheet("core", ItemSheet);
- Items.registerSheet("mgt2", TravellerItemSheet, { makeDefault: true });
+
+ foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet);
+ foundry.documents.collections.Actors.registerSheet("mgt2", TravellerCharacterSheet, { types: ["character"], makeDefault: true, label: "Traveller Sheet" });
+ foundry.documents.collections.Actors.registerSheet("mgt2", TravellerVehiculeSheet, { types: ["vehicule"], makeDefault: true, label: "Vehicule Sheet" });
+
+ foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
+ foundry.documents.collections.Items.registerSheet("mgt2", TravellerItemSheet, { makeDefault: true });
+
Object.assign(CONFIG.Actor.dataModels, {
- "character": CharacterData
+ "character": CharacterData,
+ "vehicule": VehiculeData
});
+
Object.assign(CONFIG.Item.dataModels, {
"item": ItemData,
"equipment": EquipmentData,
@@ -2749,9 +3191,13 @@ Hooks.once("init", async function() {
"container": ItemContainerData,
"species": SpeciesData
});
+
+
Hooks.on("renderChatMessage", (message, html, messageData) => {
ChatHelper.setupCardListeners(message, html, messageData);
});
+
+ // Preload template partials
await preloadHandlebarsTemplates();
});
diff --git a/mgt2.bundle.js.map b/mgt2.bundle.js.map
index 39f21a8..052f4c9 100644
--- a/mgt2.bundle.js.map
+++ b/mgt2.bundle.js.map
@@ -1 +1 @@
-{"version":3,"file":"mgt2.bundle.js","sources":["src/module/datamodels.js","src/module/config.js","src/module/actors/character.js","src/module/actors/actor.js","src/module/item.js","src/module/helper.js","src/module/item-sheet.js","src/module/roll-prompt.js","src/module/actors/character-prompts.js","src/module/actors/character-sheet.js","src/module/templates.js","src/module/chatHelper.js","src/module/settings.js","src/module/core.js"],"sourcesContent":["// https://foundryvtt.com/article/system-data-models/\r\n// https://foundryvtt.com/api/classes/foundry.data.fields.NumberField.html\r\n// https://foundryvtt.com/api/v10/classes/foundry.data.fields.DataField.html\r\nconst fields = foundry.data.fields;\r\n\r\nexport class CharacterData extends foundry.abstract.TypeDataModel {\r\n\r\n static defineSchema() {\r\n // XP\r\n return {\r\n name: new fields.StringField({ required: false, blank: false, trim: true }),\r\n life: new fields.SchemaField({\r\n value: new fields.NumberField({ required: false, initial: 0, integer: true }),\r\n max: new fields.NumberField({ required: true, initial: 0, integer: true })\r\n }),\r\n personal: new fields.SchemaField({\r\n title: new fields.StringField({ required: false, blank: true, trim: true }),\r\n species: new fields.StringField({ required: false, blank: true, trim: true }),\r\n speciesText: new fields.SchemaField({\r\n description: new fields.StringField({ required: false, blank: true, trim: true, nullable: true }),\r\n descriptionLong: new fields.HTMLField({ required: false, blank: true, trim: true })\r\n }),\r\n age: new fields.StringField({ required: false, blank: true, trim: true }),\r\n gender: new fields.StringField({ required: false, blank: true, trim: true }),\r\n pronouns: new fields.StringField({ required: false, blank: true, trim: true }),\r\n homeworld: new fields.StringField({ required: false, blank: true, trim: true }),\r\n ucp: new fields.StringField({ required: false, blank: true, trim: true, initial: \"\" }),\r\n traits: new fields.ArrayField(\r\n new fields.SchemaField({\r\n name: new fields.StringField({ required: true, blank: true, trim: true }),\r\n description: new fields.StringField({ required: false, blank: true, trim: true })\r\n })\r\n )\r\n }),\r\n biography: new fields.HTMLField({ required: false, blank: true, trim: true }),\r\n\r\n characteristics: new fields.SchemaField({\r\n strength: createCharacteristicField(true, true),\r\n dexterity: createCharacteristicField(true, true),\r\n endurance: createCharacteristicField(true, true),\r\n intellect: createCharacteristicField(true, false),\r\n education: createCharacteristicField(true, false),\r\n social: createCharacteristicField(true, false),\r\n morale: createCharacteristicField(true, false),\r\n luck: createCharacteristicField(true, false),\r\n sanity: createCharacteristicField(true, false),\r\n charm: createCharacteristicField(true, false),\r\n psionic: createCharacteristicField(true, false),\r\n other: createCharacteristicField(true, false)\r\n }),\r\n\r\n health: new fields.SchemaField({\r\n radiations: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true })\r\n }),\r\n study: new fields.SchemaField({\r\n skill: new fields.StringField({ required: false, blank: true, trim: true, initial: \"\" }),\r\n total: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true }),\r\n completed: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true })\r\n }),\r\n finance: new fields.SchemaField({\r\n pension: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\r\n credits: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\r\n cashOnHand: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\r\n debt: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\r\n livingCost: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\r\n monthlyShipPayments: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\r\n notes: new fields.StringField({ required: false, blank: true, trim: true, initial: \"\" })\r\n }),\r\n containerView: new fields.StringField({ required: false, blank: true, trim: true, initial: \"\" }),\r\n containerDropIn: new fields.StringField({ required: false, blank: true, trim: true, initial: \"\" }),\r\n notes: new fields.HTMLField({ required: false, blank: true, trim: true }),\r\n\r\n inventory: new fields.SchemaField({\r\n armor: new fields.NumberField({ required: true, initial: 0, integer: true }),\r\n weight: new fields.NumberField({ required: true, initial: 0, min: 0, integer: false }),\r\n encumbrance: new fields.SchemaField({\r\n normal: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\r\n heavy: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true })\r\n })\r\n }),\r\n states: new fields.SchemaField({\r\n encumbrance: new fields.BooleanField({ required: false, initial: false }),\r\n fatigue: new fields.BooleanField({ required: false, initial: false }),\r\n unconscious: new fields.BooleanField({ required: false, initial: false }),\r\n surgeryRequired: new fields.BooleanField({ required: false, initial: false })\r\n }),\r\n\r\n config: new fields.SchemaField({\r\n psionic: new fields.BooleanField({ required: false, initial: true }),\r\n initiative: new fields.StringField({ required: false, blank: true, initial: \"dexterity\" }),\r\n damages: new fields.SchemaField({\r\n rank1: new fields.StringField({ required: false, blank: true, initial: \"strength\" }),\r\n rank2: new fields.StringField({ required: false, blank: true, initial: \"dexterity\" }),\r\n rank3: new fields.StringField({ required: false, blank: true, initial: \"endurance\" })\r\n })\r\n })\r\n };\r\n }\r\n}\r\n\r\n// export class CreatureData extends foundry.abstract.TypeDataModel {\r\n// static defineSchema() {\r\n// return {\r\n// name: new fields.StringField({ required: false, blank: false, trim: true }),\r\n// TL: new fields.StringField({ required: true, blank: false, initial: \"NA\" }),\r\n// species: new fields.StringField({ required: false, blank: true, trim: true }),\r\n// //cost: new fields.NumberField({ required: true, integer: true }),\r\n// armor: new fields.NumberField({ required: false, initial: 0, integer: true }),\r\n// life: new fields.SchemaField({\r\n// value: new fields.NumberField({ required: false, initial: 0, integer: true }),\r\n// max: new fields.NumberField({ required: true, initial: 0, integer: true })\r\n// }),\r\n\r\n// speed: new fields.StringField({ required: false, initial: \"4m\", blank: true, trim: true }),\r\n\r\n// traits: new fields.ArrayField(\r\n// new fields.SchemaField({\r\n// name: new fields.StringField({ required: true, blank: true, trim: true }),\r\n// description: new fields.StringField({ required: false, blank: true, trim: true })\r\n// })\r\n// ),\r\n\r\n// description: new fields.HTMLField({ required: false, blank: true, trim: true }),\r\n// behaviour: new fields.StringField({ required: false, blank: true, trim: true })\r\n// }\r\n// };\r\n// }\r\n\r\n// export class NPCData extends CreatureData {\r\n// static defineSchema() {\r\n// const schema = super.defineSchema();\r\n// // Species, Gender, Age\r\n// // STR, DEX, END, INT,. EDU, SOC, PSI, SKILL/Psy, equipment\r\n// // Status\r\n// schema.secret = new fields.HTMLField({ required: false, blank: true, trim: true });\r\n\r\n// return schema;\r\n// }\r\n// }\r\n\r\nexport class VehiculeData extends foundry.abstract.TypeDataModel {\r\n\r\n static defineSchema() {\r\n return {\r\n name: new fields.StringField({ required: false, blank: false, trim: true }),\r\n\r\n skillId: new fields.StringField({ required: false, initial: \"\", blank: true, trim: true }),\r\n speed: new fields.SchemaField({\r\n cruise: new fields.StringField({ required: false, initial: \"Slow\", blank: true }),\r\n maximum: new fields.StringField({ required: false, initial: \"Medium\", blank: true })\r\n }),\r\n agility: new fields.NumberField({ required: false, min: 0, integer: true }),\r\n crew: new fields.NumberField({ required: false, min: 0, integer: true }),\r\n passengers: new fields.NumberField({ required: false, min: 0, integer: true }),\r\n cargo: new fields.NumberField({ required: false, min: 0, integer: false }),\r\n //hull\r\n life: new fields.SchemaField({\r\n value: new fields.NumberField({ required: true, initial: 0, integer: true }),\r\n max: new fields.NumberField({ required: true, initial: 0, integer: true })\r\n }),\r\n shipping: new fields.NumberField({ required: false, min: 0, integer: true }),\r\n cost: new fields.NumberField({ required: false, min: 0, integer: true }),\r\n armor: new fields.SchemaField({\r\n front: new fields.NumberField({ required: true, initial: 0, integer: true }),\r\n rear: new fields.NumberField({ required: true, initial: 0, integer: true }),\r\n sides: new fields.NumberField({ required: true, initial: 0, integer: true })\r\n }),\r\n\r\n skills: new fields.SchemaField({\r\n // Skill Level\r\n autopilot: new fields.NumberField({ required: true, initial: 0, integer: true })\r\n // Communication Range\r\n // Navigation\r\n // Sensors\r\n // Camouflage / Recon\r\n // Stealth\r\n })\r\n // config: new fields.SchemaField({\r\n // })\r\n };\r\n }\r\n}\r\n\r\nclass ItemBaseData extends foundry.abstract.TypeDataModel {\r\n static defineSchema() {\r\n const fields = foundry.data.fields;\r\n const schema = {\r\n //name: new fields.StringField({ required: true, blank: true, trim: true, nullable: true }),\r\n description: new fields.StringField({ required: false, blank: true, trim: true, nullable: true }),\r\n //type: new fields.StringField({ required: false, blank: false }),\r\n subType: new fields.StringField({ required: false, blank: false, nullable: true })\r\n };\r\n\r\n return schema;\r\n }\r\n}\r\n\r\nclass PhysicalItemData extends ItemBaseData {\r\n static defineSchema() {\r\n const schema = super.defineSchema();\r\n schema.quantity = new fields.NumberField({ required: true, initial: 1, min: 0, integer: true });\r\n schema.weight = new fields.NumberField({ required: true, initial: 0, min: 0, integer: false });\r\n schema.weightless = new fields.BooleanField({ required: false, initial: false });\r\n schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });\r\n schema.tl = new fields.StringField({ required: true, blank: false, initial: \"TL12\" });\r\n schema.container = new fields.SchemaField({\r\n //inContainer: new fields.BooleanField({ required: false, initial: false }),\r\n id: new fields.StringField({ required: false, blank: true })\r\n });\r\n\r\n schema.roll = new fields.SchemaField({\r\n characteristic: new fields.StringField({ required: false, blank: true, trim: true }),\r\n skill: new fields.StringField({ required: false, blank: true, trim: true }),\r\n difficulty: new fields.StringField({ required: false, blank: true, trim: true })\r\n });\r\n\r\n schema.trash = new fields.BooleanField({ required: false, initial: false });\r\n\r\n return schema;\r\n }\r\n}\r\n\r\nexport class ItemData extends PhysicalItemData {\r\n static defineSchema() {\r\n const schema = super.defineSchema();\r\n schema.subType.initial = \"loot\";\r\n schema.software = new fields.SchemaField({\r\n bandwidth: new fields.NumberField({ required: false, initial: 0, min: 0, max: 10, integer: true }),\r\n effect: new fields.StringField({ required: false, blank: true, trim: true, initial: \"\" }),\r\n computerId: new fields.StringField({ required: false, blank: true, initial: \"\" })\r\n });\r\n return schema;\r\n }\r\n}\r\n\r\nexport class EquipmentData extends PhysicalItemData {\r\n static defineSchema() {\r\n const schema = super.defineSchema();\r\n // augment, clothes\r\n schema.equipped = new fields.BooleanField({ required: false, initial: false });\r\n //schema.skillModifier = new fields.StringField({ required: false, blank: true });\r\n //schema.characteristicModifier = new fields.StringField({ required: false, blank: true });\r\n\r\n schema.augment = new fields.SchemaField({\r\n improvement: new fields.StringField({ required: false, blank: true, trim: true })\r\n });\r\n\r\n schema.subType.initial = \"equipment\"; // augment, clothing, trinket, toolkit, equipment\r\n\r\n return schema;\r\n }\r\n}\r\n\r\nexport class DiseaseData extends ItemBaseData {\r\n static defineSchema() {\r\n const schema = super.defineSchema();\r\n schema.subType.initial = \"disease\"; // disease;poison\r\n schema.difficulty = new fields.StringField({ required: true, initial: \"Average\" });\r\n schema.damage = new fields.StringField({ required: false, blank: true });\r\n schema.interval = new fields.StringField({ required: false, blank: true });\r\n return schema;\r\n }\r\n}\r\n\r\nexport class CareerData extends ItemBaseData {\r\n static defineSchema() {\r\n const schema = super.defineSchema();\r\n\r\n schema.difficulty = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });\r\n schema.damage = new fields.StringField({ required: false, blank: true });\r\n schema.interval = new fields.StringField({ required: false, blank: true });\r\n\r\n schema.assignment = new fields.StringField({ required: false, blank: true });\r\n schema.terms = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\r\n schema.rank = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\r\n schema.events = new fields.ArrayField(\r\n new fields.SchemaField({\r\n age: new fields.NumberField({ required: false, integer: true }),\r\n description: new fields.StringField({ required: false, blank: true, trim: true })\r\n })\r\n );\r\n\r\n return schema;\r\n }\r\n}\r\n\r\nexport class TalentData extends ItemBaseData {\r\n static defineSchema() {\r\n const schema = super.defineSchema();\r\n\r\n schema.subType.initial = \"skill\";\r\n schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true })\r\n schema.level = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true })\r\n schema.skill = new fields.SchemaField({\r\n speciality: new fields.StringField({ required: false, blank: true, trim: true }),\r\n reduceEncumbrance: new fields.BooleanField({ required: false, initial: false })\r\n });\r\n\r\n schema.psionic = new fields.SchemaField({\r\n reach: new fields.StringField({ required: false, blank: true, trim: true }),\r\n cost: new fields.NumberField({ required: false, initial: 1, min: 0, integer: true }),\r\n duration: new fields.StringField({ required: false, blank: true, trim: true }),\r\n durationUnit: new fields.StringField({ required: false })\r\n });\r\n\r\n schema.roll = new fields.SchemaField({\r\n characteristic: new fields.StringField({ required: false, blank: true, trim: true }),\r\n skill: new fields.StringField({ required: false, blank: true, trim: true }),\r\n difficulty: new fields.StringField({ required: false, blank: true, trim: true })\r\n });\r\n\r\n return schema;\r\n }\r\n}\r\n\r\nexport class ContactData extends ItemBaseData {\r\n static defineSchema() {\r\n const schema = super.defineSchema();\r\n\r\n schema.subType.initial = \"skill\";\r\n schema.cost = new fields.NumberField({ required: true, initial: 1, min: 0, integer: true })\r\n\r\n schema.skill = new fields.SchemaField({\r\n speciality: new fields.StringField({ required: false, blank: true, trim: true }),\r\n characteristic: new fields.StringField({ required: false, blank: true, trim: true })\r\n });\r\n\r\n schema.status = new fields.StringField({ required: false, blank: true, trim: true, initial: \"Alive\" });\r\n schema.attitude = new fields.StringField({ required: false, blank: true, trim: true, initial: \"Unknow\" });\r\n schema.relation = new fields.StringField({ required: false, blank: true, trim: true, initial: \"Contact\" });\r\n schema.title = new fields.StringField({ required: false, blank: true, trim: true });\r\n schema.nickname = new fields.StringField({ required: false, blank: true, trim: true });\r\n schema.species = new fields.StringField({ required: false, blank: true, trim: true });\r\n schema.gender = new fields.StringField({ required: false, blank: true, trim: true });\r\n schema.pronouns = new fields.StringField({ required: false, blank: true, trim: true });\r\n schema.homeworld = new fields.StringField({ required: false, blank: true, trim: true });\r\n schema.location = new fields.StringField({ required: false, blank: true, trim: true });\r\n schema.occupation = new fields.StringField({ required: false, blank: true, trim: true });\r\n schema.notes = new fields.HTMLField({ required: false, blank: true, trim: true });\r\n\r\n return schema;\r\n }\r\n}\r\n\r\nexport class WeaponData extends PhysicalItemData {\r\n static defineSchema() {\r\n const schema = super.defineSchema();\r\n schema.equipped = new fields.BooleanField({ required: false, initial: false });\r\n schema.range = new fields.SchemaField({\r\n isMelee: new fields.BooleanField({ required: false, initial: false }),\r\n value: new fields.NumberField({ required: false, integer: true, nullable: true }),\r\n unit: new fields.StringField({ required: false, blank: true, nullable: true })\r\n }),\r\n //schema.tons = new fields.NumberField({ required: false, initial: 0, min: 0, integer: false });\r\n schema.damage = new fields.StringField({ required: false, blank: true, trim: true });\r\n schema.magazine = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\r\n schema.magazineCost = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\r\n schema.traits = new fields.ArrayField(\r\n new fields.SchemaField({\r\n name: new fields.StringField({ required: true, blank: true, trim: true }),\r\n description: new fields.StringField({ required: false, blank: true, trim: true })\r\n })\r\n );\r\n schema.options = new fields.ArrayField(\r\n new fields.SchemaField({\r\n name: new fields.StringField({ required: true, blank: true, trim: true }),\r\n description: new fields.StringField({ required: false, blank: true, trim: true })\r\n })\r\n );\r\n\r\n return schema;\r\n }\r\n}\r\n\r\nexport class ArmorData extends PhysicalItemData {\r\n static defineSchema() {\r\n const schema = super.defineSchema();\r\n schema.equipped = new fields.BooleanField({ required: false, initial: false });\r\n schema.radiations = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\r\n schema.protection = new fields.StringField({ required: false, blank: false, trim: true });\r\n\r\n // Some armours have a required skill. A Traveller suffers DM-1 to all checks taken in the armour per missing\r\n // skill level. For example, a Traveller with Vacc Suit skill 0 who is in a suit that requires Vacc Suit 2 would have\r\n // DM-2 to all their checks. Not having the skill at all inflicts the usual DM-3 unskilled penalty instead.\r\n schema.requireSkill = new fields.StringField({ required: false, blank: false });\r\n schema.requireSkillLevel = new fields.NumberField({ required: false, min: 0, integer: true });\r\n\r\n //requirements: new fields.StringField({ required: false, blank: false, trim: true }),\r\n\r\n // As powered armour, battle dress supports its own weight. While powered and active, the mass of battle dress\r\n // does not count against the encumbrance of the wearer and is effectively weightless.\r\n schema.powered = new fields.BooleanField({ required: false, initial: false });\r\n schema.options = new fields.ArrayField(\r\n new fields.SchemaField({\r\n name: new fields.StringField({ required: true, blank: true, trim: true }),\r\n description: new fields.StringField({ required: false, blank: true, trim: true })\r\n })\r\n );\r\n\r\n // Characteristics Modifiers (Pirate of Drinax - ASLAN BATTLE DRESS STR/DEX, Slot)\r\n\r\n return schema;\r\n }\r\n}\r\n\r\nexport class ComputerData extends PhysicalItemData {\r\n static defineSchema() {\r\n const schema = super.defineSchema();\r\n\r\n schema.processing = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\r\n schema.processingUsed = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\r\n schema.overload = new fields.BooleanField({ required: false, initial: false });\r\n //schema.softwares = new fields.ArrayField(new fields.StringField({ required: false, blank: true, trim: true }));\r\n schema.options = new fields.ArrayField(\r\n new fields.SchemaField({\r\n name: new fields.StringField({ required: true, blank: true, trim: true }),\r\n description: new fields.StringField({ required: false, blank: true, trim: true })\r\n })\r\n );\r\n\r\n return schema;\r\n }\r\n}\r\n\r\nexport class SoftwareData extends ItemBaseData {\r\n static defineSchema() {\r\n const schema = super.defineSchema();\r\n\r\n schema.bandwidth = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\r\n schema.inUse = new fields.BooleanField({ required: false, initial: false });\r\n schema.computer = new fields.StringField({ required: false, blank: true, nullable: true });\r\n\r\n return schema;\r\n }\r\n}\r\n\r\nexport class SpeciesData extends foundry.abstract.TypeDataModel {\r\n static defineSchema() {\r\n const fields = foundry.data.fields;\r\n const schema = {\r\n description: new fields.StringField({ required: false, blank: true, trim: true, nullable: true }),\r\n descriptionLong: new fields.HTMLField({ required: false, blank: true, trim: true }),\r\n traits: new fields.ArrayField(\r\n new fields.SchemaField({\r\n name: new fields.StringField({ required: true, blank: true, trim: true }),\r\n description: new fields.StringField({ required: false, blank: true, trim: true })\r\n })\r\n ),\r\n modifiers: new fields.ArrayField(\r\n new fields.SchemaField({\r\n characteristic: new fields.StringField({ required: false, blank: true, trim: true }),\r\n value: new fields.NumberField({ required: false, integer: true, nullable: true })\r\n })\r\n )\r\n };\r\n\r\n return schema;\r\n }\r\n}\r\n\r\nexport class ItemContainerData extends ItemBaseData {\r\n static defineSchema() {\r\n const schema = super.defineSchema();\r\n\r\n schema.onHand = new fields.BooleanField({ required: false, initial: false });\r\n schema.location = new fields.StringField({ required: false, blank: true, trim: true });\r\n schema.count = new fields.NumberField({ required: false, initial: 0, integer: true });\r\n schema.weight = new fields.NumberField({ required: false, initial: 0, integer: false });\r\n schema.weightless = new fields.BooleanField({ required: false, initial: false });\r\n\r\n schema.locked = new fields.BooleanField({ required: false, initial: false }); // GM only\r\n schema.lockedDescription = new fields.StringField({ required: false, blank: true, trim: true, nullable: true });\r\n return schema;\r\n }\r\n}\r\n\r\nfunction createCharacteristicField(show = true, showMax = false) {\r\n return new fields.SchemaField({\r\n value: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\r\n max: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true }),\r\n dm: new fields.NumberField({ required: false, initial: 0, integer: true }),\r\n show: new fields.BooleanField({ required: false, initial: show }),\r\n showMax: new fields.BooleanField({ required: false, initial: showMax })\r\n });\r\n}","export const MGT2 = {};\r\n\r\nMGT2.MetricRange = Object.freeze({\r\n meter: \"MGT2.MetricRange.meter\",\r\n kilometer: \"MGT2.MetricRange.kilometer\"\r\n});\r\n\r\nMGT2.MetricWeight = Object.freeze({\r\n kilogram: \"MGT2.MetricWeight.kilogram\",\r\n ton: \"MGT2.MetricWeight.ton\"\r\n});\r\n\r\nMGT2.Difficulty = Object.freeze({\r\n NA: \"MGT2.Difficulty.NA\",\r\n Simple: \"MGT2.Difficulty.Simple\",\r\n Easy: \"MGT2.Difficulty.Easy\",\r\n Routine: \"MGT2.Difficulty.Routine\",\r\n Average: \"MGT2.Difficulty.Average\",\r\n Difficult: \"MGT2.Difficulty.Difficult\",\r\n VeryDifficult: \"MGT2.Difficulty.VeryDifficult\",\r\n Formidable: \"MGT2.Difficulty.Formidable\",\r\n Impossible: \"MGT2.Difficulty.Impossible\"\r\n});\r\n\r\nMGT2.ItemSubType = Object.freeze({\r\n loot: \"MGT2.ItemSubType.loot\",\r\n software: \"MGT2.ItemSubType.software\"\r\n});\r\n\r\nMGT2.EquipmentSubType = Object.freeze({\r\n augment: \"MGT2.EquipmentSubType.augment\",\r\n clothing: \"MGT2.EquipmentSubType.clothing\",\r\n equipment: \"MGT2.EquipmentSubType.equipment\",\r\n trinket: \"MGT2.EquipmentSubType.trinket\",\r\n toolkit: \"MGT2.EquipmentSubType.toolkit\"\r\n});\r\n\r\nMGT2.TalentSubType = Object.freeze({\r\n skill: \"MGT2.TalentSubType.skill\",\r\n psionic: \"MGT2.TalentSubType.psionic\"\r\n});\r\n\r\nMGT2.DiseaseSubType = Object.freeze({\r\n disease: \"MGT2.DiseaseSubType.disease\",\r\n poison: \"MGT2.DiseaseSubType.poison\",\r\n wound: \"MGT2.DiseaseSubType.wound\"\r\n});\r\n\r\nMGT2.PsionicReach = Object.freeze({\r\n NA: \"MGT2.PsionicReach.NA\",\r\n Personal: \"MGT2.PsionicReach.Personal\",\r\n Close: \"MGT2.PsionicReach.Close\",\r\n Short: \"MGT2.PsionicReach.Short\",\r\n Medium: \"MGT2.PsionicReach.Medium\",\r\n Long: \"MGT2.PsionicReach.Long\",\r\n VeryLong: \"MGT2.PsionicReach.VeryLong\",\r\n Distant: \"MGT2.PsionicReach.Distant\",\r\n VeryDistant: \"MGT2.PsionicReach.VeryDistant\",\r\n Continental: \"MGT2.PsionicReach.Continental\",\r\n Planetary: \"MGT2.PsionicReach.Planetary\"\r\n});\r\n\r\nMGT2.ContactRelations = Object.freeze({\r\n Allie: \"MGT2.Contact.Relation.Allie\",\r\n Contact: \"MGT2.Contact.Relation.Contact\",\r\n Rival: \"MGT2.Contact.Relation.Rival\",\r\n Enemy: \"MGT2.Contact.Relation.Enemy\"\r\n});\r\n\r\nMGT2.ContactStatus = Object.freeze({\r\n Alive: \"MGT2.Contact.Status.Alive\",\r\n Unknow: \"MGT2.Contact.Status.Unknow\",\r\n Dead: \"MGT2.Contact.Status.Dead\"\r\n});\r\n\r\nMGT2.Attitudes = Object.freeze({\r\n Unknow: \"MGT2.Contact.Attitude.Unknow\",\r\n Hostile: \"MGT2.Contact.Attitude.Hostile\",\r\n Unfriendly: \"MGT2.Contact.Attitude.Unfriendly\",\r\n Indifferent: \"MGT2.Contact.Attitude.Indifferent\",\r\n Friendly: \"MGT2.Contact.Attitude.Friendly\",\r\n Helpful: \"MGT2.Contact.Attitude.Helpful\",\r\n Complicated: \"MGT2.Contact.Attitude.Complicated\"\r\n});\r\n\r\nMGT2.Characteristics = Object.freeze({\r\n strength: \"MGT2.Characteristics.strength.name\",\r\n dexterity: \"MGT2.Characteristics.dexterity.name\",\r\n endurance: \"MGT2.Characteristics.endurance.name\",\r\n intellect: \"MGT2.Characteristics.intellect.name\",\r\n education: \"MGT2.Characteristics.education.name\",\r\n social: \"MGT2.Characteristics.social.name\",\r\n morale: \"MGT2.Characteristics.morale.name\",\r\n luck: \"MGT2.Characteristics.luck.name\",\r\n sanity: \"MGT2.Characteristics.sanity.name\",\r\n charm: \"MGT2.Characteristics.charm.name\",\r\n psionic: \"MGT2.Characteristics.psionic.name\",\r\n other: \"MGT2.Characteristics.other.name\"\r\n});\r\n\r\nMGT2.InitiativeCharacteristics = Object.freeze({\r\n dexterity: \"MGT2.Characteristics.dexterity.name\",\r\n intellect: \"MGT2.Characteristics.intellect.name\"\r\n});\r\n\r\nMGT2.DamageCharacteristics = Object.freeze({\r\n strength: \"MGT2.Characteristics.strength.name\",\r\n dexterity: \"MGT2.Characteristics.dexterity.name\",\r\n endurance: \"MGT2.Characteristics.endurance.name\"\r\n});\r\n\r\nMGT2.TL = Object.freeze({\r\n NA: \"MGT2.TL.NA\",\r\n Unknow: \"MGT2.TL.Unknow\",\r\n NotIdentified: \"MGT2.TL.NotIdentified\",\r\n TL00: \"MGT2.TL.L00\",\r\n TL01: \"MGT2.TL.L01\",\r\n TL02: \"MGT2.TL.L02\",\r\n TL03: \"MGT2.TL.L03\",\r\n TL04: \"MGT2.TL.L04\",\r\n TL05: \"MGT2.TL.L05\",\r\n TL06: \"MGT2.TL.L06\",\r\n TL07: \"MGT2.TL.L07\",\r\n TL08: \"MGT2.TL.L08\",\r\n TL09: \"MGT2.TL.L09\",\r\n TL10: \"MGT2.TL.L10\",\r\n TL11: \"MGT2.TL.L11\",\r\n TL12: \"MGT2.TL.L12\",\r\n TL13: \"MGT2.TL.L13\",\r\n TL14: \"MGT2.TL.L14\",\r\n TL15: \"MGT2.TL.L15\"\r\n});\r\n\r\nMGT2.Timeframes = Object.freeze({\r\n Normal: \"MGT2.Timeframes.Normal\",\r\n Slower: \"MGT2.Timeframes.Slower\",\r\n Faster: \"MGT2.Timeframes.Faster\"\r\n});\r\n\r\nMGT2.SpeedBands = Object.freeze({\r\n Stoppped: \"MGT2.SpeedBands.Stoppped\",\r\n Idle: \"MGT2.SpeedBands.Idle\",\r\n VerySlow: \"MGT2.SpeedBands.VerySlow\",\r\n Slow: \"MGT2.SpeedBands.Slow\",\r\n Medium: \"MGT2.SpeedBands.Medium\",\r\n High: \"MGT2.SpeedBands.High.\",\r\n Fast: \"MGT2.SpeedBands.Fast\",\r\n VeryFast: \"MGT2.SpeedBands.VeryFast\",\r\n Subsonic: \"MGT2.SpeedBands.Subsonic\",\r\n Hypersonic: \"MGT2.SpeedBands.Hypersonic\"\r\n});\r\n\r\nMGT2.Durations = Object.freeze({\r\n Seconds: \"MGT2.Durations.Seconds\",\r\n Minutes: \"MGT2.Durations.Minutes\",\r\n Heures: \"MGT2.Durations.Heures\"\r\n});","export class ActorCharacter {\r\n static preCreate($this, data, options, user) {\r\n $this.updateSource({ prototypeToken: { actorLink: true } }) // QoL\r\n }\r\n\r\n static prepareData(actorData) {\r\n actorData.initiative = this.getInitiative(actorData);\r\n }\r\n\r\n static getInitiative($this) {\r\n let c = $this.system.config.initiative;\r\n return $this.system.characteristics[c].dm;\r\n }\r\n\r\n static async onDeleteDescendantDocuments($this, parent, collection, documents, ids, options, userId) {\r\n const toDeleteIds = [];\r\n const itemToUpdates = [];\r\n\r\n for (let d of documents) {\r\n if (d.type === \"container\") {\r\n // Delete content\r\n for (let item of $this.items) {\r\n if (item.system.hasOwnProperty(\"container\") && item.system.container.id === d._id)\r\n toDeleteIds.push(item._id);\r\n }\r\n } else if (d.type === \"computer\") {\r\n // Eject software\r\n for (let item of $this.items) {\r\n if (item.system.hasOwnProperty(\"software\") && item.system.computerId === d._id) {\r\n let clone = duplicate(item);\r\n clone.system.software.computerId = \"\";\r\n itemToUpdates.push(clone);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (toDeleteIds.length > 0)\r\n await $this.deleteEmbeddedDocuments(\"Item\", toDeleteIds);\r\n\r\n if (itemToUpdates.length > 0)\r\n await $this.updateEmbeddedDocuments('Item', itemToUpdates);\r\n\r\n await this.recalculateWeight($this);\r\n }\r\n\r\n static async onUpdateDescendantDocuments($this, parent, collection, documents, changes, options, userId) {\r\n await this.calculEncumbranceAndWeight($this, parent, collection, documents, changes, options, userId);\r\n await this.calculComputers($this, parent, collection, documents, changes, options, userId);\r\n }\r\n\r\n static async calculComputers($this, parent, collection, documents, changes, options, userId) {\r\n let change;\r\n let i = 0;\r\n\r\n let recalculProcessing = false;\r\n for (let d of documents) {\r\n if (changes[i].hasOwnProperty(\"system\")) {\r\n change = changes[i];\r\n if (d.type === \"item\" && d.system.subType === \"software\") {\r\n if (change.system.software.hasOwnProperty(\"bandwidth\") || change.system.software.hasOwnProperty(\"computerId\")) {\r\n recalculProcessing = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (recalculProcessing) {\r\n let updatedComputers = [];\r\n let computerChanges = {};\r\n let computers = [];\r\n\r\n for (let item of $this.items) {\r\n if (item.system.trash === true) continue;\r\n if (item.type === \"computer\") {\r\n computers.push(item);\r\n computerChanges[item._id] = { processingUsed: 0 };\r\n }\r\n }\r\n\r\n for (let item of $this.items) {\r\n if (item.type !== \"item\" && item.system.subType !== \"software\") continue;\r\n\r\n if (item.system.software.hasOwnProperty(\"computerId\") && item.system.software.computerId !== \"\") {\r\n computerChanges[item.system.software.computerId].processingUsed += item.system.software.bandwidth;\r\n }\r\n }\r\n\r\n for (let computer of computers) {\r\n let newProcessingUsed = computerChanges[computer._id].processingUsed;\r\n if (computer.system.processingUsed !== newProcessingUsed) {\r\n const cloneComputer = duplicate($this.getEmbeddedDocument(\"Item\", computer._id));\r\n cloneComputer.system.processingUsed = newProcessingUsed;\r\n cloneComputer.system.overload = cloneComputer.system.processingUsed > cloneComputer.system.processing;\r\n updatedComputers.push(cloneComputer);\r\n }\r\n }\r\n\r\n if (updatedComputers.length > 0) {\r\n await $this.updateEmbeddedDocuments('Item', updatedComputers);\r\n }\r\n }\r\n }\r\n\r\n static async calculEncumbranceAndWeight($this, parent, collection, documents, changes, options, userId) {\r\n let recalculEncumbrance = false;\r\n let recalculWeight = false;\r\n\r\n let change;\r\n let i = 0;\r\n for (let d of documents) {\r\n if (changes[i].hasOwnProperty(\"system\")) {\r\n change = changes[i];\r\n\r\n if (d.type === \"armor\" ||\r\n d.type === \"computer\" ||\r\n d.type === \"gear\" ||\r\n d.type === \"item\" ||\r\n d.type === \"weapon\") {\r\n if (change.system.hasOwnProperty(\"quantity\") ||\r\n change.system.hasOwnProperty(\"weight\") ||\r\n change.system.hasOwnProperty(\"weightless\") ||\r\n change.system.hasOwnProperty(\"container\") ||\r\n change.system.hasOwnProperty(\"equipped\") ||\r\n d.type === \"armor\") {\r\n recalculWeight = true;\r\n }\r\n } else if (d.type === \"talent\" && d.system.subType === \"skill\") {\r\n if (change.system.level || (change.system?.hasOwnProperty(\"skill\") && change.system?.skill.hasOwnProperty(\"reduceEncumbrance\"))) {\r\n recalculEncumbrance = true;\r\n }\r\n } else if (d.type === \"container\" && (change.system.hasOwnProperty(\"onHand\") || change.system.hasOwnProperty(\"weightless\"))) {\r\n recalculWeight = true;\r\n }\r\n }\r\n i++;\r\n }\r\n\r\n if (recalculEncumbrance || recalculWeight) {\r\n const cloneActorSystem = duplicate($this.system);\r\n\r\n await this.recalculateArmor($this, cloneActorSystem);\r\n if (!recalculEncumbrance && !recalculWeight)\r\n await $this.update({ system: cloneActorSystem });\r\n\r\n if (recalculEncumbrance) {\r\n\r\n const str = Number($this.system.characteristics.strength.value);\r\n const end = Number($this.system.characteristics.endurance.value);\r\n let sumSkill = 0;\r\n $this.items.filter(x => x.type === \"talent\" && x.system.subType === \"skill\" && x.system.skill.reduceEncumbrance === true).forEach(x => sumSkill += Number(x.system.level));\r\n let normal = str + end + sumSkill;\r\n let heavy = normal * 2;\r\n\r\n cloneActorSystem.states.encumbrance = $this.system.inventory.weight > normal;\r\n cloneActorSystem.encumbrance.normal = normal;\r\n cloneActorSystem.encumbrance.heavy = heavy;\r\n\r\n if (!recalculWeight)\r\n await $this.update({ system: cloneActorSystem });\r\n }\r\n\r\n if (recalculWeight)\r\n await this.recalculateWeight($this, cloneActorSystem);\r\n }\r\n }\r\n\r\n static async recalculateArmor($this, cloneActorSystem) {\r\n if (cloneActorSystem === null || cloneActorSystem === undefined)\r\n cloneActorSystem = foundry.utils.duplicate($this.system);\r\n\r\n let armor = 0;\r\n for (let item of $this.items) {\r\n if (item.type === \"armor\") {\r\n if (item.system.equipped === true && !isNaN(item.system.protection)) {\r\n armor += (+item.system.protection || 0);\r\n }\r\n }\r\n }\r\n\r\n cloneActorSystem.inventory.armor = armor;\r\n }\r\n\r\n static async recalculateWeight($this, cloneActorSystem) {\r\n\r\n if (cloneActorSystem === null || cloneActorSystem === undefined)\r\n cloneActorSystem = foundry.utils.duplicate($this.system);\r\n\r\n let updatedContainers = [];\r\n let containerChanges = {};\r\n\r\n //console.log(\"recalculWeight\");\r\n let containers = [];\r\n\r\n // List all containers\r\n for (let item of $this.items) {\r\n if (item.system.trash === true) continue;\r\n\r\n if (item.type === \"container\") {\r\n containers.push(item);\r\n containerChanges[item._id] = { count: 0, weight: 0 };\r\n }\r\n }\r\n\r\n let onHandWeight = 0;\r\n for (let item of $this.items) {\r\n if (item.type === \"container\") continue;\r\n if (item.system.hasOwnProperty(\"weightless\") && item.system.weightless === true) continue;\r\n\r\n let itemWeight = 0;\r\n if (item.system.hasOwnProperty(\"weight\")) {\r\n let itemQty = item.system.quantity\r\n if (!isNaN(itemQty) && itemQty > 0) {\r\n itemWeight = item.system.weight;\r\n if (itemWeight > 0) {\r\n itemWeight *= itemQty;\r\n }\r\n }\r\n\r\n if (item.type === \"armor\") {\r\n if (item.system.equipped === true) {\r\n if (item.system.powered === true)\r\n itemWeight = 0;\r\n else\r\n itemWeight *= 0.25; // mass of armor that is being worn by 75% OPTIONAL\r\n }\r\n }\r\n\r\n if (item.system.container && item.system.container.id && item.system.container.id !== \"\") {\r\n // bad deleted container id\r\n if (containerChanges.hasOwnProperty(item.system.container.id)) {\r\n containerChanges[item.system.container.id].weight += Math.round(itemWeight * 10) / 10;\r\n containerChanges[item.system.container.id].count += item.system.quantity;\r\n }\r\n } else {\r\n onHandWeight += Math.round(itemWeight * 10) / 10;\r\n }\r\n }\r\n }\r\n\r\n //cloneActor.system.inventory.weight = onHandWeight.toFixed(1);\r\n\r\n // Check containers new weight\r\n for (let container of containers) {\r\n let newWeight = containerChanges[container._id].weight;\r\n let newCount = containerChanges[container._id].count;\r\n if (container.system.weight !== newWeight || container.system.count !== newCount) {\r\n //const cloneContainer = duplicate();\r\n const cloneContainer = duplicate($this.getEmbeddedDocument(\"Item\", container._id));\r\n //foundry.utils.setProperty(cloneContainer, \"system.weight\", newWeight);\r\n cloneContainer.system.weight = newWeight;\r\n cloneContainer.system.count = newCount;\r\n updatedContainers.push(cloneContainer);\r\n\r\n if (container.system.onHand === true &&\r\n (container.system.weight > 0 || container.system.weightless !== true)) {\r\n onHandWeight += container.system.weight;\r\n }\r\n }\r\n }\r\n\r\n cloneActorSystem.inventory.weight = onHandWeight;\r\n cloneActorSystem.states.encumbrance = onHandWeight > $this.system.inventory.encumbrance.normal;\r\n\r\n\r\n await $this.update({ system: cloneActorSystem });\r\n\r\n if (updatedContainers.length > 0) {\r\n await $this.updateEmbeddedDocuments('Item', updatedContainers);\r\n }\r\n }\r\n\r\n static async preUpdate($this, changed, options, user) {\r\n // Calc encumbrance\r\n\r\n const newStr = Number(foundry.utils.getProperty(changed, \"system.characteristics.strength.value\") ?? $this.system.characteristics.strength.value);\r\n const newEnd = Number(foundry.utils.getProperty(changed, \"system.characteristics.endurance.value\") ?? $this.system.characteristics.endurance.value);\r\n if ((newStr !== $this.system.characteristics.strength.value) || (newEnd !== $this.system.characteristics.endurance.value)) {\r\n let sumSkill = 0;\r\n $this.items.filter(x => x.type === \"talent\" && x.system.subType === \"skill\" && x.system.skill.reduceEncumbrance === true).forEach(x => sumSkill += Number(x.system.level));\r\n let normal = newStr + newEnd + sumSkill;\r\n let heavy = normal * 2;\r\n foundry.utils.setProperty(changed, \"system.inventory.encumbrance.normal\", normal);\r\n foundry.utils.setProperty(changed, \"system.inventory.encumbrance.heavy\", heavy);\r\n }\r\n\r\n //console.log(foundry.utils.getProperty(changed, \"system.characteristics.strength.value\"));\r\n const characteristicModified = this.computeCharacteristics(changed);\r\n const strengthValue = Number(foundry.utils.getProperty(changed, \"system.characteristics.strength.value\") ?? $this.system.characteristics.strength.value);\r\n const strengthMax = Number(foundry.utils.getProperty(changed, \"system.characteristics.strength.max\") ?? $this.system.characteristics.strength.max);\r\n const dexterityValue = Number(foundry.utils.getProperty(changed, \"system.characteristics.dexterity.value\") ?? $this.system.characteristics.dexterity.value);\r\n const dexterityMax = Number(foundry.utils.getProperty(changed, \"system.characteristics.dexterity.max\") ?? $this.system.characteristics.dexterity.max);\r\n const enduranceValue = Number(foundry.utils.getProperty(changed, \"system.characteristics.endurance.value\") ?? $this.system.characteristics.endurance.value);\r\n const enduranceMax = Number(foundry.utils.getProperty(changed, \"system.characteristics.endurance.max\") ?? $this.system.characteristics.endurance.max);\r\n const lifeValue = strengthValue + dexterityValue + enduranceValue;\r\n const lifeMax = strengthMax + dexterityMax + enduranceMax;\r\n\r\n if ($this.system.life.value !== lifeValue)\r\n foundry.utils.setProperty(changed, \"system.life.value\", lifeValue);\r\n if ($this.system.life.max !== lifeMax)\r\n foundry.utils.setProperty(changed, \"system.life.max\", lifeMax);\r\n\r\n if (characteristicModified && $this.system.personal.ucp === undefined || $this.system.personal.ucp === \"\") {\r\n // calc\r\n\r\n }\r\n //}\r\n\r\n // Apply changes in Actor size to Token width/height\r\n // if ( \"size\" in (this.system.traits || {}) ) {\r\n // const newSize = foundry.utils.getProperty(changed, \"system.traits.size\");\r\n // if ( newSize && (newSize !== this.system.traits?.size) ) {\r\n // let size = CONFIG.DND5E.tokenSizes[newSize];\r\n // if ( !foundry.utils.hasProperty(changed, \"prototypeToken.width\") ) {\r\n // changed.prototypeToken ||= {};\r\n // changed.prototypeToken.height = size;\r\n // changed.prototypeToken.width = size;\r\n // }\r\n // }\r\n // }\r\n }\r\n\r\n // static applyHealing($this, amount) {\r\n // if (isNaN(amount) || amount === 0) return;\r\n\r\n // const strength = $this.system.characteristics.strength;\r\n // const dexterity = $this.system.characteristics.dexterity;\r\n // const endurance = $this.system.characteristics.endurance;\r\n\r\n // const data = {\r\n // strength: { value: strength.value },\r\n // dexterity: { value: dexterity.value },\r\n // endurance: { value: endurance.value }\r\n // };\r\n\r\n\r\n\r\n // $this.update({ system: { characteristics: data } });\r\n // }\r\n\r\n static applyDamage($this, amount) {\r\n if (isNaN(amount) || amount === 0) return;\r\n const rank1 = $this.system.config.damages.rank1;\r\n const rank2 = $this.system.config.damages.rank2;\r\n const rank3 = $this.system.config.damages.rank3;\r\n\r\n const data = {};\r\n data[rank1] = { value: $this.system.characteristics[rank1].value };\r\n data[rank2] = { value: $this.system.characteristics[rank2].value };\r\n data[rank3] = { value: $this.system.characteristics[rank3].value };\r\n\r\n if (amount < 0) amount = Math.abs(amount);\r\n\r\n for (const [key, rank] of Object.entries(data)) {\r\n if (rank.value > 0) {\r\n if (rank.value >= amount) {\r\n rank.value -= amount;\r\n amount = 0;\r\n } else {\r\n amount -= rank.value;\r\n rank.value = 0;\r\n }\r\n rank.dm = this.getModifier(rank.value);\r\n if (amount <= 0) break;\r\n }\r\n }\r\n\r\n $this.update({ system: { characteristics: data } });\r\n }\r\n\r\n static getContainers($this) {\r\n const containers = [];\r\n for (let item of $this.items) {\r\n if (item.type == \"container\") {\r\n containers.push(item);\r\n }\r\n }\r\n\r\n containers.sort(this.compareByName);\r\n\r\n return containers;\r\n }\r\n\r\n static getComputers($this) {\r\n const containers = [];\r\n for (let item of $this.items) {\r\n if (item.type == \"computer\") {\r\n containers.push(item);\r\n }\r\n }\r\n\r\n containers.sort(this.compareByName);\r\n\r\n return containers;\r\n }\r\n\r\n static getSkills($this) {\r\n const skills = [];\r\n for (let item of $this.items) {\r\n if (item.type === \"talent\" && item.system.subType === \"skill\") {\r\n skills.push(item);\r\n }\r\n }\r\n\r\n skills.sort(this.compareByName);\r\n\r\n return skills;\r\n }\r\n\r\n static computeCharacteristics(changed) {\r\n let modified = this.computeCharacteristic(changed, \"strength\");\r\n\r\n if (this.computeCharacteristic(changed, \"dexterity\") && !modified) modified = true;\r\n if (this.computeCharacteristic(changed, \"endurance\") && !modified) modified = true;\r\n if (this.computeCharacteristic(changed, \"intellect\") && !modified) modified = true;\r\n if (this.computeCharacteristic(changed, \"education\") && !modified) modified = true;\r\n if (this.computeCharacteristic(changed, \"social\") && !modified) modified = true;\r\n if (this.computeCharacteristic(changed, \"morale\") && !modified) modified = true;\r\n if (this.computeCharacteristic(changed, \"luck\") && !modified) modified = true;\r\n if (this.computeCharacteristic(changed, \"sanity\") && !modified) modified = true;\r\n if (this.computeCharacteristic(changed, \"charm\") && !modified) modified = true;\r\n if (this.computeCharacteristic(changed, \"psionic\") && !modified) modified = true;\r\n if (this.computeCharacteristic(changed, \"other\") && !modified) modified = true;\r\n\r\n return modified;\r\n }\r\n\r\n static computeCharacteristic(changed, name) {\r\n //if (isNaN(c.value) || c.value <= 0) c.value = 0;\r\n //c.dm = this._getModifier(c.value)\r\n const path = `system.characteristics.${name}`;\r\n const newValue = Number(foundry.utils.getProperty(changed, path + \".value\"));\r\n if (newValue && !isNaN(newValue)) {\r\n const dm = this.getModifier(newValue);\r\n foundry.utils.setProperty(changed, path + \".dm\", dm);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n static getModifier(value) {\r\n if (isNaN(value) || value <= 0) return -3;\r\n if (value >= 1 && value <= 2) return -2;\r\n if (value >= 3 && value <= 5) return -1;\r\n if (value >= 6 && value <= 8) return 0;\r\n if (value >= 9 && value <= 11) return 1;\r\n if (value >= 12 && value <= 14) return 2;\r\n\r\n return 3;\r\n }\r\n\r\n static compareByName(a, b) {\r\n if (!a.hasOwnProperty(\"name\") || !b.hasOwnProperty(\"name\")) {\r\n return 0;\r\n }\r\n return a.name.toLowerCase().localeCompare(b.name.toLowerCase());\r\n }\r\n}","import { ActorCharacter } from \"./character.js\";\n\nexport class MGT2Combatant extends Combatant {\n \n}\n\nexport class TravellerActor extends Actor {\n\n // _onUpdate(data, options, userId) {\n // super._onUpdate(data, options, userId);\n // console.log(\"_onUpdate\");\n // console.log(data);\n // if (data.system?.characteristics) {\n\n // // Calc encumbrance\n // if (data.system.characteristics.strength || data.system.characteristics.endurance) {\n // data.system.encumbrance.normal = 0;\n // data.system.encumbrance.heavy = 0;\n // }\n // }\n // // If benefits were changed\n // //if (data.system?.benefits) {\n // // this.updateBenefitsOnActor();\n // //}\n // // this.actor.computeCharacteristics(formData);\n // }\n\n /*\n initiative if(!token?.combatant) return ui.notifications.warn(\"You are missing a selected token or combatant.\"); const bonus = await Dialog.prompt({ title: \"Roll Initiative\", content: ``, callback: (html) => html[0].querySelector(\"input\").value, rejectClose: false }); const roll = await new Roll(`1d12 + ${bonus}`).evaluate({async: true}); await roll.toMessage({ flavor: `${token.actor.name} rolls initiative!`, speaker: ChatMessage.getSpeaker({actor: token.actor}) }); await token.combatant.update({initiative: roll.total});\n */\n\n prepareDerivedData() {\n if (this.type === \"character\") {\n this.system.initiative = ActorCharacter.getInitiative(this);\n }\n }\n\n async _preCreate(data, options, user) {\n if ( (await super._preCreate(data, options, user)) === false ) return false;\n \n if (this.type === \"character\") {\n ActorCharacter.preCreate(this, data, options, user);\n }\n }\n\n async _onDeleteDescendantDocuments(parent, collection, documents, ids, options, userId) {\n await super._onDeleteDescendantDocuments(parent, collection, documents, ids, options, userId);\n\n if (this.type === \"character\") {\n await ActorCharacter.onDeleteDescendantDocuments(this, parent, collection, documents, ids, options, userId);\n }\n }\n\n async _onUpdateDescendantDocuments(parent, collection, documents, changes, options, userId) {\n super._onUpdateDescendantDocuments(parent, collection, documents, changes, options, userId);\n //console.log(\"_onUpdateDescendantDocuments\");\n\n if (this.type === \"character\") {\n await ActorCharacter.onUpdateDescendantDocuments(this, parent, collection, documents, changes, options, userId);\n }\n }\n\n async _preUpdate(changed, options, user) {\n if ((await super._preUpdate(changed, options, user)) === false) return false;\n\n if (this.type === \"character\") {\n await ActorCharacter.preUpdate(this, changed, options, user);\n }\n }\n\n getInitiative($this) {\n if (this.type === \"character\") {\n return ActorCharacter.getInitiative(this);\n }\n }\n\n applyDamage(amount) {\n if (this.type === \"character\") {\n ActorCharacter.applyDamage(this, amount);\n }\n }\n\n getContainers() {\n if (this.type === \"character\") {\n return ActorCharacter.getContainers(this);\n }\n\n return [];\n }\n\n getComputers() {\n if (this.type === \"character\") {\n return ActorCharacter.getComputers(this);\n }\n\n return [];\n }\n\n getSkills() {\n if (this.type === \"character\") {\n return ActorCharacter.getSkills(this);\n }\n\n return [];\n }\n\n async recalculateWeight() {\n if (this.type === \"character\") {\n return ActorCharacter.recalculateWeight(this);\n }\n }\n\n async recalculateArmor() {\n if (this.type === \"character\") {\n return ActorCharacter.recalculateArmor(this);\n }\n }\n}\n","export class TravellerItem extends Item {\n\n /** @inheritdoc */\n prepareDerivedData() {\n super.prepareDerivedData();\n\n }\n\n async _preUpdate(changed, options, user) {\n if ((await super._preUpdate(changed, options, user)) === false) return false;\n\n if (this.type === \"computer\") {\n // Overload\n const newProcessing = foundry.utils.getProperty(changed, \"system.processing\") ?? this.system.processing;\n if (newProcessing !== this.system.processing) {\n let overload = this.system.processingUsed > newProcessing;\n foundry.utils.setProperty(changed, \"system.overload\", overload);\n }\n }\n\n // Qty max 1\n if (this.type === \"computer\" || this.type === \"container\" || (this.type === \"item\" && this.system.subType === \"software\")) {\n const newQty = foundry.utils.getProperty(changed, \"system.quantity\") ?? this.system.quantity;\n if (newQty !== this.system.quantity && newQty > 1) {\n foundry.utils.setProperty(changed, \"system.quantity\", 1);\n }\n }\n\n // No Weight\n if (this.type === \"item\" && this.system.subType === \"software\") {\n const newWeight = foundry.utils.getProperty(changed, \"system.weight\") ?? this.system.weight;\n if (newWeight !== this.system.weight && newWeight > 0) {\n foundry.utils.setProperty(changed, \"system.weight\", 0);\n }\n }\n }\n\n getRollDisplay() {\n if (this.type === \"talent\") {\n if (this.system.subType === \"skill\") {\n let label;\n if (this.system.skill.speciality !== \"\" && this.system.skill.speciality !== undefined) {\n label = `${this.name} (${this.system.skill.speciality})`;\n } else {\n label = this.name;\n }\n\n if (this.system.level > 0)\n label += ` (+${this.system.level})`;\n else if (this.system.level < 0)\n label += ` (${this.system.level})`;\n\n return label;\n } else if (this.system.subType === \"psionic\") {\n\n }\n }\n\n return name;\n }\n}\n","export class MGT2Helper {\r\n static POUNDS_CONVERT = 2.20462262185;\r\n\r\n static decimalSeparator;\r\n static badDecimalSeparator;\r\n\r\n static {\r\n this.decimalSeparator = Number(1.1).toLocaleString().charAt(1);\r\n this.badDecimalSeparator = (this.decimalSeparator === \".\" ? \",\" : \".\");\r\n }\r\n\r\n static format = function() {\r\n var s = arguments[0];\r\n for (var i = 0; i < arguments.length - 1; i++) { \r\n var reg = new RegExp(\"\\\\{\" + i + \"\\\\}\", \"gm\"); \r\n s = s.replace(reg, arguments[i + 1]);\r\n }\r\n return s;\r\n }\r\n\r\n static hasValue(object, property) {\r\n return object !== undefined && object.hasOwnProperty(property) && object[property] !== null && object[property] !== undefined && object[property] !== \"\";\r\n }\r\n\r\n static getItemsWeight(items) {\r\n let weight = 0;\r\n for (let i of items) {\r\n let item = i.hasOwnProperty(\"system\") ? i.system : i;\r\n if (item.hasOwnProperty(\"weightless\") && item.weightless === true) {\r\n continue;\r\n }\r\n\r\n if (item.hasOwnProperty(\"weight\")) {\r\n let itemQty = item.quantity\r\n if (!isNaN(itemQty) && itemQty > 0) {\r\n let itemWeight = item.weight;\r\n if (itemWeight > 0) {\r\n weight += itemWeight * itemQty;\r\n }\r\n }\r\n }\r\n }\r\n return weight;\r\n }\r\n\r\n static generateUID() {\r\n let result = '';\r\n const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';\r\n\r\n for (let i = 0; i < 36; i++) {\r\n const randomIndex = Math.floor(Math.random() * characters.length);\r\n result += characters.charAt(randomIndex);\r\n if (i === 8 || i === 12 || i === 16 || i === 20)\r\n result += \"-\";\r\n }\r\n\r\n return result;\r\n }\r\n\r\n static compareByName(a, b) {\r\n if (!a.hasOwnProperty(\"name\") || !b.hasOwnProperty(\"name\")) {\r\n return 0;\r\n }\r\n return a.name.toLowerCase().localeCompare(b.name.toLowerCase());\r\n }\r\n\r\n static getDisplayDM(dm) {\r\n if (dm === 0) return \" (0)\";\r\n if (dm > 0) return ` (+${dm})`;\r\n if (dm < 0) return ` (${dm})`;\r\n return \"\";\r\n }\r\n static getFormulaDM(dm) {\r\n if (dm === 0) return \"+0\";\r\n if (dm > 0) return `+${dm}`;\r\n if (dm < 0) return `${dm}`;\r\n return \"\";\r\n }\r\n\r\n static getDiceResults(roll) {\r\n const results = [];\r\n for (const die of roll.dice) {\r\n results.push(die.results);\r\n }\r\n return results.flat(2);\r\n }\r\n\r\n static getDiceTotal(roll) {\r\n let total = 0;\r\n for (const die of roll.dice) {\r\n total += die.total;\r\n }\r\n return total;\r\n }\r\n\r\n static getDifficultyValue(difficulty) {\r\n switch(difficulty) {\r\n case \"Simple\": return 2;\r\n case \"Easy\": return 4;\r\n case \"Routine\": return 6;\r\n case \"Average\": return 8;\r\n case \"Difficult\": return 10;\r\n case \"VeryDifficult\": return 12;\r\n case \"Formidable\": return 14;\r\n case \"Impossible\": return 16;\r\n default:\r\n return 0;\r\n }\r\n }\r\n\r\n static getDifficultyDisplay(difficulty) {\r\n switch(difficulty) {\r\n case \"Simple\": return game.i18n.localize(\"MGT2.Difficulty.Simple\") + \" (2+)\";\r\n case \"Easy\": return game.i18n.localize(\"MGT2.Difficulty.Easy\") + \" (4+)\";\r\n case \"Routine\": return game.i18n.localize(\"MGT2.Difficulty.Routine\") + \" (6+)\";\r\n case \"Average\": return game.i18n.localize(\"MGT2.Difficulty.Average\") + \" (8+)\";\r\n case \"Difficult\": return game.i18n.localize(\"MGT2.Difficulty.Difficult\") + \" (10+)\";\r\n case \"VeryDifficult\": return game.i18n.localize(\"MGT2.Difficulty.VeryDifficult\") + \" (12+)\";\r\n case \"Formidable\": return game.i18n.localize(\"MGT2.Difficulty.Formidable\") + \" (14+)\";\r\n case \"Impossible\": return game.i18n.localize(\"MGT2.Difficulty.Impossible\") + \" (16+)\";\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n static getRangeDisplay(range) {\r\n let value = Number(range.value);\r\n\r\n if (isNaN(value)) return null;\r\n\r\n let label;\r\n //if (game.settings.get(\"mgt2\", \"useDistanceMetric\") === true) {\r\n if (range.unit !== null && range.unit !== undefined && range.unit !== \"\")\r\n label = game.i18n.localize(`MGT2.MetricRange.${range.unit}`).toLowerCase();\r\n else\r\n label = \"\";\r\n //} else {\r\n // TODO\r\n //}\r\n\r\n return `${value}${label}`;\r\n }\r\n\r\n static getWeightLabel() {\r\n //const label = game.settings.get(\"mgt2\", \"useWeightMetric\") === true ? \"MGT2.MetricSystem.Weight.kg\" : \"MGT2.ImperialSystem.Weight.lb\";\r\n //return game.i18n.localize(label);\r\n return game.i18n.localize(\"MGT2.MetricSystem.Weight.kg\");\r\n }\r\n\r\n static getDistanceLabel() {\r\n //const label = game.settings.get(\"mgt2\", \"useDistanceMetric\") === true ? \"MGT2.MetricSystem.Distance.km\" : \"MGT2.ImperialSystem.Distance.mi\";\r\n //return game.i18n.localize(label);\r\n return game.i18n.localize(\"MGT2.MetricSystem.Distance.km\");\r\n }\r\n\r\n static getIntegerFromInput(data) {\r\n return Math.trunc(this.getNumberFromInput(data));\r\n }\r\n\r\n static getNumberFromInput(data) {\r\n if (data === undefined || data === null) return 0;\r\n\r\n if (typeof data === \"string\") {\r\n let converted = Number(data.replace(/\\s+/g, '').replace(this.badDecimalSeparator, this.decimalSeparator).trim());\r\n if (isNaN(converted))\r\n return 0;\r\n\r\n return converted;\r\n }\r\n\r\n let converted = Number(data);\r\n\r\n if (isNaN(converted))\r\n return 0;\r\n\r\n return converted;\r\n }\r\n\r\n static convertWeightForDisplay(weight) {\r\n //if (game.settings.get(\"mgt2\", \"useWeightMetric\") === true || weight === 0)\r\n return weight;\r\n\r\n // Metric to Imperial\r\n //const pounds = weight * this.POUNDS_CONVERT;\r\n //return Math.round(pounds * 10) / 10;\r\n }\r\n\r\n static convertWeightFromInput(weight) {\r\n //if (game.settings.get(\"mgt2\", \"useWeightMetric\") === true || weight === 0)\r\n return Math.round(weight * 10) / 10;\r\n\r\n // Imperial to Metric\r\n //const kg = this.POUNDS_CONVERT / weight;\r\n //return Math.round(kg * 10) / 10;\r\n }\r\n\r\n static getDataFromDropEvent(event) {\r\n let data;\r\n try {\r\n return JSON.parse(event.dataTransfer?.getData(\"text/plain\"));\r\n } catch (err) {\r\n return false;\r\n }\r\n\r\n //if ( data.type !== \"Item\" ) return false;\r\n //const item = await Item.implementation.fromDropData(data);\r\n }\r\n\r\n static async getItemDataFromDropData(dropData) {\r\n //console.log(\"getItemDataFromDropData\");\r\n let item;\r\n if (game.modules.get(\"monks-enhanced-journal\")?.active && dropData.itemId && dropData.uuid.includes(\"JournalEntry\")) {\r\n const journalEntry = await fromUuid(dropData.uuid);\r\n } else if (dropData.hasOwnProperty(\"uuid\")) {\r\n item = await fromUuid(dropData.uuid);\r\n } else {\r\n let uuid = `${dropData.type}.${dropData.data._id}`;\r\n item = await fromUuid(uuid);\r\n }\r\n\r\n if (!item) {\r\n throw new Error(game.i18n.localize(\"Errors.CouldNotFindItem\").replace(\"_ITEM_ID_\", dropData.uuid));\r\n }\r\n if (item.pack) {\r\n const pack = game.packs.get(item.pack);\r\n item = await pack?.getDocument(item._id);\r\n }\r\n return foundry.utils.deepClone(item);\r\n }\r\n}","import { MGT2Helper } from \"./helper.js\";\n\n/**\n * Extend the basic ItemSheet with some very simple modifications\n * @extends {ItemSheet}\n */\nexport class TravellerItemSheet extends ItemSheet {\n\n /** @inheritdoc */\n static get defaultOptions() {\n const options = super.defaultOptions;\n return foundry.utils.mergeObject(options, {\n classes: [\"mgt2\", game.settings.get(\"mgt2\", \"theme\"), \"sheet\"],\n width: 630,\n tabs: [{ navSelector: \".horizontal-tabs\", contentSelector: \".itemsheet-panel\", initial: \"tab1\" }]\n });\n }\n\n /* -------------------------------------------- */\n\n get template() {\n const path = \"systems/mgt2/templates/items\";\n return `${path}/${this.item.type}-sheet.html`;\n }\n\n /** @inheritdoc */\n async getData(options) {\n const context = await super.getData(options);\n //console.log('-=getData=-');\n //console.log(context);\n const item = context.item;\n\n const source = item.toObject();\n context.config = CONFIG.MGT2;\n\n const settings = {};\n settings.usePronouns = game.settings.get(\"mgt2\", \"usePronouns\");\n\n let containers = null;\n let computers = null;;\n let hadContainer;\n if (context.item.actor != null) {\n hadContainer = true;\n containers = [{ \"name\": \"\", \"_id\": \"\" }].concat(context.item.actor.getContainers());\n computers = [{ \"name\": \"\", \"_id\": \"\" }].concat(context.item.actor.getComputers());\n } else {\n hadContainer = false;\n }\n\n let weight = null;\n if (item.system.hasOwnProperty(\"weight\")) {\n weight = MGT2Helper.convertWeightForDisplay(item.system.weight);\n }\n let unitlabels = {\n weight: MGT2Helper.getWeightLabel()\n };\n let skills = [];\n\n if (this.actor !== null) {\n for (let item of this.actor.items) {\n if (item.type === \"talent\") {\n if (item.system.subType === \"skill\")\n skills.push({ _id: item._id, name: item.getRollDisplay() });\n }\n }\n }\n \n skills.sort(MGT2Helper.compareByName);\n skills = [{ _id: \"NP\", name: game.i18n.localize(\"MGT2.Items.NotProficient\") }].concat(skills);\n\n foundry.utils.mergeObject(context, {\n source: source.system,\n system: item.system,\n settings: settings,\n containers: containers,\n computers: computers,\n hadContainer: hadContainer,\n weight: weight,\n unitlabels: unitlabels,\n editable: this.isEditable,\n isGM: game.user.isGM,\n skills: skills,\n config: CONFIG\n //rollData: this.item.getRollData(),\n });\n\n return context;\n }\n\n /* -------------------------------------------- */\n\n /** @inheritdoc */\n activateListeners(html) {\n super.activateListeners(html);\n\n // Everything below here is only needed if the sheet is editable\n if (!this.isEditable) return;\n\n //let handler = ev => this._onDropCustom(ev);\n\n //console.log(html);\n // itemsheet-panel\n //html.addEventListener(\"dragstart\", this._onDropCustom, false);\n html.find('div.itemsheet-panel').each((i, li) => {\n // //if (li.classList.contains(\"inventory-header\")) return;\n //li.setAttribute(\"draggable\", true);\n //li.addEventListener(\"drop\", handler, false);\n });\n\n\n //html.find('div.dropitem').each((i, li) => {\n // //if (li.classList.contains(\"inventory-header\")) return;\n // li.setAttribute(\"draggable\", true);\n // li.addEventListener(\"dragstart\", handler, false);\n //});\n\n // if (this.item.type == \"weapon\") {\n // html.find('.trait-create').click(this._onTraitCreate.bind(this));\n // html.find('.trait-delete').click(this._onTraitDelete.bind(this));\n // }\n\n if (this.item.type == \"career\") {\n html.find('.event-create').click(this._onCareerEventCreate.bind(this));\n html.find('.event-delete').click(this._onCareerEventDelete.bind(this));\n }\n\n else if (this.item.type == \"armor\" ||\n this.item.type == \"computer\" ||\n this.item.type == \"species\" ||\n this.item.type == \"weapon\") {\n html.find('.options-create').click(this._onOptionCreate.bind(this));\n html.find('.options-delete').click(this._onOptionDelete.bind(this));\n }\n\n if (this.item.type == \"species\") {\n html.find('.modifiers-create').click(this._onModifierEventCreate.bind(this));\n html.find('.modifiers-delete').click(this._onModifierEventDelete.bind(this));\n }\n }\n\n async _onModifierEventCreate(event) {\n event.preventDefault();\n await this._onSubmit(event);\n\n let modifiers = this.item.system.modifiers;\n let index;\n if (modifiers.length === 0) {\n modifiers = {};\n modifiers[\"0\"] = { characteristic: \"Endurance\", value: null };\n } else {\n index = Math.max(...Object.keys(modifiers));\n index++;\n modifiers[index] = { characteristic: \"Endurance\", value: null };\n }\n\n let update = {\n system: {\n modifiers: modifiers\n }\n };\n\n return this.item.update(update);\n }\n\n async _onModifierEventDelete(event) {\n event.preventDefault();\n await this._onSubmit(event);\n const element = event.currentTarget.closest(\".modifiers-part\");\n const modifiers = foundry.utils.deepClone(this.item.system.modifiers);\n let index = Number(element.dataset.modifiersPart);\n\n const newModifiers = [];\n let entries = Object.entries(modifiers);\n if (entries.length > 1) {\n for (const [key, value] of entries) {\n if (key != index)\n newModifiers.push(value);\n }\n }\n\n let update = {\n system: {\n modifiers: newModifiers\n }\n };\n \n return this.item.update(update);\n }\n\n async _onCareerEventCreate(event) {\n event.preventDefault();\n await this._onSubmit(event);\n\n let events = this.item.system.events;\n let index;\n if (events.length === 0) {\n events = {};\n events[\"0\"] = { age: \"\", description: \"\" };\n } else {\n index = Math.max(...Object.keys(events));\n index++;\n events[index] = { age: \"\", description: \"\" };\n }\n\n let update = {\n system: {\n events: events\n }\n };\n\n return this.item.update(update);\n }\n\n async _onCareerEventDelete(event) {\n event.preventDefault();\n await this._onSubmit(event);\n const element = event.currentTarget.closest(\".events-part\");\n const events = foundry.utils.deepClone(this.item.system.events);\n let index = Number(element.dataset.eventsPart);\n\n const newEvents = [];\n let entries = Object.entries(events);\n if (entries.length > 1) {\n for (const [key, value] of entries) {\n if (key != index)\n newEvents.push(value);\n }\n }\n\n let update = {\n system: {\n events: newEvents\n }\n };\n \n return this.item.update(update);\n }\n\n async _onOptionCreate(event) {\n event.preventDefault();\n await this._onSubmit(event);\n\n //const subType = event.currentTarget.dataset.subType;\n const property = event.currentTarget.dataset.property;\n\n //let options = this.item.system[subType][property];\n let options = this.item.system[property];\n let index;\n if (options.length === 0) {\n options = {};\n options[\"0\"] = { name: \"\", description: \"\" };\n } else {\n index = Math.max(...Object.keys(options));\n index++;\n options[index] = { name: \"\", description: \"\" };\n }\n\n let update = {};\n //update[`system.${subType}.${property}`] = options;\n update[`system.${property}`] = options;\n return this.item.update(update);\n }\n\n async _onOptionDelete(event) {\n event.preventDefault();\n await this._onSubmit(event);\n const element = event.currentTarget.closest(\".options-part\");\n //const subType = element.dataset.subType;\n const property = element.dataset.property;\n //const options = foundry.utils.deepClone(this.item.system[subType][property]);\n const options = foundry.utils.deepClone(this.item.system[property]);\n let index = Number(element.dataset.optionsPart);\n\n const newOptions = [];\n let entries = Object.entries(options);\n if (entries.length > 1) {\n for (const [key, value] of entries) {\n if (key != index)\n newOptions.push(value);\n }\n }\n\n let update = {};\n //update[`system.${subType}.${property}`] = newOptions;\n update[`system.${property}`] = newOptions;\n return this.item.update(update);\n }\n\n // async _onTraitCreate(event) {\n // event.preventDefault();\n // await this._onSubmit(event);\n // const traits = this.item.system.traits;\n // return this.item.update({ \"system.traits.parts\": traits.parts.concat([[\"\", \"\"]]) });\n // }\n\n // async _onTraitDelete(event) {\n // event.preventDefault();\n // await this._onSubmit(event);\n // const element = event.currentTarget.closest(\".traits-part\");\n // const traits = foundry.utils.deepClone(this.item.system.traits);\n // traits.parts.splice(Number(element.dataset.traitsPart), 1);\n // return this.item.update({ \"system.traits.parts\": traits.parts });\n // }\n\n _getSubmitData(updateData = {}) {\n const formData = foundry.utils.expandObject(super._getSubmitData(updateData));\n\n // Gestion des containers\n if (formData.hasOwnProperty(\"system\") && formData.system.hasOwnProperty(\"container\") &&\n (this.item.system.hasOwnProperty(\"equipped\"))) {\n //*console.log('-=_getSubmitData=-');\n //console.log(this.item.system.onHand);\n //console.log(formData.system.onHand);\n //const onHandChange = this.item.system.onHand !== formData.system.onHand;\n const equippedChange = this.item.system.equipped !== formData.system.equipped;\n const containerChange = this.item.system.container.id !== formData.system.container.id;\n // Maintenant équipé\n if (equippedChange) {\n if (formData.system.equipped === true) {\n //formData.system.onHand = true;\n //console.log(\"clear container\");\n formData.system.container = {\n //inContainer: false,\n id: \"\"\n };\n }\n }\n\n /*else if (onHandChange) {\n // Maintenant à portée\n if (formData.system.onHand === true) {\n //console.log(\"clear container\");\n formData.system.container = {\n inContainer: false,\n id: \"\"\n };\n } else {\n formData.system.equipped = false;\n }\n }*/\n\n else if (containerChange) {\n // Mise en storage\n if (formData.system.container.id !== \"\" && (this.item.system.container.id === \"\" || this.item.system.container.id === null)) {\n //console.log(\"put in container\");\n //formData.system.onHand = false;\n formData.system.equipped = false;\n //formData.system.container.inContainer = true;\n }\n }\n }\n\n // if (this.item.type == \"weapon\") {\n // const traits = formData.system?.traits;\n // if (traits)\n // traits.parts = Object.values(traits?.parts || {}).map(d => [d[0] || \"\", d[1] || \"\"]);\n // }\n\n // else if (this.item.type == \"career\") {\n // const events = formData.system?.events;\n // if (events)\n // events.parts = Object.values(events?.parts || {}).map(d => [d[0] || \"\", d[1] || \"\"]);\n // }\n\n // else if (this.item.type == \"equipment\") {\n // if (this.item.system.subType == \"armor\") {\n // // const armor = formData.system?.armor;\n // // if (armor)\n // // //options.parts = Object.values(options?.parts || {}).map(d => [d[0] || \"\", d[1] || \"\"]);\n // // console.log(armor.options);\n // // armor.options = Object.values(armor?.options || {})\n // // .map(d => [d.name || \"\", d.description || \"\"]);\n // // console.log(armor.options);\n // } else if (this.item.system.subType == \"computer\") {\n // const computer = formData.system?.computer;\n // if (computer)\n // //options.parts = Object.values(options?.parts || {}).map(d => [d[0] || \"\", d[1] || \"\"]);\n // computer.options = Object.values(computer?.options || {}).map(d => [d[0] || \"\", d[1] || \"\"]);\n // }\n // }\n\n if (formData.hasOwnProperty(\"weight\")) {\n formData.system.weight = MGT2Helper.convertWeightFromInput(formData.weight);\n delete formData.weight;\n }\n\n if (formData.system.hasOwnProperty(\"quantity\")) {\n formData.system.quantity = MGT2Helper.getIntegerFromInput(formData.system.quantity);\n }\n\n if (formData.system.hasOwnProperty(\"cost\")) {\n formData.system.cost = MGT2Helper.getIntegerFromInput(formData.system.cost);\n }\n //console.log(\"before flatten\");\n //console.log(formData);\n //console.log(\"after flatten\");\n // let x = foundry.utils.flattenObject(formData);;\n // console.log(x);\n // return x;\n return foundry.utils.flattenObject(formData);\n }\n}\n","class RollPromptDialog extends Dialog {\r\n constructor(dialogData = {}, options = {}) {\r\n super(dialogData, options);\r\n this.options.classes = [\"mgt2\", game.settings.get(\"mgt2\", \"theme\"), \"sheet\", \"dialog\"];\r\n }\r\n\r\n static async create(options) {\r\n\r\n const htmlContent = await renderTemplate('systems/mgt2/templates/roll-prompt.html', {\r\n config: CONFIG.MGT2,\r\n //formula: formula,\r\n characteristics: options.characteristics,\r\n characteristic: options.characteristic,\r\n skills: options.skills,\r\n skill: options.skill,\r\n fatigue: options.fatigue,\r\n encumbrance: options.encumbrance,\r\n difficulty: options.difficulty\r\n });\r\n\r\n const results = new Promise(resolve => {\r\n new this({\r\n title: options.title,\r\n content: htmlContent,\r\n buttons: {\r\n boon: {\r\n label: game.i18n.localize(\"MGT2.RollPrompt.Boon\"),\r\n callback: (html) => {\r\n const formData = new FormDataExtended(html[0].querySelector('form')).object;\r\n formData.diceModifier = \"dl\";\r\n resolve(formData);\r\n }\r\n },\r\n submit: {\r\n label: game.i18n.localize(\"MGT2.RollPrompt.Roll\"),\r\n icon: '',\r\n callback: (html) => {\r\n const formData = new FormDataExtended(html[0].querySelector('form')).object;\r\n resolve(formData);\r\n },\r\n },\r\n bane: {\r\n label: game.i18n.localize(\"MGT2.RollPrompt.Bane\"),\r\n //icon: '',\r\n callback: (html) => {\r\n const formData = new FormDataExtended(html[0].querySelector('form')).object;\r\n formData.diceModifier = \"dh\";\r\n resolve(formData);\r\n }\r\n }\r\n }\r\n //close: () => { resolve(false) }\r\n }).render(true);\r\n });\r\n\r\n //console.log(Promise.resolve(results));\r\n return results;\r\n }\r\n}\r\n\r\nexport class RollPromptHelper {\r\n\r\n static async roll(options) {\r\n return await RollPromptDialog.create(options);\r\n }\r\n\r\n static async promptForFruitTraits() {\r\n const htmlContent = await renderTemplate('systems/mgt2/templateschat/chat/roll-prompt.html');\r\n\r\n return new Promise((resolve, reject) => {\r\n const dialog = new Dialog({\r\n title: \"Fruit Traits\",\r\n content: htmlContent,\r\n buttons: {\r\n submit: {\r\n label: \"Roll\",\r\n icon: '',\r\n callback: (html) => {\r\n const formData = new FormDataExtended(html[0].querySelector('form'))\r\n .toObject();\r\n\r\n //verifyFruitInputs(formData);\r\n\r\n resolve(formData);\r\n },\r\n },\r\n skip: {\r\n label: \"Cancel\",\r\n callback: () => resolve(null),\r\n }\r\n },\r\n render: (html) => {\r\n //html.on('click', 'button[data-preset]', handleFruitPreset);\r\n },\r\n close: () => {\r\n reject('User closed dialog without making a selection.');\r\n },\r\n });\r\n\r\n dialog.render(true);\r\n });\r\n }\r\n}","class EditorFullViewDialog extends Dialog {\r\n constructor(dialogData = {}, options = {}) {\r\n super(dialogData, options);\r\n this.options.classes = [\"mgt2\", game.settings.get(\"mgt2\", \"theme\"), \"sheet\"];\r\n this.options.resizable = true;\r\n }\r\n\r\n static async create(title, html) {\r\n const htmlContent = await renderTemplate(\"systems/mgt2/templates/editor-fullview.html\", {\r\n config: CONFIG.MGT2,\r\n html: html\r\n });\r\n\r\n const results = new Promise(resolve => {\r\n new this({\r\n title: title,\r\n content: htmlContent,\r\n buttons: {\r\n //close: { label: game.i18n.localize(\"MGT2.Close\") }\r\n }\r\n }).render(true);\r\n });\r\n\r\n return results;\r\n }\r\n}\r\n\r\nclass ActorConfigDialog extends Dialog {\r\n constructor(dialogData = {}, options = {}) {\r\n super(dialogData, options);\r\n this.options.classes = [\"mgt2\", game.settings.get(\"mgt2\", \"theme\"), \"sheet\"];\r\n }\r\n\r\n static async create(system) {\r\n const htmlContent = await renderTemplate(\"systems/mgt2/templates/actors/actor-config-sheet.html\", {\r\n config: CONFIG.MGT2,\r\n system: system\r\n });\r\n\r\n const results = new Promise(resolve => {\r\n new this({\r\n title: \"Configuration\",\r\n content: htmlContent,\r\n buttons: {\r\n submit: {\r\n label: game.i18n.localize(\"MGT2.Save\"),\r\n icon: '',\r\n callback: (html) => {\r\n const formData = new FormDataExtended(html[0].querySelector('form')).object;\r\n resolve(formData);\r\n },\r\n }\r\n }\r\n }).render(true);\r\n });\r\n\r\n return results;\r\n }\r\n}\r\n\r\nclass ActorCharacteristicDialog extends Dialog {\r\n // https://foundryvtt.wiki/en/development/api/dialog\r\n constructor(dialogData = {}, options = {}) {\r\n super(dialogData, options);\r\n this.options.classes = [\"mgt2\", game.settings.get(\"mgt2\", \"theme\"), \"sheet\"];\r\n }\r\n\r\n static async create(name, show, showMax, showAll = false) {\r\n const htmlContent = await renderTemplate(\"systems/mgt2/templates/actors/actor-config-characteristic-sheet.html\", {\r\n name: name,\r\n show: show,\r\n showMax: showMax,\r\n showAll: showAll\r\n });\r\n\r\n const results = new Promise(resolve => {\r\n new this({\r\n title: \"Configuration: \" + name,\r\n content: htmlContent,\r\n buttons: {\r\n submit: {\r\n label: game.i18n.localize(\"MGT2.Save\"),\r\n icon: '',\r\n callback: (html) => {\r\n const formData = new FormDataExtended(html[0].querySelector('form')).object;\r\n resolve(formData);\r\n },\r\n }\r\n }\r\n }).render(true);\r\n });\r\n\r\n return results;\r\n }\r\n}\r\n\r\nclass TraitEditDialog extends Dialog {\r\n constructor(dialogData = {}, options = {}) {\r\n super(dialogData, options);\r\n this.options.classes = [\"mgt2\", game.settings.get(\"mgt2\", \"theme\"), \"sheet\"];\r\n }\r\n\r\n static async create(data) {\r\n const htmlContent = await renderTemplate(\"systems/mgt2/templates/actors/trait-sheet.html\", {\r\n config: CONFIG.MGT2,\r\n data: data\r\n });\r\n const title = data.hasOwnProperty(\"name\") && data.name !== undefined ? data.name : game.i18n.localize(\"MGT2.Actor.EditTrait\");\r\n const results = new Promise(resolve => {\r\n new this({\r\n title: title,\r\n content: htmlContent,\r\n buttons: {\r\n submit: {\r\n label: game.i18n.localize(\"MGT2.Save\"),\r\n icon: '',\r\n callback: (html) => {\r\n const formData = new FormDataExtended(html[0].querySelector('form')).object;\r\n resolve(formData);\r\n },\r\n }\r\n //cancel: { label: \"Cancel\" }\r\n }\r\n // close: (html) => {\r\n // console.log(\"This always is logged no matter which option is chosen\");\r\n // const formData = new FormDataExtended(html[0].querySelector('form')).object;\r\n // resolve(formData);\r\n // }\r\n }).render(true);\r\n });\r\n\r\n return results;\r\n }\r\n}\r\n\r\nexport class CharacterPrompts {\r\n\r\n static async openConfig(system) {\r\n return await ActorConfigDialog.create(system);\r\n }\r\n\r\n static async openCharacteristic(name, hide, showMax, showAll = false) {\r\n return await ActorCharacteristicDialog.create(name, hide, showMax, showAll);\r\n }\r\n\r\n static async openTraitEdit(data) {\r\n return await TraitEditDialog.create(data);\r\n }\r\n\r\n static async openEditorFullView(title, html) {\r\n return await EditorFullViewDialog.create(title, html);\r\n } \r\n}","import { MGT2 } from \"../config.js\";\nimport { MGT2Helper } from \"../helper.js\";\nimport { RollPromptHelper } from \"../roll-prompt.js\";\nimport { CharacterPrompts } from \"./character-prompts.js\";\n\nexport class TravellerActorSheet extends ActorSheet {\n\n /** @inheritdoc */\n static get defaultOptions() {\n const options = super.defaultOptions;\n\n if (game.user.isGM || options.editable)\n options.dragDrop.push({ dragSelector: \".drag-item-list\", dropSelector: \".drop-item-list\" });\n\n return foundry.utils.mergeObject(options, {\n classes: [\"mgt2\", game.settings.get(\"mgt2\", \"theme\"), \"sheet\", \"actor\", \"character\", \"nopad\"],\n template: \"systems/mgt2/templates/actors/actor-sheet.html\",\n width: 780,\n //height: 600,\n tabs: [\n { navSelector: \".sheet-sidebar\", contentSelector: \"form\" },\n { navSelector: \"nav[data-group='characteristics']\", contentSelector: \"section.characteristics-panel\", initial: \"core\" },\n { navSelector: \"nav[data-group='inventory']\", contentSelector: \"div.tab[data-tab='inventory']\", initial: \"onhand\" }\n ]\n });\n }\n\n async getData(options) {\n const context = super.getData(options);\n //console.log(context);\n /*const context = {\n actor: this.actor,\n source: source.system\n \n }*/\n\n this._prepareCharacterItems(context);\n\n /*context.biographyHTML = await TextEditor.enrichHTML(context.data.system.biography, {\n secrets: this.actor.isOwner,\n rollData: context.rollData,\n async: true,\n relativeTo: this.actor\n });*/\n\n return context.data;\n }\n\n _prepareCharacterItems(sheetData) {\n const actorData = sheetData.data;\n actorData.isGM = game.user.isGM;\n actorData.showTrash = false;//game.user.isGM || game.settings.get(\"mgt2\", \"showTrash\");\n actorData.initiative = this.actor.getInitiative();\n\n const weapons = [];\n const armors = [];\n const augments = [];\n const computers = [];\n const softwares = [];\n const items = [];\n const equipments = [];\n\n const containerItems = [];\n const careers = [];\n const skills = [];\n const psionics = [];\n const diseases = [];\n const wounds = [];\n const contacts = [];\n\n const settings = {\n weightUnit: \"kg\",\n //weightUnit: game.settings.get(\"mgt2\", \"useWeightMetric\") ? \"kg\" : \"lb\",\n usePronouns: game.settings.get(\"mgt2\", \"usePronouns\"),\n useGender: game.settings.get(\"mgt2\", \"useGender\"),\n showLife: game.settings.get(\"mgt2\", \"showLife\")\n };\n actorData.settings = settings;\n\n const actorContainers = [];//sheetData.actor.getContainers();\n\n for (let item of sheetData.items) {\n if (item.type === \"container\") {\n actorContainers.push(item);\n } else if (item.type === \"computer\") {\n computers.push(item);\n item.subItems = [];\n if (item.system.overload === true)\n item.overloadClass = \"computer-overload\";\n }\n }\n\n actorContainers.sort(MGT2Helper.compareByName);\n\n const containers = [{ \"name\": game.i18n.localize(\"MGT2.Items.SelectAll\"), \"_id\": \"\", \"display\": game.i18n.localize(\"MGT2.Items.SelectAll\") }].concat(actorContainers);\n const containerIndex = new Map();\n\n for (let c of actorContainers) {\n containerIndex.set(c._id, c);\n\n if (c.system.weight > 0) {\n c.weight = MGT2Helper.convertWeightForDisplay(c.system.weight) + \" \" + settings.weightUnit;\n c.display = c.name.length > 12 ? `${c.name.substring(0, 12)}... (${c.weight})` : `${c.name} (${c.weight})`;\n } else {\n c.display = c.name.length > 12 ? c.name.substring(0, 12) + \"...\" : c.name;\n }\n\n if (c.system.onHand === true/* && c.system.count > 0*/)\n c.subItems = [];\n }\n\n let currentContainerView;\n if (actorData.system.containerView !== \"\") {\n currentContainerView = containerIndex.get(actorData.system.containerView);\n if (currentContainerView !== undefined) {\n actorData.containerView = currentContainerView;\n actorData.containerWeight = MGT2Helper.convertWeightForDisplay(currentContainerView.system.weight);\n } else {\n currentContainerView = null;\n actorData.containerWeight = MGT2Helper.convertWeightForDisplay(0);\n }\n } else {\n currentContainerView = null;\n actorData.containerWeight = MGT2Helper.convertWeightForDisplay(0);\n }\n\n actorData.containerShowAll = actorData.system.containerView === \"\";\n\n for (let i of sheetData.items) {\n let item = i.system;\n\n if (i.system.hasOwnProperty(\"weight\") && i.system.weight > 0) {\n if (isNaN(i.system.quantity))\n i.weight = MGT2Helper.convertWeightForDisplay(i.system.weight) + \" \" + settings.weightUnit;\n else\n i.weight = MGT2Helper.convertWeightForDisplay(i.system.weight * i.system.quantity) + \" \" + settings.weightUnit;\n }\n\n // Item in Storage\n if (item.hasOwnProperty(\"container\") && item.container.id !== \"\" && item.container.id !== undefined) {\n let container = containerIndex.get(item.container.id);\n if (container === undefined) { // container deleted\n if (actorData.containerShowAll) {\n i.containerName = \"#deleted#\";\n containerItems.push(i);\n }\n continue;\n }\n\n if (container.system.locked && !game.user.isGM) continue;\n\n if (container.system.onHand === true) {\n container.subItems.push(i);\n }\n\n if (actorData.containerShowAll || (!actorData.containerShowAll && actorData.system.containerView == item.container.id)) {\n if (container === undefined)\n i.containerName = \"#deleted#\";\n else\n i.containerName = container.name;\n\n containerItems.push(i);\n }\n\n continue;\n }\n\n if (i.system.hasOwnProperty(\"equipped\")) {\n i.canEquip = true;\n if (i.system.equipped === true)\n i.toggleClass = \"active\";\n } else {\n i.canEquip = false;\n }\n\n switch (i.type) {\n case \"equipment\":\n switch (i.system.subType) {\n case \"augment\":\n augments.push(i);\n break;\n\n default:\n equipments.push(i);\n break;\n }\n break;\n\n case \"armor\":\n armors.push(i);\n if (i.system.options && i.system.options.length > 0) {\n i.subInfo = i.system.options.map(x => x.name).join(\", \");\n }\n break;\n\n case \"computer\":\n //computers.push(i);\n if (i.system.options && i.system.options.length > 0) {\n i.subInfo = i.system.options.map(x => x.name).join(\", \");\n }\n break;\n\n case \"item\":\n if (i.system.subType === \"software\") {\n if (i.system.software.computerId && i.system.software.computerId !== \"\") {\n const computer = computers.find(x => x._id === i.system.software.computerId);\n if (computer !== undefined)\n computer.subItems.push(i);\n else\n softwares.push(i);\n } else {\n if (i.system.software.bandwidth > 0)\n i.display = `${i.name} (${i.system.software.bandwidth})`;\n else\n i.display = i.name;\n softwares.push(i);\n }\n } else {\n items.push(i);\n }\n break;\n\n case \"weapon\":\n if (i.system.range.isMelee)\n i.range = game.i18n.localize(\"MGT2.Melee\")\n else {\n i.range = MGT2Helper.getRangeDisplay(i.system.range);\n }\n\n // Traits\n // if (i.system.traits == undefined)\n // i.system.traits = {\n // parts: []\n // };\n\n // let traits = i.system.traits.parts.map(x => x[0]);\n\n // traits.sort();\n // i.traits = traits.join(\", \");\n // if (i.system.options && i.system.options.length > 0) {\n // i.subInfo = i.system.options.map(x => x.name).join(\", \");\n // }\n if (i.system.traits && i.system.traits.length > 0) {\n i.subInfo = i.system.traits.map(x => x.name).join(\", \");\n }\n\n weapons.push(i);\n break;\n\n case \"career\":\n careers.push(i);\n break;\n\n case \"contact\":\n contacts.push(i);\n break;\n\n case \"disease\":\n switch (i.system.subType) {\n case \"wound\":\n wounds.push(i);\n break;\n\n default:\n diseases.push(i);\n break;\n }\n break;\n\n case \"talent\":\n if (i.system.subType === \"skill\") {\n skills.push(i);\n } else {\n if (MGT2Helper.hasValue(i.system.psionic, \"reach\")) {\n i.reach = game.i18n.localize(`MGT2.PsionicReach.${i.system.psionic.reach}`);\n }\n\n if (MGT2Helper.hasValue(i.system.roll, \"difficulty\")) {\n i.difficulty = game.i18n.localize(`MGT2.Difficulty.${i.system.roll.difficulty}`);\n //i.difficulty = MGT2Helper.getDifficultyDisplay(i.system.roll.difficulty);\n }\n psionics.push(i);\n }\n break;\n\n case \"container\":\n if (i.system.onHand === true) {\n items.push(i);\n // sous item\n }\n break;\n }\n }\n\n // let weight = MGT2Helper.getItemsWeight(weapons) +\n // MGT2Helper.getItemsWeight(augments) +\n // MGT2Helper.getItemsWeight(armors) +\n // MGT2Helper.getItemsWeight(computers) +\n // MGT2Helper.getItemsWeight(items);\n\n //let containerWeight = MGT2Helper.getItemsWeight(containerItems);\n\n actorData.encumbranceNormal = MGT2Helper.convertWeightForDisplay(actorData.system.inventory.encumbrance.normal);\n actorData.encumbranceHeavy = MGT2Helper.convertWeightForDisplay(actorData.system.inventory.encumbrance.heavy);\n //actorData.weight = MGT2Helper.convertWeightForDisplay(weight); // actorData.system.inventory.weight\n //actorData.containerWeight = MGT2Helper.convertWeightForDisplay(containerWeight);\n //actorData.dropInContainer = \n\n if (actorData.system.inventory.weight > actorData.system.inventory.encumbrance.heavy) {\n actorData.encumbranceClasses = \"encumbrance-heavy\"\n actorData.encumbrance = 2;\n } else if (actorData.system.inventory.weight > actorData.system.inventory.encumbrance.normal) {\n actorData.encumbranceClasses = \"encumbrance-normal\"\n actorData.encumbrance = 1;\n } else {\n actorData.encumbrance = 0;\n }\n\n if (softwares.length > 0) {\n softwares.sort(MGT2Helper.compareByName);\n actorData.softwares = softwares;\n }\n\n augments.sort(this.compareEquippedByName);\n actorData.augments = augments;\n\n armors.sort(this.compareEquippedByName);\n actorData.armors = armors;\n\n computers.sort(this.compareEquippedByName);\n actorData.computers = computers;\n\n //careers.sort(this.compareByName);\n actorData.careers = careers; // First In First Out\n\n contacts.sort(MGT2Helper.compareByName);\n actorData.contacts = contacts;\n\n containers.sort(MGT2Helper.compareByName);\n actorData.containers = containers;\n\n diseases.sort(MGT2Helper.compareByName);\n actorData.diseases = diseases;\n\n actorData.wounds = wounds;\n\n equipments.sort(this.compareEquippedByName);\n actorData.equipments = equipments;\n\n items.sort(this.compareEquippedByName);\n actorData.items = items;\n\n actorContainers.sort(MGT2Helper.compareByName);\n actorData.actorContainers = actorContainers;\n\n skills.sort(MGT2Helper.compareByName);\n actorData.skills = skills;\n\n psionics.sort(MGT2Helper.compareByName);\n actorData.psionics = psionics;\n\n weapons.sort(this.compareEquippedByName);\n actorData.weapons = weapons;\n\n if (containerItems.length > 0) {\n containerItems.sort((a, b) => {\n const containerResult = a.containerName.localeCompare(b.containerName);\n if (containerResult !== 0) return containerResult;\n\n return a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n });\n }\n\n actorData.containerItems = containerItems;\n }\n\n compareEquippedByName(a, b) {\n //if (a.system.hasOwnProperty(\"equipped\") && !b.system.hasOwnProperty(\"equipped\")) return -1;\n //if (!a.system.hasOwnProperty(\"equipped\") && b.system.hasOwnProperty(\"equipped\")) return 1;\n\n //if (a.system.equipped === true && b.system.equipped === false) return -1;\n //if (a.system.equipped === false && b.system.equipped === true) return 1;\n\n return a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n }\n\n activateListeners(html) {\n super.activateListeners(html);\n\n // Everything below here is only needed if the sheet is editable\n if (!this.options.editable) return;\n\n // if (this.actor.isOwner) {\n // let handler = ev => this._onDragStart(ev);\n\n // html.find('div.dropitem').each((i, e) => {\n // //if (li.classList.contains(\"inventory-header\")) return;\n // e.setAttribute(\"draggable\", true);\n // e.addEventListener(\"dragstart\", handler, false);\n // });\n // }\n\n html.find('.container-create').click(this._onContainerCreate.bind(this));\n html.find('.container-edit').click(ev => {\n const container = this.actor.getEmbeddedDocument(\"Item\", this.actor.system.containerView);\n container.sheet.render(true);\n });\n\n html.find('.container-delete').click(ev => {\n ev.preventDefault();\n const containers = this.actor.getContainers();\n const container = containers.find(x => x._id == this.actor.system.containerView);\n const containerItems = this.actor.items.filter(x => x.system.hasOwnProperty(\"container\") && x.system.container.id === container._id);\n\n if (containerItems.length > 0) {\n for (let item of containerItems) {\n let clone = duplicate(item);\n clone.system.container.id = \"\";\n this.actor.updateEmbeddedDocuments('Item', [clone]);\n }\n }\n\n const cloneActor = duplicate(this.actor);\n cloneActor.system.containerView = \"\";\n if (cloneActor.system.containerDropIn === container._id) {\n cloneActor.system.containerDropIn = \"\";\n const remainingContainers = containers.filter(x => x._id !== container._id);\n if (remainingContainers.length > 0)\n cloneActor.system.containerDropIn = remainingContainers[0]._id;\n }\n this.actor.deleteEmbeddedDocuments(\"Item\", [container._id]);\n this.actor.update(cloneActor);\n });\n\n html.find('.item-create').click(this._onItemCreate.bind(this));\n html.find('.item-edit').click(ev => {\n ev.preventDefault();\n const html = $(ev.currentTarget).parents(\"[data-item-id]\");\n const item = this.actor.getEmbeddedDocument(\"Item\", html.data(\"itemId\"));\n item.sheet.render(true);\n });\n\n html.find('.item-delete').click(ev => {\n ev.preventDefault();\n const html = $(ev.currentTarget).parents(\"[data-item-id]\");\n // ev.ctrlKey === true\n\n this.actor.deleteEmbeddedDocuments(\"Item\", [html.data(\"itemId\")]);\n html.slideUp(200, () => this.render(false));\n });\n html.find('a.item-equip').click(this._onItemEquip.bind(this));\n html.find('a.item-storage-out').click(this._onItemStorageOut.bind(this));\n html.find('a.item-storage-in').click(this._onItemStorageIn.bind(this));\n html.find('a.software-eject').click(this._onSoftwareEject.bind(this));\n\n html.find('a[data-roll]').click(this._onRoll.bind(this));\n html.find('a[name=\"config\"]').click(this._onOpenConfig.bind(this));\n html.find('a[data-cfg-characteristic]').click(this._onOpenCharacteristic.bind(this));\n html.find('.traits-create').click(this._onTraitCreate.bind(this));\n html.find('.traits-edit').click(this._onTraitEdit.bind(this));\n html.find('.traits-delete').click(this._onTraitDelete.bind(this));\n html.find('a[data-editor=\"open\"]').click(this._onOpenEditor.bind(this));\n };\n\n async _onOpenEditor(event) {\n event.preventDefault();\n await CharacterPrompts.openEditorFullView(this.actor.system.personal.species, this.actor.system.personal.speciesText.descriptionLong);\n }\n\n async _onTraitCreate(event) {\n event.preventDefault();\n await this._onSubmit(event);\n let traits = this.actor.system.personal.traits;\n let index;\n if (traits.length === 0) {\n traits = {};\n traits[\"0\"] = { name: \"\", description: \"\" };\n } else {\n index = Math.max(...Object.keys(traits));\n index++;\n traits[index] = { name: \"\", description: \"\" };\n }\n\n return this.actor.update({ system: { personal: { traits: traits } } });\n }\n\n async _onTraitEdit(event) {\n event.preventDefault();\n const index = $(event.currentTarget).parents(\"[data-traits-part]\").data(\"traits-part\");\n const trait = this.actor.system.personal.traits[index];\n let result = await CharacterPrompts.openTraitEdit(trait);\n const traits = this.actor.system.personal.traits;\n traits[index].name = result.name;\n traits[index].description = result.description;\n return this.actor.update({ system: { personal: { traits: traits } } });\n }\n\n async _onTraitDelete(event) {\n event.preventDefault();\n await this._onSubmit(event);\n const element = event.currentTarget.closest(\".traits-part\");\n const traits = foundry.utils.deepClone(this.actor.system.personal.traits);\n let index = Number(element.dataset.traitsPart);\n\n const newTraits = [];\n let entries = Object.entries(traits);\n if (entries.length > 1) {\n for (const [key, value] of entries) {\n if (key != index)\n newTraits.push(value);\n }\n }\n\n return this.actor.update({ system: { personal: { traits: newTraits } } });\n }\n\n async _onOpenConfig(ev) {\n ev.preventDefault();\n //console.log(this.actor.system);\n const userConfig = await CharacterPrompts.openConfig(this.actor.system);\n //console.log(userData);\n // {initiative: 'dexterity', damage.rank1: 'strength', damage.rank2: 'dexterity', damage.rank3: 'endurance'}\n if (userConfig) {\n this.actor.update({ \"system.config\": userConfig });\n }\n }\n\n async _onOpenCharacteristic(ev) {\n ev.preventDefault();\n const name = ev.currentTarget.dataset.cfgCharacteristic;\n const c = this.actor.system.characteristics[name];\n\n let showAll = false;\n for (const [key, value] of Object.entries(this.actor.system.characteristics)) {\n if (!value.show) {\n showAll = true;\n break;\n }\n }\n\n const userConfig = await CharacterPrompts.openCharacteristic(game.i18n.localize(`MGT2.Characteristics.${name}.name`), c.show, c.showMax, showAll);\n\n // {hide: false, showMax: true, showAll: false}\n if (userConfig) {\n const data = {\n system: {\n characteristics: {}\n }\n };\n\n data.system.characteristics[name] = {\n show: userConfig.show,\n showMax: userConfig.showMax\n };\n\n if (userConfig.showAll === true) {\n for (const [key, value] of Object.entries(this.actor.system.characteristics)) {\n if (key !== name && !value.show) {\n data.system.characteristics[key] = { show: true };\n }\n }\n }\n\n this.actor.update(data);\n }\n }\n\n async _onRoll(event) {\n event.preventDefault();\n\n const rollOptions = {\n rollTypeName: game.i18n.localize(\"MGT2.RollPrompt.Roll\"),\n rollObjectName: \"\",\n characteristics: [{ _id: \"\", name: \"\" }],\n characteristic: \"\",\n skills: [],\n skill: \"\",\n fatigue: this.actor.system.states.fatigue,\n encumbrance: this.actor.system.states.encumbrance,\n difficulty: null,\n damageFormula: null\n };\n\n // TODO Convertir le bouton des dégâts\n const cardButtons = [];\n\n for (const [key, label] of Object.entries(MGT2.Characteristics)) {\n const c = this.actor.system.characteristics[key];\n if (c.show) {\n rollOptions.characteristics.push({ _id: key, name: game.i18n.localize(label) + MGT2Helper.getDisplayDM(c.dm) });\n }\n }\n\n for (let item of this.actor.items) {\n if (item.type === \"talent\") {\n if (item.system.subType === \"skill\")\n rollOptions.skills.push({ _id: item._id, name: item.getRollDisplay() });\n }\n }\n\n rollOptions.skills.sort(MGT2Helper.compareByName);\n rollOptions.skills = [{ _id: \"NP\", name: game.i18n.localize(\"MGT2.Items.NotProficient\") }].concat(rollOptions.skills);\n\n let itemObj = null;\n let isInitiative = false;\n const button = event.currentTarget;\n if (button.dataset.roll === \"initiative\") {\n rollOptions.rollTypeName = game.i18n.localize(\"MGT2.RollPrompt.InitiativeRoll\");\n rollOptions.characteristic = this.actor.system.config.initiative;\n isInitiative = true;\n } else if (button.dataset.roll === \"characteristic\") {\n rollOptions.characteristic = button.dataset.rollCharacteristic;\n rollOptions.rollTypeName = game.i18n.localize(\"MGT2.RollPrompt.CharacteristicRoll\");\n rollOptions.rollObjectName = game.i18n.localize(`MGT2.Characteristics.${rollOptions.characteristic}.name`);\n } else {\n\n if (button.dataset.roll === \"skill\") {\n rollOptions.skill = button.dataset.rollSkill;\n itemObj = this.actor.getEmbeddedDocument(\"Item\", rollOptions.skill);\n rollOptions.rollTypeName = game.i18n.localize(\"MGT2.RollPrompt.SkillRoll\");\n rollOptions.rollObjectName = itemObj.name;\n } else {\n if (button.dataset.roll === \"psionic\") {\n rollOptions.rollTypeName = game.i18n.localize(\"MGT2.RollPrompt.PsionicRoll\");\n }\n }\n\n if (itemObj === null && button.dataset.itemId) {\n itemObj = this.actor.getEmbeddedDocument(\"Item\", button.dataset.itemId);\n rollOptions.rollObjectName = itemObj.name;\n if (itemObj.type === \"weapon\")\n rollOptions.rollTypeName = game.i18n.localize(\"TYPES.Item.weapon\");\n else if (itemObj.type === \"armor\")\n rollOptions.rollTypeName = game.i18n.localize(\"TYPES.Item.armor\");\n else if (itemObj.type === \"computer\")\n rollOptions.rollTypeName = game.i18n.localize(\"TYPES.Item.computer\");\n }\n\n if (button.dataset.roll === \"psionic\") {\n rollOptions.rollObjectName = itemObj.name;\n if (MGT2Helper.hasValue(itemObj.system.psionic, \"duration\")) {\n cardButtons.push({\n label: game.i18n.localize(\"MGT2.Items.Duration\"),\n formula: itemObj.system.psionic.duration,\n message: {\n objectName: itemObj.name,\n flavor: \"{0} \".concat(game.i18n.localize(`MGT2.Durations.${itemObj.system.psionic.durationUnit}`)) \n }\n });\n }\n }\n\n if (itemObj.system.hasOwnProperty(\"damage\")) {\n rollOptions.damageFormula = itemObj.system.damage;\n if (itemObj.type === \"disease\") {\n if (itemObj.system.subTypetype === \"disease\") {\n rollOptions.rollTypeName = game.i18n.localize(\"MGT2.DiseaseSubType.disease\");\n } else if (itemObj.system.subTypetype === \"poison\") {\n rollOptions.rollTypeName = game.i18n.localize(\"MGT2.DiseaseSubType.poison\");\n }\n }\n }\n\n if (itemObj.system.hasOwnProperty(\"roll\")) {\n if (MGT2Helper.hasValue(itemObj.system.roll, \"characteristic\")) {\n rollOptions.characteristic = itemObj.system.roll.characteristic;\n }\n\n if (MGT2Helper.hasValue(itemObj.system.roll, \"skill\")) {\n rollOptions.skill = itemObj.system.roll.skill;\n }\n\n if (MGT2Helper.hasValue(itemObj.system.roll, \"difficulty\")) {\n rollOptions.difficulty = itemObj.system.roll.difficulty;\n }\n }\n }\n\n const userRollData = await RollPromptHelper.roll(rollOptions);\n\n const rollModifiers = [];\n const rollFormulaParts = [];\n if (userRollData.diceModifier) {\n rollFormulaParts.push(\"3d6\");\n rollFormulaParts.push(userRollData.diceModifier);\n } else {\n rollFormulaParts.push(\"2d6\");\n }\n\n if (userRollData.hasOwnProperty(\"characteristic\") && userRollData.characteristic !== \"\") {\n let c = this.actor.system.characteristics[userRollData.characteristic];\n let dm = c.dm;\n rollFormulaParts.push(MGT2Helper.getFormulaDM(dm));\n rollModifiers.push(game.i18n.localize(`MGT2.Characteristics.${userRollData.characteristic}.name`) + MGT2Helper.getDisplayDM(dm));\n }\n\n if (userRollData.hasOwnProperty(\"skill\") && userRollData.skill !== \"\") {\n if (userRollData.skill === \"NP\") {\n rollFormulaParts.push(\"-3\");\n rollModifiers.push(game.i18n.localize(\"MGT2.Items.NotProficient\"));\n } else {\n const skillObj = this.actor.getEmbeddedDocument(\"Item\", userRollData.skill);\n rollFormulaParts.push(MGT2Helper.getFormulaDM(skillObj.system.level));\n rollModifiers.push(skillObj.getRollDisplay());\n }\n }\n\n if (userRollData.hasOwnProperty(\"psionic\") && userRollData.psionic !== \"\") {\n let psionicObj = this.actor.getEmbeddedDocument(\"Item\", userRollData.psionic);\n rollFormulaParts.push(MGT2Helper.getFormulaDM(psionicObj.system.level));\n rollModifiers.push(psionicObj.getRollDisplay());\n }\n\n if (userRollData.hasOwnProperty(\"timeframes\") &&\n userRollData.timeframes !== \"\" &&\n userRollData.timeframes !== \"Normal\") {\n rollModifiers.push(game.i18n.localize(`MGT2.Timeframes.${userRollData.timeframes}`));\n rollFormulaParts.push(userRollData.timeframes === \"Slower\" ? \"+2\" : \"-2\");\n }\n\n if (userRollData.hasOwnProperty(\"encumbrance\") && userRollData.encumbrance === true) {\n rollFormulaParts.push(\"-2\");\n\n rollModifiers.push(game.i18n.localize(\"MGT2.Actor.Encumbrance\") + \" -2\");\n }\n\n if (userRollData.hasOwnProperty(\"fatigue\") && userRollData.fatigue === true) {\n rollFormulaParts.push(\"-2\");\n rollModifiers.push(game.i18n.localize(\"MGT2.Actor.Fatigue\") + \" -2\");\n }\n\n if (userRollData.hasOwnProperty(\"customDM\") && userRollData.customDM !== \"\") {\n let s = userRollData.customDM.trim();\n if (/^[0-9]/.test(s))\n rollFormulaParts.push(\"+\");\n rollFormulaParts.push(s);\n }\n\n if (MGT2Helper.hasValue(userRollData, \"difficulty\")) {\n rollOptions.difficulty = userRollData.difficulty;\n }\n\n const rollData = this.actor.getRollData();\n\n const rollFormula = rollFormulaParts.join(\"\");\n\n if (!Roll.validate(rollFormula)) {\n ui.notifications.error(game.i18n.localize(\"MGT2.Errors.InvalidRollFormula\"));\n return;\n }\n\n let roll = await new Roll(rollFormula, rollData).roll({ async: true, rollMode: userRollData.rollMode });\n\n if (isInitiative && this.token && this.token.combatant) {\n await this.token.combatant.update({ initiative: roll.total });\n }\n\n let isPrivate = false;\n //let flavor = \"Roule!\";\n const chatData = {\n user: game.user.id,\n speaker: this.actor ? ChatMessage.getSpeaker({ actor: this.actor }) : null,\n formula: isPrivate ? \"???\" : roll._formula,\n //flavor: isPrivate ? null : flavor,\n tooltip: isPrivate ? \"\" : await roll.getTooltip(),\n total: isPrivate ? \"?\" : Math.round(roll.total * 100) / 100,\n type: CONST.CHAT_MESSAGE_TYPES.ROLL,\n showButtons: true,\n showLifeButtons: false,\n showRollRequest: false,\n rollTypeName: rollOptions.rollTypeName,\n rollObjectName: rollOptions.rollObjectName,\n rollModifiers: rollModifiers,\n showRollDamage: rollOptions.damageFormula !== null && rollOptions.damageFormula !== \"\",\n cardButtons: cardButtons\n };\n\n if (MGT2Helper.hasValue(rollOptions, \"difficulty\")) {\n chatData.rollDifficulty = rollOptions.difficulty;\n chatData.rollDifficultyLabel = game.i18n.localize(`MGT2.Difficulty.${rollOptions.difficulty}`);\n \n if (roll.total >= MGT2Helper.getDifficultyValue(rollOptions.difficulty)) {\n chatData.rollSuccess = true;\n } else {\n chatData.rollFailure = true;\n }\n }\n\n const html = await renderTemplate(\"systems/mgt2/templates/chat/roll.html\", chatData);\n chatData.content = html;\n\n let flags = null;\n\n if (rollOptions.damageFormula !== null && rollOptions.damageFormula !== \"\") {\n flags = { mgt2: { damage: { formula: rollOptions.damageFormula, rollObjectName: rollOptions.rollObjectName, rollTypeName: rollOptions.rollTypeName } } };\n }\n\n if (cardButtons.length > 0) {\n if (flags === null) flags = { mgt2: {} };\n flags.mgt2.buttons = cardButtons;\n }\n\n if (flags !== null)\n chatData.flags = flags;\n\n return roll.toMessage(chatData);\n }\n\n _onItemCreate(ev) {\n ev.preventDefault();\n const html = $(ev.currentTarget);\n\n const data = {\n name: html.data(\"create-name\"),\n type: html.data(\"type-item\")\n };\n\n if (html.data(\"subtype\")) {\n data.system = {\n subType: html.data(\"subtype\")\n };\n }\n\n const cls = getDocumentClass(\"Item\");\n\n return cls.create(data, { parent: this.actor });\n }\n\n _onItemEquip(ev) {\n ev.preventDefault();\n const html = $(ev.currentTarget).parents(\"[data-item-id]\");\n const item = duplicate(this.actor.getEmbeddedDocument(\"Item\", html.data(\"itemId\")));\n item.system.equipped = !item.system.equipped;\n this.actor.updateEmbeddedDocuments('Item', [item]);\n }\n\n _onItemStorageIn(ev) {\n ev.preventDefault();\n const html = $(ev.currentTarget).parents(\"[data-item-id]\");\n const item = duplicate(this.actor.getEmbeddedDocument(\"Item\", html.data(\"itemId\")));\n if (item.type === \"container\") {\n item.system.onHand = false;\n } else {\n let container;\n const containers = this.actor.getContainers();\n if (this.actor.system.containerDropIn == \"\" || this.actor.system.containerDropIn === null) {\n // Placer dans le premier container\n if (containers.length === 0) {\n // Create default container\n const cls = getDocumentClass(\"Item\");\n container = cls.create({ name: game.i18n.localize(\"MGT2.Actor.NewContainer\"), type: \"container\" }, { parent: this.actor });\n } else {\n container = containers[0];\n }\n } else {\n container = containers.find(x => x._id == this.actor.system.containerDropIn);\n }\n\n if (container.system.locked) {\n if (game.user.isGM) {\n item.system.container.id = container._id;\n } else {\n ui.notifications.error(\"Objet verrouillé\");\n }\n } else {\n item.system.container.id = container._id;\n }\n\n }\n this.actor.updateEmbeddedDocuments('Item', [item]);\n }\n\n _onItemStorageOut(ev) {\n ev.preventDefault();\n const html = $(ev.currentTarget).parents(\"[data-item-id]\");\n const item = duplicate(this.actor.getEmbeddedDocument(\"Item\", html.data(\"itemId\")));\n item.system.container.id = \"\";\n //item.system.container.inContainer = false;\n this.actor.updateEmbeddedDocuments('Item', [item]);\n }\n\n _onSoftwareEject(ev) {\n ev.preventDefault();\n const html = $(ev.currentTarget).parents(\"[data-item-id]\");\n const item = duplicate(this.actor.getEmbeddedDocument(\"Item\", html.data(\"itemId\")));\n item.system.software.computerId = \"\";\n this.actor.updateEmbeddedDocuments('Item', [item]);\n }\n\n _onContainerCreate(ev) {\n ev.preventDefault();\n const cls = getDocumentClass(\"Item\");\n return cls.create({ name: game.i18n.localize(\"MGT2.Actor.NewContainer\"), type: \"container\" }, { parent: this.actor });\n }\n\n _canDragDrop(selector) {\n return this.isEditable;\n }\n\n async _onDrop(event) {\n //console.log(\"_onDrop\");\n //console.log(event);\n event.preventDefault();\n event.stopImmediatePropagation();\n const dropData = MGT2Helper.getDataFromDropEvent(event);\n if (!dropData) return false;\n\n const sourceItemData = await MGT2Helper.getItemDataFromDropData(dropData);\n\n if (sourceItemData.type === \"species\") {\n const update = {\n system: {\n personal: {\n species: sourceItemData.name,\n speciesText: {\n description: sourceItemData.system.description,\n descriptionLong: sourceItemData.system.descriptionLong\n },\n }\n }\n };\n\n update.system.personal.traits = this.actor.system.personal.traits.concat(sourceItemData.system.traits);\n\n // characteristics\n if (sourceItemData.system.modifiers && sourceItemData.system.modifiers.length > 0) {\n update.system.characteristics = {};\n for (let modifier of sourceItemData.system.modifiers) {\n if (MGT2Helper.hasValue(modifier, \"characteristic\") && MGT2Helper.hasValue(modifier, \"value\")) {\n const c = this.actor.system.characteristics[modifier.characteristic];\n const updateValue = { value: c.value };\n updateValue.value += modifier.value;\n if (c.showMax) {\n updateValue.max = c.max + modifier.value;\n }\n\n update.system.characteristics[modifier.characteristic] = updateValue;\n }\n }\n\n // recalcul modifier?\n }\n\n this.actor.update(update);\n\n return true;\n }\n\n // Simple drop\n if (sourceItemData.type === \"contact\" || sourceItemData.type === \"disease\" ||\n sourceItemData.type === \"career\" || sourceItemData.type === \"talent\") {\n let transferData = {};\n try {\n transferData = sourceItemData.toJSON();\n } catch (err) {\n transferData = sourceItemData;\n }\n\n delete transferData._id;\n delete transferData.id;\n await this.actor.createEmbeddedDocuments(\"Item\", [transferData]);\n return true;\n }\n\n // Supported drop (don't drop vehicule stuff)\n if (sourceItemData.type !== \"armor\" && sourceItemData.type !== \"weapon\" &&\n sourceItemData.type !== \"computer\" && sourceItemData.type !== \"container\" &&\n sourceItemData.type !== \"item\" && sourceItemData.type !== \"equipment\") return false;\n\n const target = event.target.closest(\".table-row\");\n let targetId = null;\n let targetItem = null;\n\n if (target !== null && target !== undefined) {\n targetId = target.dataset.itemId;\n targetItem = this.actor.getEmbeddedDocument(\"Item\", targetId);\n }\n\n let sourceItem = this.actor.getEmbeddedDocument(\"Item\", sourceItemData.id);\n if (sourceItem) { // same actor item move\n if (targetItem === null || targetItem === undefined) return false;\n\n sourceItem = duplicate(sourceItem);\n if (sourceItem._id === targetId) return false; // Same item\n\n if (targetItem.type === \"item\" || targetItem.type === \"equipment\") {\n // SOFTWARE --> COMPUTER\n if (targetItem.system.subType === \"software\") {\n sourceItem.system.software.computerId = targetItem.system.software.computerId;\n } else {\n sourceItem.system.container.id = targetItem.system.container.id;\n }\n this.actor.updateEmbeddedDocuments('Item', [sourceItem]);\n return true;\n } else if (targetItem.type === \"computer\") {\n sourceItem.system.software.computerId = targetId;\n this.actor.updateEmbeddedDocuments('Item', [sourceItem]);\n return true;\n } else if (targetItem.type === \"container\") {\n // locked refuse\n if (targetItem.system.locked && !game.user.isGM)\n ui.notifications.error(\"Verrouillé\");\n else {\n sourceItem.system.container.id = targetId;\n this.actor.updateEmbeddedDocuments('Item', [sourceItem]);\n return true;\n }\n }\n } else {\n // Copy item from other source\n let transferData = {};\n try {\n transferData = sourceItemData.toJSON();\n } catch (err) {\n transferData = sourceItemData;\n }\n\n //const sourceItemId = transferData._id;\n\n delete transferData._id;\n delete transferData.id;\n\n const recalcWeight = transferData.system.hasOwnProperty(\"weight\");\n\n // Normalize data\n if (transferData.system.hasOwnProperty(\"container\"))\n transferData.system.container.id = \"\";\n if (transferData.type === \"item\" && transferData.system.subType === \"software\")\n transferData.system.software.computerId = \"\";\n\n if (transferData.type === \"container\")\n transferData.onHand = true;\n\n if (transferData.system.hasOwnProperty(\"equipment\"))\n transferData.system.equipped = false;\n\n\n if (targetItem !== null) {\n // Handle computer & container\n if (transferData.type === \"item\" && transferData.system.subType === \"software\") {\n if (targetItem.type === \"item\" && targetItem.system.subType === \"software\") {\n transferData.system.software.computerId = targetItem.system.software.computerId;\n\n } else if (targetItem.type === \"computer\") {\n transferData.system.software.computerId = targetItem._id;\n }\n } else if (transferData.type === \"armor\" || transferData.type === \"computer\" || transferData.type === \"equipment\" || transferData.type === \"item\" || transferData.type === \"weapon\") {\n if (targetItem.type === \"container\") {\n if (!targetItem.system.locked || game.user.isGM) {\n transferData.system.container.id = targetId;\n }\n } else {\n if (MGT2Helper.hasValue(targetItem.system.container, \"id\"))\n transferData.system.container.id = targetItem.system.container.id;\n else\n transferData.system.container.id = \"\";\n }\n }\n }\n\n const addedItem = (await this.actor.createEmbeddedDocuments(\"Item\", [transferData]))[0];\n\n if (transferData.actor) {\n // delete item\n // if container, tranferts content onHand true\n }\n\n\n if (recalcWeight) {\n await this.actor.recalculateWeight(this.actor);\n }\n }\n return true;\n }\n\n _getSubmitData(updateData = {}) {\n const formData = foundry.utils.expandObject(super._getSubmitData(updateData));\n // this.actor.computeCharacteristics(formData);\n return foundry.utils.flattenObject(formData);\n }\n}\n","/**\r\n * Define a set of template paths to pre-load\r\n * Pre-loaded templates are compiled and cached for fast access when rendering\r\n * @return {Promise}\r\n */\r\nexport const preloadHandlebarsTemplates = async function() {\r\n\r\n const templatePaths = [\r\n \"systems/mgt2/templates/items/parts/sheet-configuration.html\",\r\n \"systems/mgt2/templates/items/parts/sheet-physical-item.html\",\r\n \"systems/mgt2/templates/roll-prompt.html\",\r\n \"systems/mgt2/templates/chat/roll.html\",\r\n //\"systems/mgt2/templates/chat/roll-characteristic.html\",\r\n \"systems/mgt2/templates/actors/actor-config-sheet.html\",\r\n \"systems/mgt2/templates/actors/actor-config-characteristic-sheet.html\",\r\n \"systems/mgt2/templates/actors/trait-sheet.html\",\r\n \"systems/mgt2/templates/editor-fullview.html\"\r\n //\"systems/mgt2/templates/actors/parts/actor-characteristic.html\"\r\n ];\r\n \r\n return loadTemplates(templatePaths);\r\n };","import { MGT2Helper } from \"./helper.js\";\r\n\r\nexport class ChatHelper {\r\n\r\n\r\n // _injectContent(message, type, html) {\r\n\r\n // _setupCardListeners(message, html);\r\n\r\n // }\r\n\r\n\r\n static setupCardListeners(message, html, messageData) {\r\n if (!message || !html) {\r\n return;\r\n }\r\n // if (SettingsUtility.getSettingValue(SETTING_NAMES.MANUAL_DAMAGE_MODE) > 0) {\r\n // html.find('.card-buttons').find(`[data-action='rsr-${ROLL_TYPE.DAMAGE}']`).click(async event => {\r\n // await _processDamageButtonEvent(message, event);\r\n // });\r\n // }\r\n html.find('button[data-action=\"rollDamage\"]').click(async event => {\r\n //ui.notifications.warn(\"rollDamage\");\r\n await this._processRollDamageButtonEvent(message, event);\r\n });\r\n\r\n html.find('button[data-action=\"damage\"]').click(async event => {\r\n //ui.notifications.warn(\"damage\");\r\n await this._applyChatCardDamage(message, event);\r\n //await _processApplyButtonEvent(message, event);\r\n });\r\n\r\n html.find('button[data-action=\"healing\"]').click(async event => {\r\n ui.notifications.warn(\"healing\");\r\n //await _processApplyTotalButtonEvent(message, event);\r\n });\r\n\r\n html.find('button[data-index]').click(async event => {\r\n \r\n await this._processRollButtonEvent(message, event);\r\n });\r\n }\r\n\r\n static async _processRollButtonEvent(message, event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n let buttons = message.flags.mgt2.buttons;\r\n const index = event.target.dataset.index;\r\n const button = buttons[index];\r\n let roll = await new Roll(button.formula, {}).roll({ async: true });\r\n //console.log(message);\r\n\r\n const chatData = {\r\n user: game.user.id,\r\n speaker: message.speaker,\r\n formula: roll._formula,\r\n tooltip: await roll.getTooltip(),\r\n total: Math.round(roll.total * 100) / 100,\r\n //formula: isPrivate ? \"???\" : roll._formula,\r\n //tooltip: isPrivate ? \"\" : await roll.getTooltip(),\r\n //total: isPrivate ? \"?\" : Math.round(roll.total * 100) / 100,\r\n type: CONST.CHAT_MESSAGE_TYPES.ROLL,\r\n rollObjectName: button.message.objectName,\r\n rollMessage: MGT2Helper.format(button.message.flavor, Math.round(roll.total * 100) / 100),\r\n };\r\n\r\n const html = await renderTemplate(\"systems/mgt2/templates/chat/roll.html\", chatData);\r\n chatData.content = html;\r\n return roll.toMessage(chatData);\r\n }\r\n\r\n static async _processRollDamageButtonEvent(message, event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n let rollFormula = message.flags.mgt2.damage.formula;\r\n\r\n let roll = await new Roll(rollFormula, {}).roll({ async: true });\r\n\r\n let speaker;\r\n let selectTokens = canvas.tokens.controlled;\r\n if (selectTokens.length > 0) {\r\n speaker = selectTokens[0].actor;\r\n } else {\r\n speaker = game.user.character;\r\n }\r\n\r\n let rollTypeName = message.flags.mgt2.damage.rollTypeName ? message.flags.mgt2.damage.rollTypeName + \" DAMAGE\" : null;\r\n\r\n const chatData = {\r\n user: game.user.id,\r\n speaker: ChatMessage.getSpeaker({ actor: speaker }),\r\n formula: roll._formula,\r\n tooltip: await roll.getTooltip(),\r\n total: Math.round(roll.total * 100) / 100,\r\n type: CONST.CHAT_MESSAGE_TYPES.ROLL,\r\n showButtons: true,\r\n hasDamage: true,\r\n rollTypeName: rollTypeName,\r\n rollObjectName: message.flags.mgt2.damage.rollObjectName\r\n };\r\n\r\n const html = await renderTemplate(\"systems/mgt2/templates/chat/roll.html\", chatData);\r\n chatData.content = html;\r\n\r\n return roll.toMessage(chatData);\r\n }\r\n\r\n async _processDamageButtonEvent(message, event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n //message.flags[MODULE_SHORT].manualDamage = false\r\n //message.flags[MODULE_SHORT].renderDamage = true; \r\n // current user/actor\r\n\r\n await ItemUtility.runItemAction(null, message, ROLL_TYPE.DAMAGE);\r\n }\r\n\r\n static _applyChatCardDamage(message, event) {\r\n const roll = message.rolls[0];\r\n return Promise.all(canvas.tokens.controlled.map(t => {\r\n const a = t.actor;\r\n return a.applyDamage(roll.total);\r\n }));\r\n }\r\n}","export const registerSettings = function () {\r\n\r\n // https://foundryvtt.com/api/classes/client.ClientSettings.html#register\r\n /*game.settings.register('mgt2', 'test', {\r\n name: \"Test\",\r\n hint: \"A description of the registered setting and its behavior.\",\r\n scope: \"client\", // This specifies a client-stored setting\r\n config: true, // This specifies that the setting appears in the configuration view\r\n requiresReload: false, // This will prompt the user to reload the application for the setting to take effect.\r\n type: String,\r\n choices: { // If choices are defined, the resulting setting will be a select menu\r\n \"a\": \"Option A\",\r\n \"b\": \"Option B\"\r\n }\r\n });*/\r\n\r\n // User can Create WEapon/Armor/Augment/Computer/Item DEFAUT TRUE\r\n\r\n game.settings.register(\"mgt2\", \"theme\", {\r\n name: \"MGT2.Settings.theme.name\",\r\n hint: \"MGT2.Settings.theme.hint\",\r\n scope: \"client\",\r\n config: true,\r\n default: \"black-and-red\",\r\n type: String,\r\n choices: {\r\n \"black-and-red\": \"MGT2.Themes.BlackAndRed\",\r\n \"mwamba\": \"MGT2.Themes.Mwamba\",\r\n \"blue\": \"MGT2.Themes.Blue\"\r\n },\r\n requiresReload: true\r\n });\r\n\r\n game.settings.register('mgt2', 'usePronouns', {\r\n name: \"MGT2.Settings.usePronouns.name\",\r\n hint: \"MGT2.Settings.usePronouns.hint\",\r\n default: false,\r\n scope: 'world',\r\n type: Boolean,\r\n config: true,\r\n requiresReload: false\r\n });\r\n\r\n game.settings.register('mgt2', 'useGender', {\r\n name: \"MGT2.Settings.useGender.name\",\r\n hint: \"MGT2.Settings.useGender.hint\",\r\n default: false,\r\n scope: 'world',\r\n type: Boolean,\r\n config: true,\r\n requiresReload: false\r\n });\r\n\r\n game.settings.register('mgt2', 'showLife', {\r\n name: \"MGT2.Settings.showLife.name\",\r\n hint: \"MGT2.Settings.showLife.hint\",\r\n default: false,\r\n scope: 'world',\r\n type: Boolean,\r\n config: true,\r\n requiresReload: false\r\n });\r\n\r\n // game.settings.register('mgt2', 'useWeightMetric', {\r\n // name: \"MGT2.Settings.useWeightMetric.name\",\r\n // hint: \"MGT2.Settings.useWeightMetric.hint\",\r\n // default: true,\r\n // scope: 'world',\r\n // type: Boolean,\r\n // config: true,\r\n // requiresReload: true\r\n // });\r\n\r\n // game.settings.register('mgt2', 'useDistanceMetric', {\r\n // name: \"MGT2.Settings.useDistanceMetric.name\",\r\n // hint: \"MGT2.Settings.useDistanceMetric.hint\",\r\n // default: true,\r\n // scope: 'world',\r\n // type: Boolean,\r\n // config: true,\r\n // requiresReload: true\r\n // });\r\n\r\n // game.settings.register('mgt2', 'showTrash', {\r\n // name: \"Show Trash tab to Player\",\r\n // hint: \"Player can see the Trash tab and recover item\",\r\n // default: false,\r\n // scope: 'world',\r\n // type: Boolean,\r\n // config: true,\r\n // requiresReload: false\r\n // });\r\n\r\n /*game.settings.register('mgt2', 'containerDropIn', {\r\n name: \"Test\",\r\n hint: \"Mon hint\",\r\n default: true,\r\n scope: 'client',\r\n type: Boolean,\r\n config: true\r\n });*/\r\n};\r\n","import {\n CharacterData,\n ItemData,\n EquipmentData,\n DiseaseData,\n CareerData,\n TalentData,\n ContactData,\n ArmorData,\n ComputerData,\n WeaponData,\n ItemContainerData,\n SpeciesData\n} from \"./datamodels.js\";\n\nimport { MGT2 } from \"./config.js\";\nimport { TravellerActor, MGT2Combatant } from \"./actors/actor.js\";\nimport { TravellerItem } from \"./item.js\";\nimport { TravellerItemSheet } from \"./item-sheet.js\";\nimport { TravellerActorSheet } from \"./actors/character-sheet.js\";\nimport { preloadHandlebarsTemplates } from \"./templates.js\";\n//import { MGT2Helper } from \"./helper.js\";\nimport {ChatHelper} from \"./chatHelper.js\";\n//import { preloadHandlebarsTemplates } from \"./templates.js\";\n//import { createWorldbuildingMacro } from \"./macro.js\";\n//import { SimpleToken, SimpleTokenDocument } from \"./token.js\";\n// https://foundryvtt.wiki/en/development/guides/SD-tutorial/SD03-systemjson\n// https://gitlab.com/asacolips-projects/foundry-mods/foundryvtt-system-tutorial\n// https://travellertoolsdemo.azurewebsites.net/contacts\n// https://foundryvtt.wiki/en/development/guides/SD-tutorial/SD08-Creating-HTML-templates-for-your-actor-sheets\n// https://foundryvtt.com/article/system-data-models/\n// https://handlebarsjs.com/guide/#what-is-handlebars\n// https://gitlab.com/custom-system-builder/custom-system-builder/-/blob/develop/template.json?ref_type=heads\n\n// https://foundryvtt.com/article/system-data-models/\n/* -------------------------------------------- */\n/* Foundry VTT Initialization */\n/* -------------------------------------------- */\nimport { registerSettings } from \"./settings.js\";\n\nfunction registerHandlebarsHelpers() {\n Handlebars.registerHelper('showDM', function (dm) {\n if (dm === 0) return \"0\";\n if (dm > 0) return `+${dm}`;\n if (dm < 0) return `${dm}`;\n return \"\";\n });\n}\n\nHooks.once(\"init\", async function () {\n CONFIG.MGT2 = MGT2;\n CONFIG.Combat.initiative = {\n formula: \"2d6 + @initiative\",\n decimals: 2\n };\n\n CONFIG.Actor.trackableAttributes = {\n character: {\n bar: [\"life\",\n \"characteristics.strength\",\n \"characteristics.dexterity\",\n \"characteristics.endurance\",\n \"characteristics.intellect\",\n \"characteristics.education\",\n \"characteristics.social\",\n \"characteristics.morale\",\n \"characteristics.luck\",\n \"characteristics.sanity\",\n \"characteristics.charm\",\n \"characteristics.psionic\",\n \"characteristics.other\"\n ],\n value: [\"life.value\",\n \"health.radiations\",\n \"characteristics.strength.value\",\n \"characteristics.dexterity.value\",\n \"characteristics.endurance.value\",\n \"characteristics.intellect.value\",\n \"characteristics.education.value\",\n \"characteristics.social.value\",\n \"characteristics.morale.value\",\n \"characteristics.luck.value\",\n \"characteristics.sanity.value\",\n \"characteristics.charm.value\",\n \"characteristics.psionic.value\",\n \"characteristics.other.value\"]\n }\n };\n\n game.mgt2 = {\n TravellerActor,\n TravellerItem\n };\n\n registerHandlebarsHelpers();\n registerSettings();\n\n CONFIG.Combatant.documentClass = MGT2Combatant;\n CONFIG.Actor.documentClass = TravellerActor;\n CONFIG.Item.documentClass = TravellerItem;\n //CONFIG.Token.documentClass = SimpleTokenDocument;\n //CONFIG.Token.objectClass = SimpleToken;\n\n Actors.unregisterSheet(\"core\", ActorSheet);\n Actors.registerSheet(\"mgt2\", TravellerActorSheet, { types: [\"character\"], makeDefault: true, label: \"Traveller Sheet\" });\n\n Items.unregisterSheet(\"core\", ItemSheet);\n Items.registerSheet(\"mgt2\", TravellerItemSheet, { makeDefault: true });\n\n Object.assign(CONFIG.Actor.dataModels, {\n \"character\": CharacterData\n });\n\n Object.assign(CONFIG.Item.dataModels, {\n \"item\": ItemData,\n \"equipment\": EquipmentData,\n \"disease\": DiseaseData,\n \"career\": CareerData,\n \"talent\": TalentData,\n \"contact\": ContactData,\n \"weapon\": WeaponData,\n \"computer\": ComputerData,\n \"armor\": ArmorData,\n \"container\": ItemContainerData,\n \"species\": SpeciesData\n });\n\n\n Hooks.on(\"renderChatMessage\", (message, html, messageData) => {\n //console.log(\"renderChatMessage\");\n ChatHelper.setupCardListeners(message, html, messageData);\n });\n\n // Preload template partials\n await preloadHandlebarsTemplates();\n});\n\n// function addChatMessageContextOptions(html, options) {\n// let canApply = li => {\n// const message = game.messages.get(li.data(\"messageId\"));\n// return message?.isRoll && message?.isContentVisible && canvas.tokens?.controlled.length;\n// };\n\n// options.push(\n// {\n// name: game.i18n.localize(\"DND5E.ChatContextDamage\"),\n// icon: '',\n// condition: canApply,\n// callback: li => applyChatCardDamage(li)\n// },\n// {\n// name: game.i18n.localize(\"DND5E.ChatContextHealing\"),\n// icon: '',\n// condition: canApply,\n// callback: li => applyChatCardDamage(li)\n// }\n// );\n// return options;\n// }\n\n\n\n//Hooks.on(\"getChatLogEntryContext\", addChatMessageContextOptions);\n\n\n\n\n\nexport { MGT2 };"],"names":["fields","converted","item","html"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"mgt2.bundle.js","sources":["src/module/models/items/base-item.mjs","src/module/models/character.mjs","src/module/models/vehicule.mjs","src/module/models/items/item.mjs","src/module/models/items/equipment.mjs","src/module/models/items/disease.mjs","src/module/models/items/career.mjs","src/module/models/items/talent.mjs","src/module/models/items/contact.mjs","src/module/models/items/weapon.mjs","src/module/models/items/armor.mjs","src/module/models/items/computer.mjs","src/module/models/items/container.mjs","src/module/models/items/species.mjs","src/module/config.js","src/module/actors/character.js","src/module/actors/actor.js","src/module/item.js","src/module/applications/sheets/base-actor-sheet.mjs","src/module/helper.js","src/module/roll-prompt.js","src/module/actors/character-prompts.js","src/module/applications/sheets/character-sheet.mjs","src/module/applications/sheets/vehicule-sheet.mjs","src/module/applications/sheets/item-sheet.mjs","src/module/templates.js","src/module/chatHelper.js","src/module/settings.js","src/module/core.js"],"sourcesContent":["const fields = foundry.data.fields;\n\nexport function createCharacteristicField(show = true, showMax = false) {\n return new fields.SchemaField({\n value: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\n max: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true }),\n dm: new fields.NumberField({ required: false, initial: 0, integer: true }),\n show: new fields.BooleanField({ required: false, initial: show }),\n showMax: new fields.BooleanField({ required: false, initial: showMax })\n });\n}\n\nexport class ItemBaseData extends foundry.abstract.TypeDataModel {\n static defineSchema() {\n return {\n description: new fields.StringField({ required: false, blank: true, trim: true, nullable: true }),\n subType: new fields.StringField({ required: false, blank: false, nullable: true })\n };\n }\n}\n\nexport class PhysicalItemData extends ItemBaseData {\n static defineSchema() {\n const schema = super.defineSchema();\n schema.quantity = new fields.NumberField({ required: true, initial: 1, min: 0, integer: true });\n schema.weight = new fields.NumberField({ required: true, initial: 0, min: 0, integer: false });\n schema.weightless = new fields.BooleanField({ required: false, initial: false });\n schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });\n schema.tl = new fields.StringField({ required: true, blank: false, initial: \"TL12\" });\n schema.container = new fields.SchemaField({\n id: new fields.StringField({ required: false, blank: true })\n });\n schema.roll = new fields.SchemaField({\n characteristic: new fields.StringField({ required: false, blank: true, trim: true }),\n skill: new fields.StringField({ required: false, blank: true, trim: true }),\n difficulty: new fields.StringField({ required: false, blank: true, trim: true })\n });\n schema.trash = new fields.BooleanField({ required: false, initial: false });\n return schema;\n }\n}\n","import { createCharacteristicField } from \"./items/base-item.mjs\";\nconst fields = foundry.data.fields;\n\nexport default class CharacterData extends foundry.abstract.TypeDataModel {\n\n static defineSchema() {\n return {\n name: new fields.StringField({ required: false, blank: false, trim: true }),\n life: new fields.SchemaField({\n value: new fields.NumberField({ required: false, initial: 0, integer: true }),\n max: new fields.NumberField({ required: true, initial: 0, integer: true })\n }),\n personal: new fields.SchemaField({\n title: new fields.StringField({ required: false, blank: true, trim: true }),\n species: new fields.StringField({ required: false, blank: true, trim: true }),\n speciesText: new fields.SchemaField({\n description: new fields.StringField({ required: false, blank: true, trim: true, nullable: true }),\n descriptionLong: new fields.HTMLField({ required: false, blank: true, trim: true })\n }),\n age: new fields.StringField({ required: false, blank: true, trim: true }),\n gender: new fields.StringField({ required: false, blank: true, trim: true }),\n pronouns: new fields.StringField({ required: false, blank: true, trim: true }),\n homeworld: new fields.StringField({ required: false, blank: true, trim: true }),\n ucp: new fields.StringField({ required: false, blank: true, trim: true, initial: \"\" }),\n traits: new fields.ArrayField(\n new fields.SchemaField({\n name: new fields.StringField({ required: true, blank: true, trim: true }),\n description: new fields.StringField({ required: false, blank: true, trim: true })\n })\n )\n }),\n biography: new fields.HTMLField({ required: false, blank: true, trim: true }),\n\n characteristics: new fields.SchemaField({\n strength: createCharacteristicField(true, true),\n dexterity: createCharacteristicField(true, true),\n endurance: createCharacteristicField(true, true),\n intellect: createCharacteristicField(true, false),\n education: createCharacteristicField(true, false),\n social: createCharacteristicField(true, false),\n morale: createCharacteristicField(true, false),\n luck: createCharacteristicField(true, false),\n sanity: createCharacteristicField(true, false),\n charm: createCharacteristicField(true, false),\n psionic: createCharacteristicField(true, false),\n other: createCharacteristicField(true, false)\n }),\n\n health: new fields.SchemaField({\n radiations: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true })\n }),\n study: new fields.SchemaField({\n skill: new fields.StringField({ required: false, blank: true, trim: true, initial: \"\" }),\n total: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true }),\n completed: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true })\n }),\n finance: new fields.SchemaField({\n pension: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\n credits: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\n cashOnHand: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\n debt: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\n livingCost: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\n monthlyShipPayments: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\n notes: new fields.StringField({ required: false, blank: true, trim: true, initial: \"\" })\n }),\n containerView: new fields.StringField({ required: false, blank: true, trim: true, initial: \"\" }),\n containerDropIn: new fields.StringField({ required: false, blank: true, trim: true, initial: \"\" }),\n notes: new fields.HTMLField({ required: false, blank: true, trim: true }),\n\n inventory: new fields.SchemaField({\n armor: new fields.NumberField({ required: true, initial: 0, integer: true }),\n weight: new fields.NumberField({ required: true, initial: 0, min: 0, integer: false }),\n encumbrance: new fields.SchemaField({\n normal: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),\n heavy: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true })\n })\n }),\n states: new fields.SchemaField({\n encumbrance: new fields.BooleanField({ required: false, initial: false }),\n fatigue: new fields.BooleanField({ required: false, initial: false }),\n unconscious: new fields.BooleanField({ required: false, initial: false }),\n surgeryRequired: new fields.BooleanField({ required: false, initial: false })\n }),\n\n config: new fields.SchemaField({\n psionic: new fields.BooleanField({ required: false, initial: true }),\n initiative: new fields.StringField({ required: false, blank: true, initial: \"dexterity\" }),\n damages: new fields.SchemaField({\n rank1: new fields.StringField({ required: false, blank: true, initial: \"strength\" }),\n rank2: new fields.StringField({ required: false, blank: true, initial: \"dexterity\" }),\n rank3: new fields.StringField({ required: false, blank: true, initial: \"endurance\" })\n })\n })\n };\n }\n}\n","const fields = foundry.data.fields;\n\nexport default class VehiculeData extends foundry.abstract.TypeDataModel {\n\n static defineSchema() {\n return {\n name: new fields.StringField({ required: false, blank: false, trim: true }),\n skillId: new fields.StringField({ required: false, initial: \"\", blank: true, trim: true }),\n speed: new fields.SchemaField({\n cruise: new fields.StringField({ required: false, initial: \"Slow\", blank: true }),\n maximum: new fields.StringField({ required: false, initial: \"Medium\", blank: true })\n }),\n agility: new fields.NumberField({ required: false, min: 0, integer: true }),\n crew: new fields.NumberField({ required: false, min: 0, integer: true }),\n passengers: new fields.NumberField({ required: false, min: 0, integer: true }),\n cargo: new fields.NumberField({ required: false, min: 0, integer: false }),\n life: new fields.SchemaField({\n value: new fields.NumberField({ required: true, initial: 0, integer: true }),\n max: new fields.NumberField({ required: true, initial: 0, integer: true })\n }),\n shipping: new fields.NumberField({ required: false, min: 0, integer: true }),\n cost: new fields.NumberField({ required: false, min: 0, integer: true }),\n armor: new fields.SchemaField({\n front: new fields.NumberField({ required: true, initial: 0, integer: true }),\n rear: new fields.NumberField({ required: true, initial: 0, integer: true }),\n sides: new fields.NumberField({ required: true, initial: 0, integer: true })\n }),\n skills: new fields.SchemaField({\n autopilot: new fields.NumberField({ required: true, initial: 0, integer: true })\n })\n };\n }\n}\n","import { PhysicalItemData } from \"./base-item.mjs\";\nconst fields = foundry.data.fields;\n\nexport default class ItemData extends PhysicalItemData {\n static defineSchema() {\n const schema = super.defineSchema();\n schema.subType.initial = \"loot\";\n schema.software = new fields.SchemaField({\n bandwidth: new fields.NumberField({ required: false, initial: 0, min: 0, max: 10, integer: true }),\n effect: new fields.StringField({ required: false, blank: true, trim: true, initial: \"\" }),\n computerId: new fields.StringField({ required: false, blank: true, initial: \"\" })\n });\n return schema;\n }\n}\n","import { PhysicalItemData } from \"./base-item.mjs\";\nconst fields = foundry.data.fields;\n\nexport default class EquipmentData extends PhysicalItemData {\n static defineSchema() {\n const schema = super.defineSchema();\n schema.equipped = new fields.BooleanField({ required: false, initial: false });\n schema.augment = new fields.SchemaField({\n improvement: new fields.StringField({ required: false, blank: true, trim: true })\n });\n schema.subType.initial = \"equipment\"; // augment, clothing, trinket, toolkit, equipment\n return schema;\n }\n}\n","import { ItemBaseData } from \"./base-item.mjs\";\nconst fields = foundry.data.fields;\n\nexport default class DiseaseData extends ItemBaseData {\n static defineSchema() {\n const schema = super.defineSchema();\n schema.subType.initial = \"disease\"; // disease, poison\n schema.difficulty = new fields.StringField({ required: true, initial: \"Average\" });\n schema.damage = new fields.StringField({ required: false, blank: true });\n schema.interval = new fields.StringField({ required: false, blank: true });\n return schema;\n }\n}\n","import { ItemBaseData } from \"./base-item.mjs\";\nconst fields = foundry.data.fields;\n\nexport default class CareerData extends ItemBaseData {\n static defineSchema() {\n const schema = super.defineSchema();\n schema.difficulty = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });\n schema.damage = new fields.StringField({ required: false, blank: true });\n schema.interval = new fields.StringField({ required: false, blank: true });\n schema.assignment = new fields.StringField({ required: false, blank: true });\n schema.terms = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\n schema.rank = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\n schema.events = new fields.ArrayField(\n new fields.SchemaField({\n age: new fields.NumberField({ required: false, integer: true }),\n description: new fields.StringField({ required: false, blank: true, trim: true })\n })\n );\n return schema;\n }\n}\n","import { ItemBaseData } from \"./base-item.mjs\";\nconst fields = foundry.data.fields;\n\nexport default class TalentData extends ItemBaseData {\n static defineSchema() {\n const schema = super.defineSchema();\n schema.subType.initial = \"skill\";\n schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });\n schema.level = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });\n schema.skill = new fields.SchemaField({\n speciality: new fields.StringField({ required: false, blank: true, trim: true }),\n reduceEncumbrance: new fields.BooleanField({ required: false, initial: false })\n });\n schema.psionic = new fields.SchemaField({\n reach: new fields.StringField({ required: false, blank: true, trim: true }),\n cost: new fields.NumberField({ required: false, initial: 1, min: 0, integer: true }),\n duration: new fields.StringField({ required: false, blank: true, trim: true }),\n durationUnit: new fields.StringField({ required: false })\n });\n schema.roll = new fields.SchemaField({\n characteristic: new fields.StringField({ required: false, blank: true, trim: true }),\n skill: new fields.StringField({ required: false, blank: true, trim: true }),\n difficulty: new fields.StringField({ required: false, blank: true, trim: true })\n });\n return schema;\n }\n}\n","import { ItemBaseData } from \"./base-item.mjs\";\nconst fields = foundry.data.fields;\n\nexport default class ContactData extends ItemBaseData {\n static defineSchema() {\n const schema = super.defineSchema();\n schema.subType.initial = \"skill\";\n schema.cost = new fields.NumberField({ required: true, initial: 1, min: 0, integer: true });\n schema.skill = new fields.SchemaField({\n speciality: new fields.StringField({ required: false, blank: true, trim: true }),\n characteristic: new fields.StringField({ required: false, blank: true, trim: true })\n });\n schema.status = new fields.StringField({ required: false, blank: true, trim: true, initial: \"Alive\" });\n schema.attitude = new fields.StringField({ required: false, blank: true, trim: true, initial: \"Unknow\" });\n schema.relation = new fields.StringField({ required: false, blank: true, trim: true, initial: \"Contact\" });\n schema.title = new fields.StringField({ required: false, blank: true, trim: true });\n schema.nickname = new fields.StringField({ required: false, blank: true, trim: true });\n schema.species = new fields.StringField({ required: false, blank: true, trim: true });\n schema.gender = new fields.StringField({ required: false, blank: true, trim: true });\n schema.pronouns = new fields.StringField({ required: false, blank: true, trim: true });\n schema.homeworld = new fields.StringField({ required: false, blank: true, trim: true });\n schema.location = new fields.StringField({ required: false, blank: true, trim: true });\n schema.occupation = new fields.StringField({ required: false, blank: true, trim: true });\n schema.notes = new fields.HTMLField({ required: false, blank: true, trim: true });\n return schema;\n }\n}\n","import { PhysicalItemData } from \"./base-item.mjs\";\nconst fields = foundry.data.fields;\n\nexport default class WeaponData extends PhysicalItemData {\n static defineSchema() {\n const schema = super.defineSchema();\n schema.equipped = new fields.BooleanField({ required: false, initial: false });\n schema.range = new fields.SchemaField({\n isMelee: new fields.BooleanField({ required: false, initial: false }),\n value: new fields.NumberField({ required: false, integer: true, nullable: true }),\n unit: new fields.StringField({ required: false, blank: true, nullable: true })\n });\n schema.damage = new fields.StringField({ required: false, blank: true, trim: true });\n schema.magazine = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\n schema.magazineCost = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\n schema.traits = new fields.ArrayField(\n new fields.SchemaField({\n name: new fields.StringField({ required: true, blank: true, trim: true }),\n description: new fields.StringField({ required: false, blank: true, trim: true })\n })\n );\n schema.options = new fields.ArrayField(\n new fields.SchemaField({\n name: new fields.StringField({ required: true, blank: true, trim: true }),\n description: new fields.StringField({ required: false, blank: true, trim: true })\n })\n );\n return schema;\n }\n}\n","import { PhysicalItemData } from \"./base-item.mjs\";\nconst fields = foundry.data.fields;\n\nexport default class ArmorData extends PhysicalItemData {\n static defineSchema() {\n const schema = super.defineSchema();\n schema.equipped = new fields.BooleanField({ required: false, initial: false });\n schema.radiations = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\n schema.protection = new fields.StringField({ required: false, blank: false, trim: true });\n // A Traveller suffers DM-1 to all checks per missing skill level in the required skill.\n schema.requireSkill = new fields.StringField({ required: false, blank: false });\n schema.requireSkillLevel = new fields.NumberField({ required: false, min: 0, integer: true });\n // Powered armour supports its own weight and is effectively weightless for encumbrance.\n schema.powered = new fields.BooleanField({ required: false, initial: false });\n schema.options = new fields.ArrayField(\n new fields.SchemaField({\n name: new fields.StringField({ required: true, blank: true, trim: true }),\n description: new fields.StringField({ required: false, blank: true, trim: true })\n })\n );\n return schema;\n }\n}\n","import { PhysicalItemData } from \"./base-item.mjs\";\nconst fields = foundry.data.fields;\n\nexport default class ComputerData extends PhysicalItemData {\n static defineSchema() {\n const schema = super.defineSchema();\n schema.processing = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\n schema.processingUsed = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });\n schema.overload = new fields.BooleanField({ required: false, initial: false });\n schema.options = new fields.ArrayField(\n new fields.SchemaField({\n name: new fields.StringField({ required: true, blank: true, trim: true }),\n description: new fields.StringField({ required: false, blank: true, trim: true })\n })\n );\n return schema;\n }\n}\n","import { ItemBaseData } from \"./base-item.mjs\";\nconst fields = foundry.data.fields;\n\nexport default class ItemContainerData extends ItemBaseData {\n static defineSchema() {\n const schema = super.defineSchema();\n schema.onHand = new fields.BooleanField({ required: false, initial: false });\n schema.location = new fields.StringField({ required: false, blank: true, trim: true });\n schema.count = new fields.NumberField({ required: false, initial: 0, integer: true });\n schema.weight = new fields.NumberField({ required: false, initial: 0, integer: false });\n schema.weightless = new fields.BooleanField({ required: false, initial: false });\n schema.locked = new fields.BooleanField({ required: false, initial: false }); // GM only\n schema.lockedDescription = new fields.StringField({ required: false, blank: true, trim: true, nullable: true });\n return schema;\n }\n}\n","const fields = foundry.data.fields;\n\nexport default class SpeciesData extends foundry.abstract.TypeDataModel {\n static defineSchema() {\n return {\n description: new fields.StringField({ required: false, blank: true, trim: true, nullable: true }),\n descriptionLong: new fields.HTMLField({ required: false, blank: true, trim: true }),\n traits: new fields.ArrayField(\n new fields.SchemaField({\n name: new fields.StringField({ required: true, blank: true, trim: true }),\n description: new fields.StringField({ required: false, blank: true, trim: true })\n })\n ),\n modifiers: new fields.ArrayField(\n new fields.SchemaField({\n characteristic: new fields.StringField({ required: false, blank: true, trim: true }),\n value: new fields.NumberField({ required: false, integer: true, nullable: true })\n })\n )\n };\n }\n}\n","export const MGT2 = {};\n\nMGT2.MetricRange = Object.freeze({\n meter: \"MGT2.MetricRange.meter\",\n kilometer: \"MGT2.MetricRange.kilometer\"\n});\n\nMGT2.MetricWeight = Object.freeze({\n kilogram: \"MGT2.MetricWeight.kilogram\",\n ton: \"MGT2.MetricWeight.ton\"\n});\n\nMGT2.Difficulty = Object.freeze({\n NA: \"MGT2.Difficulty.NA\",\n Simple: \"MGT2.Difficulty.Simple\",\n Easy: \"MGT2.Difficulty.Easy\",\n Routine: \"MGT2.Difficulty.Routine\",\n Average: \"MGT2.Difficulty.Average\",\n Difficult: \"MGT2.Difficulty.Difficult\",\n VeryDifficult: \"MGT2.Difficulty.VeryDifficult\",\n Formidable: \"MGT2.Difficulty.Formidable\",\n Impossible: \"MGT2.Difficulty.Impossible\"\n});\n\nMGT2.ItemSubType = Object.freeze({\n loot: \"MGT2.ItemSubType.loot\",\n software: \"MGT2.ItemSubType.software\"\n});\n\nMGT2.EquipmentSubType = Object.freeze({\n augment: \"MGT2.EquipmentSubType.augment\",\n clothing: \"MGT2.EquipmentSubType.clothing\",\n equipment: \"MGT2.EquipmentSubType.equipment\",\n trinket: \"MGT2.EquipmentSubType.trinket\",\n toolkit: \"MGT2.EquipmentSubType.toolkit\"\n});\n\nMGT2.TalentSubType = Object.freeze({\n skill: \"MGT2.TalentSubType.skill\",\n psionic: \"MGT2.TalentSubType.psionic\"\n});\n\nMGT2.DiseaseSubType = Object.freeze({\n disease: \"MGT2.DiseaseSubType.disease\",\n poison: \"MGT2.DiseaseSubType.poison\",\n wound: \"MGT2.DiseaseSubType.wound\"\n});\n\nMGT2.PsionicReach = Object.freeze({\n NA: \"MGT2.PsionicReach.NA\",\n Personal: \"MGT2.PsionicReach.Personal\",\n Close: \"MGT2.PsionicReach.Close\",\n Short: \"MGT2.PsionicReach.Short\",\n Medium: \"MGT2.PsionicReach.Medium\",\n Long: \"MGT2.PsionicReach.Long\",\n VeryLong: \"MGT2.PsionicReach.VeryLong\",\n Distant: \"MGT2.PsionicReach.Distant\",\n VeryDistant: \"MGT2.PsionicReach.VeryDistant\",\n Continental: \"MGT2.PsionicReach.Continental\",\n Planetary: \"MGT2.PsionicReach.Planetary\"\n});\n\nMGT2.ContactRelations = Object.freeze({\n Allie: \"MGT2.Contact.Relation.Allie\",\n Contact: \"MGT2.Contact.Relation.Contact\",\n Rival: \"MGT2.Contact.Relation.Rival\",\n Enemy: \"MGT2.Contact.Relation.Enemy\"\n});\n\nMGT2.ContactStatus = Object.freeze({\n Alive: \"MGT2.Contact.Status.Alive\",\n Unknow: \"MGT2.Contact.Status.Unknow\",\n Dead: \"MGT2.Contact.Status.Dead\"\n});\n\nMGT2.Attitudes = Object.freeze({\n Unknow: \"MGT2.Contact.Attitude.Unknow\",\n Hostile: \"MGT2.Contact.Attitude.Hostile\",\n Unfriendly: \"MGT2.Contact.Attitude.Unfriendly\",\n Indifferent: \"MGT2.Contact.Attitude.Indifferent\",\n Friendly: \"MGT2.Contact.Attitude.Friendly\",\n Helpful: \"MGT2.Contact.Attitude.Helpful\",\n Complicated: \"MGT2.Contact.Attitude.Complicated\"\n});\n\nMGT2.Characteristics = Object.freeze({\n strength: \"MGT2.Characteristics.strength.name\",\n dexterity: \"MGT2.Characteristics.dexterity.name\",\n endurance: \"MGT2.Characteristics.endurance.name\",\n intellect: \"MGT2.Characteristics.intellect.name\",\n education: \"MGT2.Characteristics.education.name\",\n social: \"MGT2.Characteristics.social.name\",\n morale: \"MGT2.Characteristics.morale.name\",\n luck: \"MGT2.Characteristics.luck.name\",\n sanity: \"MGT2.Characteristics.sanity.name\",\n charm: \"MGT2.Characteristics.charm.name\",\n psionic: \"MGT2.Characteristics.psionic.name\",\n other: \"MGT2.Characteristics.other.name\"\n});\n\nMGT2.InitiativeCharacteristics = Object.freeze({\n dexterity: \"MGT2.Characteristics.dexterity.name\",\n intellect: \"MGT2.Characteristics.intellect.name\"\n});\n\nMGT2.DamageCharacteristics = Object.freeze({\n strength: \"MGT2.Characteristics.strength.name\",\n dexterity: \"MGT2.Characteristics.dexterity.name\",\n endurance: \"MGT2.Characteristics.endurance.name\"\n});\n\nMGT2.TL = Object.freeze({\n NA: \"MGT2.TL.NA\",\n Unknow: \"MGT2.TL.Unknow\",\n NotIdentified: \"MGT2.TL.NotIdentified\",\n TL00: \"MGT2.TL.L00\",\n TL01: \"MGT2.TL.L01\",\n TL02: \"MGT2.TL.L02\",\n TL03: \"MGT2.TL.L03\",\n TL04: \"MGT2.TL.L04\",\n TL05: \"MGT2.TL.L05\",\n TL06: \"MGT2.TL.L06\",\n TL07: \"MGT2.TL.L07\",\n TL08: \"MGT2.TL.L08\",\n TL09: \"MGT2.TL.L09\",\n TL10: \"MGT2.TL.L10\",\n TL11: \"MGT2.TL.L11\",\n TL12: \"MGT2.TL.L12\",\n TL13: \"MGT2.TL.L13\",\n TL14: \"MGT2.TL.L14\",\n TL15: \"MGT2.TL.L15\"\n});\n\nMGT2.Timeframes = Object.freeze({\n Normal: \"MGT2.Timeframes.Normal\",\n Slower: \"MGT2.Timeframes.Slower\",\n Faster: \"MGT2.Timeframes.Faster\"\n});\n\nMGT2.SpeedBands = Object.freeze({\n Stoppped: \"MGT2.SpeedBands.Stoppped\",\n Idle: \"MGT2.SpeedBands.Idle\",\n VerySlow: \"MGT2.SpeedBands.VerySlow\",\n Slow: \"MGT2.SpeedBands.Slow\",\n Medium: \"MGT2.SpeedBands.Medium\",\n High: \"MGT2.SpeedBands.High.\",\n Fast: \"MGT2.SpeedBands.Fast\",\n VeryFast: \"MGT2.SpeedBands.VeryFast\",\n Subsonic: \"MGT2.SpeedBands.Subsonic\",\n Hypersonic: \"MGT2.SpeedBands.Hypersonic\"\n});\n\nMGT2.Durations = Object.freeze({\n Seconds: \"MGT2.Durations.Seconds\",\n Minutes: \"MGT2.Durations.Minutes\",\n Heures: \"MGT2.Durations.Heures\"\n});","export class ActorCharacter {\n static preCreate($this, data, options, user) {\n $this.updateSource({ prototypeToken: { actorLink: true } }) // QoL\n }\n\n static prepareData(actorData) {\n actorData.initiative = this.getInitiative(actorData);\n }\n\n static getInitiative($this) {\n let c = $this.system.config.initiative;\n return $this.system.characteristics[c].dm;\n }\n\n static async onDeleteDescendantDocuments($this, parent, collection, documents, ids, options, userId) {\n const toDeleteIds = [];\n const itemToUpdates = [];\n\n for (let d of documents) {\n if (d.type === \"container\") {\n // Delete content\n for (let item of $this.items) {\n if (item.system.hasOwnProperty(\"container\") && item.system.container.id === d._id)\n toDeleteIds.push(item._id);\n }\n } else if (d.type === \"computer\") {\n // Eject software\n for (let item of $this.items) {\n if (item.system.hasOwnProperty(\"software\") && item.system.computerId === d._id) {\n let clone = foundry.utils.deepClone(item);\n clone.system.software.computerId = \"\";\n itemToUpdates.push(clone);\n }\n }\n }\n }\n\n if (toDeleteIds.length > 0)\n await $this.deleteEmbeddedDocuments(\"Item\", toDeleteIds);\n\n if (itemToUpdates.length > 0)\n await $this.updateEmbeddedDocuments('Item', itemToUpdates);\n\n await this.recalculateWeight($this);\n }\n\n static async onUpdateDescendantDocuments($this, parent, collection, documents, changes, options, userId) {\n await this.calculEncumbranceAndWeight($this, parent, collection, documents, changes, options, userId);\n await this.calculComputers($this, parent, collection, documents, changes, options, userId);\n }\n\n static async calculComputers($this, parent, collection, documents, changes, options, userId) {\n let change;\n let i = 0;\n\n let recalculProcessing = false;\n for (let d of documents) {\n if (changes[i].hasOwnProperty(\"system\")) {\n change = changes[i];\n if (d.type === \"item\" && d.system.subType === \"software\") {\n if (change.system.software.hasOwnProperty(\"bandwidth\") || change.system.software.hasOwnProperty(\"computerId\")) {\n recalculProcessing = true;\n break;\n }\n }\n }\n }\n\n if (recalculProcessing) {\n let updatedComputers = [];\n let computerChanges = {};\n let computers = [];\n\n for (let item of $this.items) {\n if (item.system.trash === true) continue;\n if (item.type === \"computer\") {\n computers.push(item);\n computerChanges[item._id] = { processingUsed: 0 };\n }\n }\n\n for (let item of $this.items) {\n if (item.type !== \"item\" && item.system.subType !== \"software\") continue;\n\n if (item.system.software.hasOwnProperty(\"computerId\") && item.system.software.computerId !== \"\") {\n computerChanges[item.system.software.computerId].processingUsed += item.system.software.bandwidth;\n }\n }\n\n for (let computer of computers) {\n let newProcessingUsed = computerChanges[computer._id].processingUsed;\n if (computer.system.processingUsed !== newProcessingUsed) {\n const cloneComputer = foundry.utils.deepClone($this.getEmbeddedDocument(\"Item\", computer._id));\n cloneComputer.system.processingUsed = newProcessingUsed;\n cloneComputer.system.overload = cloneComputer.system.processingUsed > cloneComputer.system.processing;\n updatedComputers.push(cloneComputer);\n }\n }\n\n if (updatedComputers.length > 0) {\n await $this.updateEmbeddedDocuments('Item', updatedComputers);\n }\n }\n }\n\n static async calculEncumbranceAndWeight($this, parent, collection, documents, changes, options, userId) {\n let recalculEncumbrance = false;\n let recalculWeight = false;\n\n let change;\n let i = 0;\n for (let d of documents) {\n if (changes[i].hasOwnProperty(\"system\")) {\n change = changes[i];\n\n if (d.type === \"armor\" ||\n d.type === \"computer\" ||\n d.type === \"gear\" ||\n d.type === \"item\" ||\n d.type === \"weapon\") {\n if (change.system.hasOwnProperty(\"quantity\") ||\n change.system.hasOwnProperty(\"weight\") ||\n change.system.hasOwnProperty(\"weightless\") ||\n change.system.hasOwnProperty(\"container\") ||\n change.system.hasOwnProperty(\"equipped\") ||\n d.type === \"armor\") {\n recalculWeight = true;\n }\n } else if (d.type === \"talent\" && d.system.subType === \"skill\") {\n if (change.system.level || (change.system?.hasOwnProperty(\"skill\") && change.system?.skill.hasOwnProperty(\"reduceEncumbrance\"))) {\n recalculEncumbrance = true;\n }\n } else if (d.type === \"container\" && (change.system.hasOwnProperty(\"onHand\") || change.system.hasOwnProperty(\"weightless\"))) {\n recalculWeight = true;\n }\n }\n i++;\n }\n\n if (recalculEncumbrance || recalculWeight) {\n const cloneActor = foundry.utils.deepClone($this);\n\n await this.recalculateArmor($this, cloneActor);\n\n if (recalculEncumbrance) {\n //console.log(\"recalculEncumbrance\");\n const str = $this.system.characteristics.strength.value;\n const end = $this.system.characteristics.endurance.value;\n let sumSkill = 0;\n $this.items.filter(x => x.type === \"talent\" && x.system.subType === \"skill\" && x.system.skill.reduceEncumbrance === true).forEach(x => sumSkill += x.system.level);\n let normal = str + end + sumSkill;\n let heavy = normal * 2;\n\n cloneActor.system.states.encumbrance = $this.system.inventory.weight > normal;\n cloneActor.system.encumbrance.normal = normal;\n cloneActor.system.encumbrance.heavy = heavy;\n }\n\n if (recalculWeight)\n await this.recalculateWeight($this, cloneActor);\n }\n }\n\n static async recalculateArmor($this, cloneActor) {\n if (cloneActor === null || cloneActor === undefined)\n cloneActor = foundry.utils.deepClone($this);\n\n let armor = 0;\n for (let item of $this.items) {\n if (item.type === \"armor\") {\n if (item.system.equipped === true && !isNaN(item.system.protection)) {\n armor += (+item.system.protection || 0);\n }\n }\n }\n\n cloneActor.system.inventory.armor = armor;\n }\n\n static async recalculateWeight($this, cloneActor) {\n\n if (cloneActor === null || cloneActor === undefined)\n cloneActor = foundry.utils.deepClone($this);\n\n let updatedContainers = [];\n let containerChanges = {};\n\n //console.log(\"recalculWeight\");\n let containers = [];\n\n // List all containers\n for (let item of $this.items) {\n if (item.system.trash === true) continue;\n\n if (item.type === \"container\") {\n containers.push(item);\n containerChanges[item._id] = { count: 0, weight: 0 };\n }\n }\n\n let onHandWeight = 0;\n for (let item of $this.items) {\n if (item.type === \"container\") continue;\n if (item.system.hasOwnProperty(\"weightless\") && item.system.weightless === true) continue;\n\n let itemWeight = 0;\n if (item.system.hasOwnProperty(\"weight\")) {\n let itemQty = item.system.quantity\n if (!isNaN(itemQty) && itemQty > 0) {\n itemWeight = item.system.weight;\n if (itemWeight > 0) {\n itemWeight *= itemQty;\n }\n }\n\n if (item.type === \"armor\") {\n if (item.system.equipped === true) {\n if (item.system.powered === true)\n itemWeight = 0;\n else\n itemWeight *= 0.25; // mass of armor that is being worn by 75% OPTIONAL\n }\n }\n\n if (item.system.container && item.system.container.id && item.system.container.id !== \"\") {\n // bad deleted container id\n if (containerChanges.hasOwnProperty(item.system.container.id)) {\n containerChanges[item.system.container.id].weight += Math.round(itemWeight * 10) / 10;\n containerChanges[item.system.container.id].count += item.system.quantity;\n }\n } else {\n onHandWeight += Math.round(itemWeight * 10) / 10;\n }\n }\n }\n\n //cloneActor.system.inventory.weight = onHandWeight.toFixed(1);\n\n // Check containers new weight\n for (let container of containers) {\n let newWeight = containerChanges[container._id].weight;\n let newCount = containerChanges[container._id].count;\n if (container.system.weight !== newWeight || container.system.count !== newCount) {\n //const cloneContainer = foundry.utils.deepClone();\n const cloneContainer = foundry.utils.deepClone($this.getEmbeddedDocument(\"Item\", container._id));\n //foundry.utils.setProperty(cloneContainer, \"system.weight\", newWeight);\n cloneContainer.system.weight = newWeight;\n cloneContainer.system.count = newCount;\n updatedContainers.push(cloneContainer);\n\n if (container.system.onHand === true &&\n (container.system.weight > 0 || container.system.weightless !== true)) {\n onHandWeight += container.system.weight;\n }\n }\n }\n\n cloneActor.system.inventory.weight = onHandWeight;\n cloneActor.system.states.encumbrance = onHandWeight > $this.system.inventory.encumbrance.normal;\n\n\n await $this.update(cloneActor);\n\n if (updatedContainers.length > 0) {\n await $this.updateEmbeddedDocuments('Item', updatedContainers);\n }\n }\n\n static async preUpdate($this, changed, options, user) {\n // Calc encumbrance\n\n const newStr = foundry.utils.getProperty(changed, \"system.characteristics.strength.value\") ?? $this.system.characteristics.strength.value;\n const newEnd = foundry.utils.getProperty(changed, \"system.characteristics.endurance.value\") ?? $this.system.characteristics.endurance.value;\n if ((newStr !== $this.system.characteristics.strength.value) || (newEnd !== $this.system.characteristics.endurance.value)) {\n let sumSkill = 0;\n $this.items.filter(x => x.type === \"talent\" && x.system.subType === \"skill\" && x.system.skill.reduceEncumbrance === true).forEach(x => sumSkill += x.system.level);\n let normal = newStr + newEnd + sumSkill;\n let heavy = normal * 2;\n foundry.utils.setProperty(changed, \"system.inventory.encumbrance.normal\", normal);\n foundry.utils.setProperty(changed, \"system.inventory.encumbrance.heavy\", heavy);\n }\n\n //console.log(foundry.utils.getProperty(changed, \"system.characteristics.strength.value\"));\n const characteristicModified = this.computeCharacteristics(changed);\n const strengthValue = foundry.utils.getProperty(changed, \"system.characteristics.strength.value\") ?? $this.system.characteristics.strength.value;\n const strengthMax = foundry.utils.getProperty(changed, \"system.characteristics.strength.max\") ?? $this.system.characteristics.strength.max;\n const dexterityValue = foundry.utils.getProperty(changed, \"system.characteristics.dexterity.value\") ?? $this.system.characteristics.dexterity.value;\n const dexterityMax = foundry.utils.getProperty(changed, \"system.characteristics.dexterity.max\") ?? $this.system.characteristics.dexterity.max;\n const enduranceValue = foundry.utils.getProperty(changed, \"system.characteristics.endurance.value\") ?? $this.system.characteristics.endurance.value;\n const enduranceMax = foundry.utils.getProperty(changed, \"system.characteristics.endurance.max\") ?? $this.system.characteristics.endurance.max;\n const lifeValue = strengthValue + dexterityValue + enduranceValue;\n const lifeMax = strengthMax + dexterityMax + enduranceMax;\n\n if ($this.system.life.value !== lifeValue)\n foundry.utils.setProperty(changed, \"system.life.value\", lifeValue);\n if ($this.system.life.max !== lifeMax)\n foundry.utils.setProperty(changed, \"system.life.max\", lifeMax);\n\n if (characteristicModified && $this.system.personal.ucp === undefined || $this.system.personal.ucp === \"\") {\n // calc\n\n }\n //}\n\n // Apply changes in Actor size to Token width/height\n // if ( \"size\" in (this.system.traits || {}) ) {\n // const newSize = foundry.utils.getProperty(changed, \"system.traits.size\");\n // if ( newSize && (newSize !== this.system.traits?.size) ) {\n // let size = CONFIG.DND5E.tokenSizes[newSize];\n // if ( !foundry.utils.hasProperty(changed, \"prototypeToken.width\") ) {\n // changed.prototypeToken ||= {};\n // changed.prototypeToken.height = size;\n // changed.prototypeToken.width = size;\n // }\n // }\n // }\n }\n\n // static applyHealing($this, amount) {\n // if (isNaN(amount) || amount === 0) return;\n\n // const strength = $this.system.characteristics.strength;\n // const dexterity = $this.system.characteristics.dexterity;\n // const endurance = $this.system.characteristics.endurance;\n\n // const data = {\n // strength: { value: strength.value },\n // dexterity: { value: dexterity.value },\n // endurance: { value: endurance.value }\n // };\n\n\n\n // $this.update({ system: { characteristics: data } });\n // }\n\n static applyDamage($this, amount) {\n if (isNaN(amount) || amount === 0) return;\n const rank1 = $this.system.config.damages.rank1;\n const rank2 = $this.system.config.damages.rank2;\n const rank3 = $this.system.config.damages.rank3;\n\n const data = {};\n data[rank1] = { value: $this.system.characteristics[rank1].value };\n data[rank2] = { value: $this.system.characteristics[rank2].value };\n data[rank3] = { value: $this.system.characteristics[rank3].value };\n\n if (amount < 0) amount = Math.abs(amount);\n\n for (const [key, rank] of Object.entries(data)) {\n if (rank.value > 0) {\n if (rank.value >= amount) {\n rank.value -= amount;\n amount = 0;\n } else {\n amount -= rank.value;\n rank.value = 0;\n }\n rank.dm = this.getModifier(rank.value);\n if (amount <= 0) break;\n }\n }\n\n $this.update({ system: { characteristics: data } });\n }\n\n static getContainers($this) {\n const containers = [];\n for (let item of $this.items) {\n if (item.type == \"container\") {\n containers.push(item);\n }\n }\n\n containers.sort(this.compareByName);\n\n return containers;\n }\n\n static getComputers($this) {\n const containers = [];\n for (let item of $this.items) {\n if (item.type == \"computer\") {\n containers.push(item);\n }\n }\n\n containers.sort(this.compareByName);\n\n return containers;\n }\n\n static getSkills($this) {\n const skills = [];\n for (let item of $this.items) {\n if (item.type === \"talent\" && item.system.subType === \"skill\") {\n skills.push(item);\n }\n }\n\n skills.sort(this.compareByName);\n\n return skills;\n }\n\n static computeCharacteristics(changed) {\n let modified = this.computeCharacteristic(changed, \"strength\");\n\n if (this.computeCharacteristic(changed, \"dexterity\") && !modified) modified = true;\n if (this.computeCharacteristic(changed, \"endurance\") && !modified) modified = true;\n if (this.computeCharacteristic(changed, \"intellect\") && !modified) modified = true;\n if (this.computeCharacteristic(changed, \"education\") && !modified) modified = true;\n if (this.computeCharacteristic(changed, \"social\") && !modified) modified = true;\n if (this.computeCharacteristic(changed, \"morale\") && !modified) modified = true;\n if (this.computeCharacteristic(changed, \"luck\") && !modified) modified = true;\n if (this.computeCharacteristic(changed, \"sanity\") && !modified) modified = true;\n if (this.computeCharacteristic(changed, \"charm\") && !modified) modified = true;\n if (this.computeCharacteristic(changed, \"psionic\") && !modified) modified = true;\n if (this.computeCharacteristic(changed, \"other\") && !modified) modified = true;\n\n return modified;\n }\n\n static computeCharacteristic(changed, name) {\n //if (isNaN(c.value) || c.value <= 0) c.value = 0;\n //c.dm = this._getModifier(c.value)\n const path = `system.characteristics.${name}`;\n const newValue = foundry.utils.getProperty(changed, path + \".value\");// || this.system.characteristics[name].value;\n if (newValue) {\n const dm = this.getModifier(newValue);\n foundry.utils.setProperty(changed, path + \".dm\", dm);\n return true;\n }\n\n return false;\n }\n\n static getModifier(value) {\n if (isNaN(value) || value <= 0) return -3;\n if (value >= 1 && value <= 2) return -2;\n if (value >= 3 && value <= 5) return -1;\n if (value >= 6 && value <= 8) return 0;\n if (value >= 9 && value <= 11) return 1;\n if (value >= 12 && value <= 14) return 2;\n\n return 3;\n }\n\n static compareByName(a, b) {\n if (!a.hasOwnProperty(\"name\") || !b.hasOwnProperty(\"name\")) {\n return 0;\n }\n return a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n }\n}","import { ActorCharacter } from \"./character.js\";\n\nexport class MGT2Combatant extends Combatant {\n \n}\n\nexport class TravellerActor extends Actor {\n\n\n prepareDerivedData() {\n if (this.type === \"character\") {\n this.system.initiative = ActorCharacter.getInitiative(this);\n }\n }\n\n async _preCreate(data, options, user) {\n if ( (await super._preCreate(data, options, user)) === false ) return false;\n \n if (this.type === \"character\") {\n ActorCharacter.preCreate(this, data, options, user);\n }\n }\n\n async _onDeleteDescendantDocuments(parent, collection, documents, ids, options, userId) {\n await super._onDeleteDescendantDocuments(parent, collection, documents, ids, options, userId);\n\n if (this.type === \"character\") {\n await ActorCharacter.onDeleteDescendantDocuments(this, parent, collection, documents, ids, options, userId);\n }\n }\n\n async _onUpdateDescendantDocuments(parent, collection, documents, changes, options, userId) {\n super._onUpdateDescendantDocuments(parent, collection, documents, changes, options, userId);\n //console.log(\"_onUpdateDescendantDocuments\");\n\n if (this.type === \"character\") {\n await ActorCharacter.onUpdateDescendantDocuments(this, parent, collection, documents, changes, options, userId);\n }\n }\n\n async _preUpdate(changed, options, user) {\n if ((await super._preUpdate(changed, options, user)) === false) return false;\n\n if (this.type === \"character\") {\n await ActorCharacter.preUpdate(this, changed, options, user);\n }\n }\n\n getInitiative($this) {\n if (this.type === \"character\") {\n return ActorCharacter.getInitiative(this);\n }\n }\n\n applyDamage(amount) {\n if (this.type === \"character\") {\n ActorCharacter.applyDamage(this, amount);\n }\n }\n\n getContainers() {\n if (this.type === \"character\") {\n return ActorCharacter.getContainers(this);\n }\n\n return [];\n }\n\n getComputers() {\n if (this.type === \"character\") {\n return ActorCharacter.getComputers(this);\n }\n\n return [];\n }\n\n getSkills() {\n if (this.type === \"character\") {\n return ActorCharacter.getSkills(this);\n }\n\n return [];\n }\n\n async recalculateWeight() {\n if (this.type === \"character\") {\n return ActorCharacter.recalculateWeight(this);\n }\n }\n\n}\n","export class TravellerItem extends Item {\n\n /** @inheritdoc */\n prepareDerivedData() {\n super.prepareDerivedData();\n\n }\n\n async _preUpdate(changed, options, user) {\n if ((await super._preUpdate(changed, options, user)) === false) return false;\n\n if (this.type === \"computer\") {\n // Overload\n const newProcessing = foundry.utils.getProperty(changed, \"system.processing\") ?? this.system.processing;\n if (newProcessing !== this.system.processing) {\n let overload = this.system.processingUsed > newProcessing;\n foundry.utils.setProperty(changed, \"system.overload\", overload);\n }\n }\n\n // Qty max 1\n if (this.type === \"computer\" || this.type === \"container\" || (this.type === \"item\" && this.system.subType === \"software\")) {\n const newQty = foundry.utils.getProperty(changed, \"system.quantity\") ?? this.system.quantity;\n if (newQty !== this.system.quantity && newQty > 1) {\n foundry.utils.setProperty(changed, \"system.quantity\", 1);\n }\n }\n\n // No Weight\n if (this.type === \"item\" && this.system.subType === \"software\") {\n const newWeight = foundry.utils.getProperty(changed, \"system.weight\") ?? this.system.weight;\n if (newWeight !== this.system.weight && newWeight > 0) {\n foundry.utils.setProperty(changed, \"system.weight\", 0);\n }\n }\n }\n\n getRollDisplay() {\n if (this.type === \"talent\") {\n if (this.system.subType === \"skill\") {\n let label;\n if (this.system.skill.speciality !== \"\" && this.system.skill.speciality !== undefined) {\n label = `${this.name} (${this.system.skill.speciality})`;\n } else {\n label = this.name;\n }\n\n if (this.system.level > 0)\n label += ` (+${this.system.level})`;\n else if (this.system.level < 0)\n label += ` (${this.system.level})`;\n\n return label;\n } else if (this.system.subType === \"psionic\") {\n\n }\n }\n\n return name;\n }\n}\n","const { HandlebarsApplicationMixin } = foundry.applications.api;\n\nexport default class MGT2ActorSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ActorSheetV2) {\n\n static SHEET_MODES = { EDIT: 0, PLAY: 1 }\n\n constructor(options = {}) {\n super(options);\n this._sheetMode = this.constructor.SHEET_MODES.PLAY;\n }\n\n /** @override */\n static DEFAULT_OPTIONS = {\n classes: [\"mgt2\", \"sheet\", \"actor\"],\n position: {\n width: 780,\n },\n form: {\n submitOnChange: true,\n closeOnSubmit: false,\n },\n window: {\n resizable: true,\n },\n dragDrop: [{ dragSelector: \".drag-item-list\", dropSelector: \".drop-item-list\" }],\n actions: {\n toggleSheet: MGT2ActorSheet.#onToggleSheet,\n },\n }\n\n get isPlayMode() {\n if (this._sheetMode === undefined) this._sheetMode = this.constructor.SHEET_MODES.PLAY;\n return this._sheetMode === this.constructor.SHEET_MODES.PLAY;\n }\n\n get isEditMode() {\n if (this._sheetMode === undefined) this._sheetMode = this.constructor.SHEET_MODES.PLAY;\n return this._sheetMode === this.constructor.SHEET_MODES.EDIT;\n }\n\n tabGroups = { primary: \"stats\" }\n\n /** @override */\n async _prepareContext() {\n const base = await super._prepareContext();\n const actor = this.document;\n return {\n ...base,\n actor: actor,\n // Flat shorthands for template backward-compat (AppV1 style)\n name: actor.name,\n img: actor.img,\n cssClass: this.isEditable ? \"editable\" : \"locked\",\n system: actor.system,\n source: actor.toObject(),\n fields: actor.schema.fields,\n systemFields: actor.system.schema.fields,\n isEditable: this.isEditable,\n isEditMode: this.isEditMode,\n isPlayMode: this.isPlayMode,\n isGM: game.user.isGM,\n config: CONFIG.MGT2,\n };\n }\n\n /** @override */\n _onRender(context, options) {\n super._onRender(context, options);\n this._activateTabGroups();\n }\n\n _activateTabGroups() {\n for (const [group, activeTab] of Object.entries(this.tabGroups)) {\n const nav = this.element.querySelector(`nav[data-group=\"${group}\"]`);\n if (!nav) continue;\n\n nav.querySelectorAll('[data-tab]').forEach(link => {\n link.classList.toggle('active', link.dataset.tab === activeTab);\n link.addEventListener('click', event => {\n event.preventDefault();\n this.tabGroups[group] = link.dataset.tab;\n this.render();\n });\n });\n\n this.element.querySelectorAll(`[data-group=\"${group}\"][data-tab]`).forEach(content => {\n content.classList.toggle('active', content.dataset.tab === activeTab);\n });\n }\n }\n\n /** @override */\n _canDragDrop(selector) {\n return this.isEditable;\n }\n\n static async #onToggleSheet(event) {\n event.preventDefault();\n this._sheetMode = this.isPlayMode\n ? this.constructor.SHEET_MODES.EDIT\n : this.constructor.SHEET_MODES.PLAY;\n this.render();\n }\n}\n","export class MGT2Helper {\n static POUNDS_CONVERT = 2.20462262185;\n\n static decimalSeparator;\n static badDecimalSeparator;\n\n static {\n this.decimalSeparator = Number(1.1).toLocaleString().charAt(1);\n this.badDecimalSeparator = (this.decimalSeparator === \".\" ? \",\" : \".\");\n }\n\n static format = function() {\n var s = arguments[0];\n for (var i = 0; i < arguments.length - 1; i++) { \n var reg = new RegExp(\"\\\\{\" + i + \"\\\\}\", \"gm\"); \n s = s.replace(reg, arguments[i + 1]);\n }\n return s;\n }\n\n static hasValue(object, property) {\n return object !== undefined && object.hasOwnProperty(property) && object[property] !== null && object[property] !== undefined && object[property] !== \"\";\n }\n\n static getItemsWeight(items) {\n let weight = 0;\n for (let i of items) {\n let item = i.hasOwnProperty(\"system\") ? i.system : i;\n if (item.hasOwnProperty(\"weightless\") && item.weightless === true) {\n continue;\n }\n\n if (item.hasOwnProperty(\"weight\")) {\n let itemQty = item.quantity\n if (!isNaN(itemQty) && itemQty > 0) {\n let itemWeight = item.weight;\n if (itemWeight > 0) {\n weight += itemWeight * itemQty;\n }\n }\n }\n }\n return weight;\n }\n\n static generateUID() {\n let result = '';\n const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';\n\n for (let i = 0; i < 36; i++) {\n const randomIndex = Math.floor(Math.random() * characters.length);\n result += characters.charAt(randomIndex);\n if (i === 8 || i === 12 || i === 16 || i === 20)\n result += \"-\";\n }\n\n return result;\n }\n\n static compareByName(a, b) {\n if (!a.hasOwnProperty(\"name\") || !b.hasOwnProperty(\"name\")) {\n return 0;\n }\n return a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n }\n\n static getDisplayDM(dm) {\n if (dm === 0) return \" (0)\";\n if (dm > 0) return ` (+${dm})`;\n if (dm < 0) return ` (${dm})`;\n return \"\";\n }\n static getFormulaDM(dm) {\n if (dm === 0) return \"+0\";\n if (dm > 0) return `+${dm}`;\n if (dm < 0) return `${dm}`;\n return \"\";\n }\n\n static getDiceResults(roll) {\n const results = [];\n for (const die of roll.dice) {\n results.push(die.results);\n }\n return results.flat(2);\n }\n\n static getDiceTotal(roll) {\n let total = 0;\n for (const die of roll.dice) {\n total += die.total;\n }\n return total;\n }\n\n static getDifficultyValue(difficulty) {\n switch(difficulty) {\n case \"Simple\": return 2;\n case \"Easy\": return 4;\n case \"Routine\": return 6;\n case \"Average\": return 8;\n case \"Difficult\": return 10;\n case \"VeryDifficult\": return 12;\n case \"Formidable\": return 14;\n case \"Impossible\": return 16;\n default:\n return 0;\n }\n }\n\n static getDifficultyDisplay(difficulty) {\n switch(difficulty) {\n case \"Simple\": return game.i18n.localize(\"MGT2.Difficulty.Simple\") + \" (2+)\";\n case \"Easy\": return game.i18n.localize(\"MGT2.Difficulty.Easy\") + \" (4+)\";\n case \"Routine\": return game.i18n.localize(\"MGT2.Difficulty.Routine\") + \" (6+)\";\n case \"Average\": return game.i18n.localize(\"MGT2.Difficulty.Average\") + \" (8+)\";\n case \"Difficult\": return game.i18n.localize(\"MGT2.Difficulty.Difficult\") + \" (10+)\";\n case \"VeryDifficult\": return game.i18n.localize(\"MGT2.Difficulty.VeryDifficult\") + \" (12+)\";\n case \"Formidable\": return game.i18n.localize(\"MGT2.Difficulty.Formidable\") + \" (14+)\";\n case \"Impossible\": return game.i18n.localize(\"MGT2.Difficulty.Impossible\") + \" (16+)\";\n default:\n return null;\n }\n }\n\n static getRangeDisplay(range) {\n let value = Number(range.value);\n\n if (isNaN(value)) return null;\n\n let label;\n //if (game.settings.get(\"mgt2\", \"useDistanceMetric\") === true) {\n if (range.unit !== null && range.unit !== undefined && range.unit !== \"\")\n label = game.i18n.localize(`MGT2.MetricRange.${range.unit}`).toLowerCase();\n else\n label = \"\";\n //} else {\n // TODO\n //}\n\n return `${value}${label}`;\n }\n\n static getWeightLabel() {\n //const label = game.settings.get(\"mgt2\", \"useWeightMetric\") === true ? \"MGT2.MetricSystem.Weight.kg\" : \"MGT2.ImperialSystem.Weight.lb\";\n //return game.i18n.localize(label);\n return game.i18n.localize(\"MGT2.MetricSystem.Weight.kg\");\n }\n\n static getDistanceLabel() {\n //const label = game.settings.get(\"mgt2\", \"useDistanceMetric\") === true ? \"MGT2.MetricSystem.Distance.km\" : \"MGT2.ImperialSystem.Distance.mi\";\n //return game.i18n.localize(label);\n return game.i18n.localize(\"MGT2.MetricSystem.Distance.km\");\n }\n\n static getIntegerFromInput(data) {\n return Math.trunc(this.getNumberFromInput(data));\n }\n\n static getNumberFromInput(data) {\n if (data === undefined || data === null) return 0;\n\n if (typeof data === \"string\") {\n let converted = Number(data.replace(/\\s+/g, '').replace(this.badDecimalSeparator, this.decimalSeparator).trim());\n if (isNaN(converted))\n return 0;\n\n return converted;\n }\n\n let converted = Number(data);\n\n if (isNaN(converted))\n return 0;\n\n return converted;\n }\n\n static convertWeightForDisplay(weight) {\n //if (game.settings.get(\"mgt2\", \"useWeightMetric\") === true || weight === 0)\n return weight;\n\n // Metric to Imperial\n //const pounds = weight * this.POUNDS_CONVERT;\n //return Math.round(pounds * 10) / 10;\n }\n\n static convertWeightFromInput(weight) {\n //if (game.settings.get(\"mgt2\", \"useWeightMetric\") === true || weight === 0)\n return Math.round(weight * 10) / 10;\n\n // Imperial to Metric\n //const kg = this.POUNDS_CONVERT / weight;\n //return Math.round(kg * 10) / 10;\n }\n\n static getDataFromDropEvent(event) {\n let data;\n try {\n return JSON.parse(event.dataTransfer?.getData(\"text/plain\"));\n } catch (err) {\n return false;\n }\n\n //if ( data.type !== \"Item\" ) return false;\n //const item = await Item.implementation.fromDropData(data);\n }\n\n static async getItemDataFromDropData(dropData) {\n //console.log(\"getItemDataFromDropData\");\n let item;\n if (game.modules.get(\"monks-enhanced-journal\")?.active && dropData.itemId && dropData.uuid.includes(\"JournalEntry\")) {\n const journalEntry = await fromUuid(dropData.uuid);\n } else if (dropData.hasOwnProperty(\"uuid\")) {\n item = await fromUuid(dropData.uuid);\n } else {\n let uuid = `${dropData.type}.${dropData.data._id}`;\n item = await fromUuid(uuid);\n }\n\n if (!item) {\n throw new Error(game.i18n.localize(\"Errors.CouldNotFindItem\").replace(\"_ITEM_ID_\", dropData.uuid));\n }\n if (item.pack) {\n const pack = game.packs.get(item.pack);\n item = await pack?.getDocument(item._id);\n }\n return deepClone(item);\n }\n}","class RollPromptDialog extends Dialog {\n constructor(dialogData = {}, options = {}) {\n super(dialogData, options);\n this.options.classes = [\"mgt2\", game.settings.get(\"mgt2\", \"theme\"), \"sheet\", \"dialog\"];\n }\n\n static async create(options) {\n\n const htmlContent = await renderTemplate('systems/mgt2/templates/roll-prompt.html', {\n config: CONFIG.MGT2,\n //formula: formula,\n characteristics: options.characteristics,\n characteristic: options.characteristic,\n skills: options.skills,\n skill: options.skill,\n fatigue: options.fatigue,\n encumbrance: options.encumbrance,\n difficulty: options.difficulty\n });\n\n const results = new Promise(resolve => {\n new this({\n title: options.title,\n content: htmlContent,\n buttons: {\n boon: {\n label: game.i18n.localize(\"MGT2.RollPrompt.Boon\"),\n callback: (html) => {\n const formData = new FormDataExtended(html[0].querySelector('form')).object;\n formData.diceModifier = \"dl\";\n resolve(formData);\n }\n },\n submit: {\n label: game.i18n.localize(\"MGT2.RollPrompt.Roll\"),\n icon: '',\n callback: (html) => {\n const formData = new FormDataExtended(html[0].querySelector('form')).object;\n resolve(formData);\n },\n },\n bane: {\n label: game.i18n.localize(\"MGT2.RollPrompt.Bane\"),\n //icon: '',\n callback: (html) => {\n const formData = new FormDataExtended(html[0].querySelector('form')).object;\n formData.diceModifier = \"dh\";\n resolve(formData);\n }\n }\n }\n //close: () => { resolve(false) }\n }).render(true);\n });\n\n //console.log(Promise.resolve(results));\n return results;\n }\n}\n\nexport class RollPromptHelper {\n\n static async roll(options) {\n return await RollPromptDialog.create(options);\n }\n\n static async promptForFruitTraits() {\n const htmlContent = await renderTemplate('systems/mgt2/templateschat/chat/roll-prompt.html');\n\n return new Promise((resolve, reject) => {\n const dialog = new Dialog({\n title: \"Fruit Traits\",\n content: htmlContent,\n buttons: {\n submit: {\n label: \"Roll\",\n icon: '',\n callback: (html) => {\n const formData = new FormDataExtended(html[0].querySelector('form'))\n .toObject();\n\n //verifyFruitInputs(formData);\n\n resolve(formData);\n },\n },\n skip: {\n label: \"Cancel\",\n callback: () => resolve(null),\n }\n },\n render: (html) => {\n //html.on('click', 'button[data-preset]', handleFruitPreset);\n },\n close: () => {\n reject('User closed dialog without making a selection.');\n },\n });\n\n dialog.render(true);\n });\n }\n}","class EditorFullViewDialog extends Dialog {\n constructor(dialogData = {}, options = {}) {\n super(dialogData, options);\n this.options.classes = [\"mgt2\", game.settings.get(\"mgt2\", \"theme\"), \"sheet\"];\n this.options.resizable = true;\n }\n\n static async create(title, html) {\n const htmlContent = await renderTemplate(\"systems/mgt2/templates/editor-fullview.html\", {\n config: CONFIG.MGT2,\n html: html\n });\n\n const results = new Promise(resolve => {\n new this({\n title: title,\n content: htmlContent,\n buttons: {\n //close: { label: game.i18n.localize(\"MGT2.Close\") }\n }\n }).render(true);\n });\n\n return results;\n }\n}\n\nclass ActorConfigDialog extends Dialog {\n constructor(dialogData = {}, options = {}) {\n super(dialogData, options);\n this.options.classes = [\"mgt2\", game.settings.get(\"mgt2\", \"theme\"), \"sheet\"];\n }\n\n static async create(system) {\n const htmlContent = await renderTemplate(\"systems/mgt2/templates/actors/actor-config-sheet.html\", {\n config: CONFIG.MGT2,\n system: system\n });\n\n const results = new Promise(resolve => {\n new this({\n title: \"Configuration\",\n content: htmlContent,\n buttons: {\n submit: {\n label: game.i18n.localize(\"MGT2.Save\"),\n icon: '',\n callback: (html) => {\n const formData = new FormDataExtended(html[0].querySelector('form')).object;\n resolve(formData);\n },\n }\n }\n }).render(true);\n });\n\n return results;\n }\n}\n\nclass ActorCharacteristicDialog extends Dialog {\n // https://foundryvtt.wiki/en/development/api/dialog\n constructor(dialogData = {}, options = {}) {\n super(dialogData, options);\n this.options.classes = [\"mgt2\", game.settings.get(\"mgt2\", \"theme\"), \"sheet\"];\n }\n\n static async create(name, show, showMax, showAll = false) {\n const htmlContent = await renderTemplate(\"systems/mgt2/templates/actors/actor-config-characteristic-sheet.html\", {\n name: name,\n show: show,\n showMax: showMax,\n showAll: showAll\n });\n\n const results = new Promise(resolve => {\n new this({\n title: \"Configuration: \" + name,\n content: htmlContent,\n buttons: {\n submit: {\n label: game.i18n.localize(\"MGT2.Save\"),\n icon: '',\n callback: (html) => {\n const formData = new FormDataExtended(html[0].querySelector('form')).object;\n resolve(formData);\n },\n }\n }\n }).render(true);\n });\n\n return results;\n }\n}\n\nclass TraitEditDialog extends Dialog {\n constructor(dialogData = {}, options = {}) {\n super(dialogData, options);\n this.options.classes = [\"mgt2\", game.settings.get(\"mgt2\", \"theme\"), \"sheet\"];\n }\n\n static async create(data) {\n const htmlContent = await renderTemplate(\"systems/mgt2/templates/actors/trait-sheet.html\", {\n config: CONFIG.MGT2,\n data: data\n });\n const title = data.hasOwnProperty(\"name\") && data.name !== undefined ? data.name : game.i18n.localize(\"MGT2.Actor.EditTrait\");\n const results = new Promise(resolve => {\n new this({\n title: title,\n content: htmlContent,\n buttons: {\n submit: {\n label: game.i18n.localize(\"MGT2.Save\"),\n icon: '',\n callback: (html) => {\n const formData = new FormDataExtended(html[0].querySelector('form')).object;\n resolve(formData);\n },\n }\n //cancel: { label: \"Cancel\" }\n }\n // close: (html) => {\n // console.log(\"This always is logged no matter which option is chosen\");\n // const formData = new FormDataExtended(html[0].querySelector('form')).object;\n // resolve(formData);\n // }\n }).render(true);\n });\n\n return results;\n }\n}\n\nexport class CharacterPrompts {\n\n static async openConfig(system) {\n return await ActorConfigDialog.create(system);\n }\n\n static async openCharacteristic(name, hide, showMax, showAll = false) {\n return await ActorCharacteristicDialog.create(name, hide, showMax, showAll);\n }\n\n static async openTraitEdit(data) {\n return await TraitEditDialog.create(data);\n }\n\n static async openEditorFullView(title, html) {\n return await EditorFullViewDialog.create(title, html);\n } \n}","import MGT2ActorSheet from \"./base-actor-sheet.mjs\";\nimport { MGT2 } from \"../../config.js\";\nimport { MGT2Helper } from \"../../helper.js\";\nimport { RollPromptHelper } from \"../../roll-prompt.js\";\nimport { CharacterPrompts } from \"../../actors/character-prompts.js\";\n\nexport default class TravellerCharacterSheet extends MGT2ActorSheet {\n\n /** @override */\n static DEFAULT_OPTIONS = {\n ...super.DEFAULT_OPTIONS,\n classes: [...super.DEFAULT_OPTIONS.classes, \"character\", \"nopad\"],\n window: {\n ...super.DEFAULT_OPTIONS.window,\n title: \"TYPES.Actor.character\",\n },\n actions: {\n ...super.DEFAULT_OPTIONS.actions,\n createItem: TravellerCharacterSheet.#onCreateItem,\n editItem: TravellerCharacterSheet.#onEditItem,\n deleteItem: TravellerCharacterSheet.#onDeleteItem,\n equipItem: TravellerCharacterSheet.#onEquipItem,\n itemStorageIn: TravellerCharacterSheet.#onItemStorageIn,\n itemStorageOut: TravellerCharacterSheet.#onItemStorageOut,\n softwareEject: TravellerCharacterSheet.#onSoftwareEject,\n createContainer: TravellerCharacterSheet.#onContainerCreate,\n editContainer: TravellerCharacterSheet.#onContainerEdit,\n deleteContainer: TravellerCharacterSheet.#onContainerDelete,\n roll: TravellerCharacterSheet.#onRoll,\n openConfig: TravellerCharacterSheet.#onOpenConfig,\n openCharacteristic: TravellerCharacterSheet.#onOpenCharacteristic,\n traitCreate: TravellerCharacterSheet.#onTraitCreate,\n traitEdit: TravellerCharacterSheet.#onTraitEdit,\n traitDelete: TravellerCharacterSheet.#onTraitDelete,\n openEditor: TravellerCharacterSheet.#onOpenEditor,\n },\n }\n\n /** @override */\n static PARTS = {\n sheet: {\n template: \"systems/mgt2/templates/actors/actor-sheet.html\",\n },\n }\n\n /** @override */\n tabGroups = {\n primary: \"inventory\",\n characteristics: \"core\",\n inventory: \"onhand\",\n }\n\n /** @override */\n async _prepareContext() {\n const context = await super._prepareContext();\n const actor = this.document;\n\n context.settings = {\n weightUnit: \"kg\",\n usePronouns: game.settings.get(\"mgt2\", \"usePronouns\"),\n useGender: game.settings.get(\"mgt2\", \"useGender\"),\n showLife: game.settings.get(\"mgt2\", \"showLife\"),\n };\n context.isGM = game.user.isGM;\n context.showTrash = false;\n context.initiative = actor.getInitiative();\n\n this._prepareCharacterItems(context);\n\n return context;\n }\n\n _prepareCharacterItems(context) {\n const actor = this.document;\n const settings = context.settings;\n const items = actor.items;\n\n const weapons = [], armors = [], augments = [], computers = [], softwares = [];\n const miscItems = [], equipments = [], containerItems = [], careers = [];\n const skills = [], psionics = [], diseases = [], wounds = [], contacts = [];\n const actorContainers = [];\n\n for (let i of items) {\n if (i.type === \"container\") {\n actorContainers.push(i);\n } else if (i.type === \"computer\") {\n computers.push(i);\n i._subItems = [];\n if (i.system.overload === true)\n i._overloadClass = \"computer-overload\";\n }\n }\n\n actorContainers.sort(MGT2Helper.compareByName);\n\n const containers = [{ name: \"(tous)\", _id: \"\" }].concat(actorContainers);\n const containerIndex = new Map();\n\n for (let c of actorContainers) {\n containerIndex.set(c._id, c);\n\n if (c.system.weight > 0) {\n const w = MGT2Helper.convertWeightForDisplay(c.system.weight) + \" \" + settings.weightUnit;\n c._display = c.name.length > 12 ? `${c.name.substring(0, 12)}... (${w})` : `${c.name} (${w})`;\n } else {\n c._display = c.name.length > 12 ? c.name.substring(0, 12) + \"...\" : c.name;\n }\n\n if (c.system.onHand === true)\n c._subItems = [];\n }\n\n const containerView = actor.system.containerView;\n let currentContainerView = containerView !== \"\" ? containerIndex.get(containerView) : null;\n\n context.containerView = currentContainerView || null;\n context.containerWeight = currentContainerView\n ? MGT2Helper.convertWeightForDisplay(currentContainerView.system.weight)\n : MGT2Helper.convertWeightForDisplay(0);\n context.containerShowAll = containerView === \"\";\n\n for (let i of items) {\n const item = i.system;\n\n if (item.hasOwnProperty(\"weight\") && item.weight > 0) {\n i._weight = isNaN(item.quantity)\n ? MGT2Helper.convertWeightForDisplay(item.weight) + \" \" + settings.weightUnit\n : MGT2Helper.convertWeightForDisplay(item.weight * item.quantity) + \" \" + settings.weightUnit;\n }\n\n if (item.hasOwnProperty(\"container\") && item.container.id !== \"\" && item.container.id !== undefined) {\n const container = containerIndex.get(item.container.id);\n if (container === undefined) {\n if (context.containerShowAll) {\n i._containerName = \"#deleted#\";\n containerItems.push(i);\n }\n continue;\n }\n\n if (container.system.locked && !game.user.isGM) continue;\n\n if (container.system.onHand === true)\n container._subItems.push(i);\n\n if (context.containerShowAll || actor.system.containerView === item.container.id) {\n i._containerName = container.name;\n containerItems.push(i);\n }\n continue;\n }\n\n if (item.hasOwnProperty(\"equipped\")) {\n i._canEquip = true;\n i._toggleClass = item.equipped ? \"active\" : \"\";\n } else {\n i._canEquip = false;\n }\n\n switch (i.type) {\n case \"equipment\":\n (i.system.subType === \"augment\" ? augments : equipments).push(i);\n break;\n\n case \"armor\":\n if (i.system.options?.length > 0)\n i._subInfo = i.system.options.map(x => x.name).join(\", \");\n armors.push(i);\n break;\n\n case \"computer\":\n if (i.system.options?.length > 0)\n i._subInfo = i.system.options.map(x => x.name).join(\", \");\n break;\n\n case \"item\":\n if (i.system.subType === \"software\") {\n if (i.system.software.computerId && i.system.software.computerId !== \"\") {\n const computer = computers.find(x => x._id === i.system.software.computerId);\n if (computer !== undefined) computer._subItems.push(i);\n else softwares.push(i);\n } else {\n i._display = i.system.software.bandwidth > 0\n ? `${i.name} (${i.system.software.bandwidth})`\n : i.name;\n softwares.push(i);\n }\n } else {\n miscItems.push(i);\n }\n break;\n\n case \"weapon\":\n i._range = i.system.range.isMelee\n ? game.i18n.localize(\"MGT2.Melee\")\n : MGT2Helper.getRangeDisplay(i.system.range);\n if (i.system.traits?.length > 0)\n i._subInfo = i.system.traits.map(x => x.name).join(\", \");\n weapons.push(i);\n break;\n\n case \"career\":\n careers.push(i);\n break;\n\n case \"contact\":\n contacts.push(i);\n break;\n\n case \"disease\":\n (i.system.subType === \"wound\" ? wounds : diseases).push(i);\n break;\n\n case \"talent\":\n if (i.system.subType === \"skill\") {\n skills.push(i);\n } else {\n if (MGT2Helper.hasValue(i.system.psionic, \"reach\"))\n i._reach = game.i18n.localize(`MGT2.PsionicReach.${i.system.psionic.reach}`);\n if (MGT2Helper.hasValue(i.system.roll, \"difficulty\"))\n i._difficulty = game.i18n.localize(`MGT2.Difficulty.${i.system.roll.difficulty}`);\n psionics.push(i);\n }\n break;\n\n case \"container\":\n if (i.system.onHand === true)\n miscItems.push(i);\n break;\n }\n }\n\n const byName = MGT2Helper.compareByName;\n const byEquipName = (a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n\n context.encumbranceNormal = MGT2Helper.convertWeightForDisplay(actor.system.inventory.encumbrance.normal);\n context.encumbranceHeavy = MGT2Helper.convertWeightForDisplay(actor.system.inventory.encumbrance.heavy);\n\n const totalWeight = actor.system.inventory.weight;\n if (totalWeight > actor.system.inventory.encumbrance.heavy) {\n context.encumbranceClasses = \"encumbrance-heavy\";\n context.encumbrance = 2;\n } else if (totalWeight > actor.system.inventory.encumbrance.normal) {\n context.encumbranceClasses = \"encumbrance-normal\";\n context.encumbrance = 1;\n } else {\n context.encumbrance = 0;\n }\n\n if (softwares.length > 0) { softwares.sort(byName); context.softwares = softwares; }\n augments.sort(byEquipName); context.augments = augments;\n armors.sort(byEquipName); context.armors = armors;\n computers.sort(byEquipName); context.computers = computers;\n context.careers = careers;\n contacts.sort(byName); context.contacts = contacts;\n containers.sort(byName); context.containers = containers;\n diseases.sort(byName); context.diseases = diseases;\n context.wounds = wounds;\n equipments.sort(byEquipName); context.equipments = equipments;\n miscItems.sort(byEquipName); context.items = miscItems;\n actorContainers.sort(byName); context.actorContainers = actorContainers;\n skills.sort(byName); context.skills = skills;\n psionics.sort(byName); context.psionics = psionics;\n weapons.sort(byEquipName); context.weapons = weapons;\n\n if (containerItems.length > 0) {\n containerItems.sort((a, b) => {\n const r = a._containerName.localeCompare(b._containerName);\n return r !== 0 ? r : a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n });\n }\n context.containerItems = containerItems;\n }\n\n // =========================================================\n // Event Binding (AppV2 _onRender — replaces jQuery activateListeners)\n // Templates still use CSS class selectors, so we bind manually here.\n // =========================================================\n\n /** @override */\n _onRender(context, options) {\n super._onRender(context, options);\n const html = this.element;\n if (!this.isEditable) return;\n\n this._bindClassEvent(html, \".roll\", \"click\", TravellerCharacterSheet.#onRoll);\n this._bindClassEvent(html, \".cfg-characteristic\", \"click\", TravellerCharacterSheet.#onOpenCharacteristic);\n this._bindClassEvent(html, \".item-create\", \"click\", TravellerCharacterSheet.#onCreateItem);\n this._bindClassEvent(html, \".item-edit\", \"click\", TravellerCharacterSheet.#onEditItem);\n this._bindClassEvent(html, \".item-delete\", \"click\", TravellerCharacterSheet.#onDeleteItem);\n this._bindClassEvent(html, \".item-equip\", \"click\", TravellerCharacterSheet.#onEquipItem);\n this._bindClassEvent(html, \".item-storage-in\", \"click\", TravellerCharacterSheet.#onItemStorageIn);\n this._bindClassEvent(html, \".item-storage-out\", \"click\", TravellerCharacterSheet.#onItemStorageOut);\n this._bindClassEvent(html, \".software-eject\", \"click\", TravellerCharacterSheet.#onSoftwareEject);\n this._bindClassEvent(html, \".container-create\", \"click\", TravellerCharacterSheet.#onContainerCreate);\n this._bindClassEvent(html, \".container-edit\", \"click\", TravellerCharacterSheet.#onContainerEdit);\n this._bindClassEvent(html, \".container-delete\", \"click\", TravellerCharacterSheet.#onContainerDelete);\n this._bindClassEvent(html, \".traits-create\", \"click\", TravellerCharacterSheet.#onTraitCreate);\n this._bindClassEvent(html, \".traits-edit\", \"click\", TravellerCharacterSheet.#onTraitEdit);\n this._bindClassEvent(html, \".traits-delete\", \"click\", TravellerCharacterSheet.#onTraitDelete);\n this._bindClassEvent(html, \"[data-editor='open']\", \"click\", TravellerCharacterSheet.#onOpenEditor);\n html.querySelector(\"[name='config']\")?.addEventListener(\"click\", (ev) => TravellerCharacterSheet.#onOpenConfig.call(this, ev, ev.currentTarget));\n }\n\n /** Helper: bind a handler to all matching elements, with `this` set to the sheet instance */\n _bindClassEvent(html, selector, event, handler) {\n for (const el of html.querySelectorAll(selector)) {\n el.addEventListener(event, (ev) => handler.call(this, ev, ev.currentTarget));\n }\n }\n\n // =========================================================\n // Drag & Drop\n // =========================================================\n\n /** @override */\n async _onDrop(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n const dropData = MGT2Helper.getDataFromDropEvent(event);\n if (!dropData) return false;\n\n const sourceItemData = await MGT2Helper.getItemDataFromDropData(dropData);\n\n if (sourceItemData.type === \"species\") {\n const update = {\n system: {\n personal: {\n species: sourceItemData.name,\n speciesText: {\n description: sourceItemData.system.description,\n descriptionLong: sourceItemData.system.descriptionLong,\n },\n },\n },\n };\n update.system.personal.traits = this.actor.system.personal.traits.concat(sourceItemData.system.traits);\n\n if (sourceItemData.system.modifiers?.length > 0) {\n update.system.characteristics = {};\n for (let modifier of sourceItemData.system.modifiers) {\n if (MGT2Helper.hasValue(modifier, \"characteristic\") && MGT2Helper.hasValue(modifier, \"value\")) {\n const c = this.actor.system.characteristics[modifier.characteristic];\n const updateValue = { value: c.value + modifier.value };\n if (c.showMax) updateValue.max = c.max + modifier.value;\n update.system.characteristics[modifier.characteristic] = updateValue;\n }\n }\n }\n\n this.actor.update(update);\n return true;\n }\n\n if ([\"contact\", \"disease\", \"career\", \"talent\"].includes(sourceItemData.type)) {\n let transferData = {};\n try { transferData = sourceItemData.toJSON(); } catch (e) { transferData = sourceItemData; }\n delete transferData._id;\n delete transferData.id;\n await this.actor.createEmbeddedDocuments(\"Item\", [transferData]);\n return true;\n }\n\n if (![\"armor\", \"weapon\", \"computer\", \"container\", \"item\", \"equipment\"].includes(sourceItemData.type)) return false;\n\n const target = event.target.closest(\".table-row\");\n let targetId = null;\n let targetItem = null;\n if (target !== null) {\n targetId = target.dataset.itemId;\n targetItem = this.actor.getEmbeddedDocument(\"Item\", targetId);\n }\n\n let sourceItem = this.actor.getEmbeddedDocument(\"Item\", sourceItemData.id);\n if (sourceItem) {\n if (!targetItem) return false;\n sourceItem = foundry.utils.deepClone(sourceItem);\n if (sourceItem._id === targetId) return false;\n\n if (targetItem.type === \"item\" || targetItem.type === \"equipment\") {\n if (targetItem.system.subType === \"software\")\n sourceItem.system.software.computerId = targetItem.system.software.computerId;\n else\n sourceItem.system.container.id = targetItem.system.container.id;\n this.actor.updateEmbeddedDocuments(\"Item\", [sourceItem]);\n return true;\n } else if (targetItem.type === \"computer\") {\n sourceItem.system.software.computerId = targetId;\n this.actor.updateEmbeddedDocuments(\"Item\", [sourceItem]);\n return true;\n } else if (targetItem.type === \"container\") {\n if (targetItem.system.locked && !game.user.isGM) {\n ui.notifications.error(\"Verrouillé\");\n } else {\n sourceItem.system.container.id = targetId;\n this.actor.updateEmbeddedDocuments(\"Item\", [sourceItem]);\n return true;\n }\n }\n } else {\n let transferData = {};\n try { transferData = sourceItemData.toJSON(); } catch (e) { transferData = sourceItemData; }\n delete transferData._id;\n delete transferData.id;\n\n const recalcWeight = transferData.system.hasOwnProperty(\"weight\");\n\n if (transferData.system.hasOwnProperty(\"container\")) transferData.system.container.id = \"\";\n if (transferData.type === \"item\" && transferData.system.subType === \"software\") transferData.system.software.computerId = \"\";\n if (transferData.type === \"container\") transferData.system.onHand = true;\n if (transferData.system.hasOwnProperty(\"equipment\")) transferData.system.equipped = false;\n\n if (targetItem !== null) {\n if (transferData.type === \"item\" && transferData.system.subType === \"software\") {\n if (targetItem.type === \"item\" && targetItem.system.subType === \"software\")\n transferData.system.software.computerId = targetItem.system.software.computerId;\n else if (targetItem.type === \"computer\")\n transferData.system.software.computerId = targetItem._id;\n } else if ([\"armor\", \"computer\", \"equipment\", \"item\", \"weapon\"].includes(transferData.type)) {\n if (targetItem.type === \"container\") {\n if (!targetItem.system.locked || game.user.isGM)\n transferData.system.container.id = targetId;\n } else {\n transferData.system.container.id = targetItem.system.container.id;\n }\n }\n }\n\n await this.actor.createEmbeddedDocuments(\"Item\", [transferData]);\n if (recalcWeight) await this.actor.recalculateWeight();\n }\n return true;\n }\n\n // =========================================================\n // Actions (static private methods)\n // =========================================================\n\n static async #onCreateItem(event, target) {\n event.preventDefault();\n const data = {\n name: target.dataset.createName,\n type: target.dataset.typeItem,\n };\n if (target.dataset.subtype) {\n data.system = { subType: target.dataset.subtype };\n }\n const cls = getDocumentClass(\"Item\");\n return cls.create(data, { parent: this.actor });\n }\n\n static async #onEditItem(event, target) {\n event.preventDefault();\n const li = target.closest(\"[data-item-id]\");\n const item = this.actor.getEmbeddedDocument(\"Item\", li?.dataset.itemId);\n if (item) item.sheet.render(true);\n }\n\n static async #onDeleteItem(event, target) {\n event.preventDefault();\n const li = target.closest(\"[data-item-id]\");\n if (!li?.dataset.itemId) return;\n this.actor.deleteEmbeddedDocuments(\"Item\", [li.dataset.itemId]);\n }\n\n static async #onEquipItem(event, target) {\n event.preventDefault();\n const li = target.closest(\"[data-item-id]\");\n const item = foundry.utils.deepClone(this.actor.getEmbeddedDocument(\"Item\", li?.dataset.itemId));\n if (!item) return;\n item.system.equipped = !item.system.equipped;\n this.actor.updateEmbeddedDocuments(\"Item\", [item]);\n }\n\n static async #onItemStorageIn(event, target) {\n event.preventDefault();\n const li = target.closest(\"[data-item-id]\");\n const item = foundry.utils.deepClone(this.actor.getEmbeddedDocument(\"Item\", li?.dataset.itemId));\n if (!item) return;\n\n if (item.type === \"container\") {\n item.system.onHand = false;\n } else {\n const containers = this.actor.getContainers();\n let container;\n const dropInId = this.actor.system.containerDropIn;\n\n if (!dropInId) {\n container = containers.length === 0\n ? await getDocumentClass(\"Item\").create({ name: \"New container\", type: \"container\" }, { parent: this.actor })\n : containers[0];\n } else {\n container = containers.find(x => x._id === dropInId);\n }\n\n if (container?.system.locked && !game.user.isGM) {\n ui.notifications.error(\"Objet verrouillé\");\n return;\n }\n item.system.container.id = container._id;\n }\n this.actor.updateEmbeddedDocuments(\"Item\", [item]);\n }\n\n static async #onItemStorageOut(event, target) {\n event.preventDefault();\n const li = target.closest(\"[data-item-id]\");\n const item = foundry.utils.deepClone(this.actor.getEmbeddedDocument(\"Item\", li?.dataset.itemId));\n if (!item) return;\n item.system.container.id = \"\";\n this.actor.updateEmbeddedDocuments(\"Item\", [item]);\n }\n\n static async #onSoftwareEject(event, target) {\n event.preventDefault();\n const li = target.closest(\"[data-item-id]\");\n const item = foundry.utils.deepClone(this.actor.getEmbeddedDocument(\"Item\", li?.dataset.itemId));\n if (!item) return;\n item.system.software.computerId = \"\";\n this.actor.updateEmbeddedDocuments(\"Item\", [item]);\n }\n\n static async #onContainerCreate(event) {\n event.preventDefault();\n const cls = getDocumentClass(\"Item\");\n return cls.create({ name: \"New container\", type: \"container\" }, { parent: this.actor });\n }\n\n static async #onContainerEdit(event) {\n event.preventDefault();\n const container = this.actor.getEmbeddedDocument(\"Item\", this.actor.system.containerView);\n if (container) container.sheet.render(true);\n }\n\n static async #onContainerDelete(event) {\n event.preventDefault();\n const containers = this.actor.getContainers();\n const container = containers.find(x => x._id === this.actor.system.containerView);\n if (!container) return;\n\n const containerItems = this.actor.items.filter(\n x => x.system.hasOwnProperty(\"container\") && x.system.container.id === container._id\n );\n\n if (containerItems.length > 0) {\n for (let item of containerItems) {\n let clone = foundry.utils.deepClone(item);\n clone.system.container.id = \"\";\n this.actor.updateEmbeddedDocuments(\"Item\", [clone]);\n }\n }\n\n const cloneActor = foundry.utils.deepClone(this.actor);\n cloneActor.system.containerView = \"\";\n if (cloneActor.system.containerDropIn === container._id) {\n cloneActor.system.containerDropIn = \"\";\n const remaining = containers.filter(x => x._id !== container._id);\n if (remaining.length > 0) cloneActor.system.containerDropIn = remaining[0]._id;\n }\n\n this.actor.deleteEmbeddedDocuments(\"Item\", [container._id]);\n this.actor.update(cloneActor);\n }\n\n static async #onRoll(event, target) {\n event.preventDefault();\n\n const rollOptions = {\n rollTypeName: game.i18n.localize(\"MGT2.RollPrompt.Roll\"),\n rollObjectName: \"\",\n characteristics: [{ _id: \"\", name: \"\" }],\n characteristic: \"\",\n skills: [],\n skill: \"\",\n fatigue: this.actor.system.states.fatigue,\n encumbrance: this.actor.system.states.encumbrance,\n difficulty: null,\n damageFormula: null,\n };\n\n const cardButtons = [];\n for (const [key, label] of Object.entries(MGT2.Characteristics)) {\n const c = this.actor.system.characteristics[key];\n if (c.show) {\n rollOptions.characteristics.push({\n _id: key,\n name: game.i18n.localize(label) + MGT2Helper.getDisplayDM(c.dm),\n });\n }\n }\n\n for (let item of this.actor.items) {\n if (item.type === \"talent\" && item.system.subType === \"skill\")\n rollOptions.skills.push({ _id: item._id, name: item.getRollDisplay() });\n }\n\n rollOptions.skills.sort(MGT2Helper.compareByName);\n rollOptions.skills = [{ _id: \"NP\", name: game.i18n.localize(\"MGT2.Items.NotProficient\") }].concat(rollOptions.skills);\n\n let itemObj = null;\n let isInitiative = false;\n const rollType = target.dataset.roll;\n\n if (rollType === \"initiative\") {\n rollOptions.rollTypeName = game.i18n.localize(\"MGT2.RollPrompt.InitiativeRoll\");\n rollOptions.characteristic = this.actor.system.config.initiative;\n isInitiative = true;\n } else if (rollType === \"characteristic\") {\n rollOptions.characteristic = target.dataset.rollCharacteristic;\n rollOptions.rollTypeName = game.i18n.localize(\"MGT2.RollPrompt.CharacteristicRoll\");\n rollOptions.rollObjectName = game.i18n.localize(`MGT2.Characteristics.${rollOptions.characteristic}.name`);\n } else {\n if (rollType === \"skill\") {\n rollOptions.skill = target.dataset.rollSkill;\n itemObj = this.actor.getEmbeddedDocument(\"Item\", rollOptions.skill);\n rollOptions.rollTypeName = game.i18n.localize(\"MGT2.RollPrompt.SkillRoll\");\n rollOptions.rollObjectName = itemObj.name;\n } else if (rollType === \"psionic\") {\n rollOptions.rollTypeName = game.i18n.localize(\"MGT2.RollPrompt.PsionicRoll\");\n }\n\n if (itemObj === null && target.dataset.itemId) {\n itemObj = this.actor.getEmbeddedDocument(\"Item\", target.dataset.itemId);\n rollOptions.rollObjectName = itemObj.name;\n if (itemObj.type === \"weapon\") rollOptions.rollTypeName = game.i18n.localize(\"TYPES.Item.weapon\");\n else if (itemObj.type === \"armor\") rollOptions.rollTypeName = game.i18n.localize(\"TYPES.Item.armor\");\n else if (itemObj.type === \"computer\") rollOptions.rollTypeName = game.i18n.localize(\"TYPES.Item.computer\");\n }\n\n if (rollType === \"psionic\" && itemObj) {\n rollOptions.rollObjectName = itemObj.name;\n if (MGT2Helper.hasValue(itemObj.system.psionic, \"duration\")) {\n cardButtons.push({\n label: game.i18n.localize(\"MGT2.Items.Duration\"),\n formula: itemObj.system.psionic.duration,\n message: {\n objectName: itemObj.name,\n flavor: \"{0} \".concat(game.i18n.localize(`MGT2.Durations.${itemObj.system.psionic.durationUnit}`)),\n },\n });\n }\n }\n\n if (itemObj?.system.hasOwnProperty(\"damage\")) {\n rollOptions.damageFormula = itemObj.system.damage;\n if (itemObj.type === \"disease\") {\n if (itemObj.system.subType === \"disease\")\n rollOptions.rollTypeName = game.i18n.localize(\"MGT2.DiseaseSubType.disease\");\n else if (itemObj.system.subType === \"poison\")\n rollOptions.rollTypeName = game.i18n.localize(\"MGT2.DiseaseSubType.poison\");\n }\n }\n\n if (itemObj?.system.hasOwnProperty(\"roll\")) {\n if (MGT2Helper.hasValue(itemObj.system.roll, \"characteristic\")) rollOptions.characteristic = itemObj.system.roll.characteristic;\n if (MGT2Helper.hasValue(itemObj.system.roll, \"skill\")) rollOptions.skill = itemObj.system.roll.skill;\n if (MGT2Helper.hasValue(itemObj.system.roll, \"difficulty\")) rollOptions.difficulty = itemObj.system.roll.difficulty;\n }\n }\n\n const userRollData = await RollPromptHelper.roll(rollOptions);\n\n const rollModifiers = [];\n const rollFormulaParts = [];\n\n if (userRollData.diceModifier) {\n rollFormulaParts.push(\"3d6\", userRollData.diceModifier);\n } else {\n rollFormulaParts.push(\"2d6\");\n }\n\n if (userRollData.characteristic) {\n const c = this.actor.system.characteristics[userRollData.characteristic];\n rollFormulaParts.push(MGT2Helper.getFormulaDM(c.dm));\n rollModifiers.push(game.i18n.localize(`MGT2.Characteristics.${userRollData.characteristic}.name`) + MGT2Helper.getDisplayDM(c.dm));\n }\n\n if (userRollData.skill) {\n if (userRollData.skill === \"NP\") {\n rollFormulaParts.push(\"-3\");\n rollModifiers.push(game.i18n.localize(\"MGT2.Items.NotProficient\"));\n } else {\n const skillObj = this.actor.getEmbeddedDocument(\"Item\", userRollData.skill);\n rollFormulaParts.push(MGT2Helper.getFormulaDM(skillObj.system.level));\n rollModifiers.push(skillObj.getRollDisplay());\n }\n }\n\n if (userRollData.psionic) {\n const psionicObj = this.actor.getEmbeddedDocument(\"Item\", userRollData.psionic);\n rollFormulaParts.push(MGT2Helper.getFormulaDM(psionicObj.system.level));\n rollModifiers.push(psionicObj.getRollDisplay());\n }\n\n if (userRollData.timeframes && userRollData.timeframes !== \"\" && userRollData.timeframes !== \"Normal\") {\n rollModifiers.push(game.i18n.localize(`MGT2.Timeframes.${userRollData.timeframes}`));\n rollFormulaParts.push(userRollData.timeframes === \"Slower\" ? \"+2\" : \"-2\");\n }\n\n if (userRollData.encumbrance === true) {\n rollFormulaParts.push(\"-2\");\n rollModifiers.push(game.i18n.localize(\"MGT2.Actor.Encumbrance\") + \" -2\");\n }\n\n if (userRollData.fatigue === true) {\n rollFormulaParts.push(\"-2\");\n rollModifiers.push(game.i18n.localize(\"MGT2.Actor.Fatigue\") + \" -2\");\n }\n\n if (userRollData.customDM) {\n const s = userRollData.customDM.trim();\n if (/^[0-9]/.test(s)) rollFormulaParts.push(\"+\");\n rollFormulaParts.push(s);\n }\n\n if (MGT2Helper.hasValue(userRollData, \"difficulty\")) rollOptions.difficulty = userRollData.difficulty;\n\n const rollFormula = rollFormulaParts.join(\"\");\n if (!Roll.validate(rollFormula)) {\n ui.notifications.error(game.i18n.localize(\"MGT2.Errors.InvalidRollFormula\"));\n return;\n }\n\n let roll = await new Roll(rollFormula, this.actor.getRollData()).roll({ async: true, rollMode: userRollData.rollMode });\n\n if (isInitiative && this.token?.combatant) {\n await this.token.combatant.update({ initiative: roll.total });\n }\n\n const chatData = {\n user: game.user.id,\n speaker: this.actor ? ChatMessage.getSpeaker({ actor: this.actor }) : null,\n formula: roll._formula,\n tooltip: await roll.getTooltip(),\n total: Math.round(roll.total * 100) / 100,\n type: CONST.CHAT_MESSAGE_TYPES.ROLL,\n showButtons: true,\n showLifeButtons: false,\n showRollRequest: false,\n rollTypeName: rollOptions.rollTypeName,\n rollObjectName: rollOptions.rollObjectName,\n rollModifiers: rollModifiers,\n showRollDamage: rollOptions.damageFormula !== null && rollOptions.damageFormula !== \"\",\n cardButtons: cardButtons,\n };\n\n if (MGT2Helper.hasValue(rollOptions, \"difficulty\")) {\n chatData.rollDifficulty = rollOptions.difficulty;\n chatData.rollDifficultyLabel = MGT2Helper.getDifficultyDisplay(rollOptions.difficulty);\n if (roll.total >= MGT2Helper.getDifficultyValue(rollOptions.difficulty))\n chatData.rollSuccess = true;\n else\n chatData.rollFailure = true;\n }\n\n const html = await renderTemplate(\"systems/mgt2/templates/chat/roll.html\", chatData);\n chatData.content = html;\n\n let flags = null;\n if (rollOptions.damageFormula) {\n flags = { mgt2: { damage: { formula: rollOptions.damageFormula, rollObjectName: rollOptions.rollObjectName, rollTypeName: rollOptions.rollTypeName } } };\n }\n if (cardButtons.length > 0) {\n if (!flags) flags = { mgt2: {} };\n flags.mgt2.buttons = cardButtons;\n }\n if (flags) chatData.flags = flags;\n\n return roll.toMessage(chatData);\n }\n\n static async #onOpenConfig(event) {\n event.preventDefault();\n const userConfig = await CharacterPrompts.openConfig(this.actor.system);\n if (userConfig) this.actor.update({ \"system.config\": userConfig });\n }\n\n static async #onOpenCharacteristic(event, target) {\n event.preventDefault();\n const name = target.dataset.cfgCharacteristic;\n const c = this.actor.system.characteristics[name];\n\n let showAll = false;\n for (const value of Object.values(this.actor.system.characteristics)) {\n if (!value.show) { showAll = true; break; }\n }\n\n const userConfig = await CharacterPrompts.openCharacteristic(\n game.i18n.localize(`MGT2.Characteristics.${name}.name`),\n c.show, c.showMax, showAll\n );\n\n if (userConfig) {\n const data = { system: { characteristics: {} } };\n data.system.characteristics[name] = { show: userConfig.show, showMax: userConfig.showMax };\n\n if (userConfig.showAll === true) {\n for (const [key, value] of Object.entries(this.actor.system.characteristics)) {\n if (key !== name && !value.show)\n data.system.characteristics[key] = { show: true };\n }\n }\n this.actor.update(data);\n }\n }\n\n static async #onTraitCreate(event) {\n event.preventDefault();\n let traits = this.actor.system.personal.traits;\n let newTraits;\n if (traits.length === 0) {\n newTraits = [{ name: \"\", description: \"\" }];\n } else {\n newTraits = [...traits, { name: \"\", description: \"\" }];\n }\n return this.actor.update({ system: { personal: { traits: newTraits } } });\n }\n\n static async #onTraitEdit(event, target) {\n event.preventDefault();\n const element = target.closest(\"[data-traits-part]\");\n const index = Number(element.dataset.traitsPart);\n const trait = this.actor.system.personal.traits[index];\n const result = await CharacterPrompts.openTraitEdit(trait);\n const traits = [...this.actor.system.personal.traits];\n traits[index] = { ...traits[index], name: result.name, description: result.description };\n return this.actor.update({ system: { personal: { traits: traits } } });\n }\n\n static async #onTraitDelete(event, target) {\n event.preventDefault();\n const element = target.closest(\"[data-traits-part]\");\n const index = Number(element.dataset.traitsPart);\n const traits = foundry.utils.deepClone(this.actor.system.personal.traits);\n const newTraits = Object.entries(traits)\n .filter(([key]) => Number(key) !== index)\n .map(([, value]) => value);\n return this.actor.update({ system: { personal: { traits: newTraits } } });\n }\n\n static async #onOpenEditor(event) {\n event.preventDefault();\n await CharacterPrompts.openEditorFullView(\n this.actor.system.personal.species,\n this.actor.system.personal.speciesText.descriptionLong\n );\n }\n}\n","import MGT2ActorSheet from \"./base-actor-sheet.mjs\";\n\nexport default class TravellerVehiculeSheet extends MGT2ActorSheet {\n\n /** @override */\n static DEFAULT_OPTIONS = {\n ...super.DEFAULT_OPTIONS,\n classes: [...super.DEFAULT_OPTIONS.classes, \"vehicule\", \"nopad\"],\n window: {\n ...super.DEFAULT_OPTIONS.window,\n title: \"TYPES.Actor.vehicule\",\n },\n }\n\n /** @override */\n static PARTS = {\n sheet: {\n template: \"systems/mgt2/templates/actors/vehicule-sheet.html\",\n },\n }\n\n /** @override */\n tabGroups = { primary: \"stats\" }\n}\n","const { HandlebarsApplicationMixin } = foundry.applications.api;\nimport { MGT2Helper } from \"../../helper.js\";\n\nexport default class TravellerItemSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2) {\n\n /** @override */\n static DEFAULT_OPTIONS = {\n classes: [\"mgt2\", \"sheet\", \"item\"],\n position: { width: 630 },\n form: {\n submitOnChange: true,\n closeOnSubmit: false,\n },\n window: { resizable: true },\n actions: {\n careerEventCreate: TravellerItemSheet.#onCareerEventCreate,\n careerEventDelete: TravellerItemSheet.#onCareerEventDelete,\n optionCreate: TravellerItemSheet.#onOptionCreate,\n optionDelete: TravellerItemSheet.#onOptionDelete,\n modifierCreate: TravellerItemSheet.#onModifierCreate,\n modifierDelete: TravellerItemSheet.#onModifierDelete,\n },\n }\n\n /** @override */\n static PARTS = {\n sheet: {\n // template is dynamic — resolved in _prepareContext / _renderHTML\n template: \"\",\n },\n }\n\n /** Resolve template dynamically based on item type */\n get template() {\n return `systems/mgt2/templates/items/${this.document.type}-sheet.html`;\n }\n\n tabGroups = { primary: \"tab1\" }\n\n /** @override */\n async _prepareContext() {\n const item = this.document;\n const source = item.toObject();\n\n const settings = {\n usePronouns: game.settings.get(\"mgt2\", \"usePronouns\"),\n };\n\n let containers = null;\n let computers = null;\n let hadContainer = false;\n\n if (item.actor !== null) {\n hadContainer = true;\n containers = [{ name: \"\", _id: \"\" }].concat(item.actor.getContainers());\n computers = [{ name: \"\", _id: \"\" }].concat(item.actor.getComputers());\n }\n\n let weight = null;\n if (item.system.hasOwnProperty(\"weight\")) {\n weight = MGT2Helper.convertWeightForDisplay(item.system.weight);\n }\n\n let skills = [];\n if (this.actor !== null) {\n for (let actorItem of this.actor.items) {\n if (actorItem.type === \"talent\" && actorItem.system.subType === \"skill\")\n skills.push({ _id: actorItem._id, name: actorItem.getRollDisplay() });\n }\n }\n skills.sort(MGT2Helper.compareByName);\n skills = [{ _id: \"NP\", name: game.i18n.localize(\"MGT2.Items.NotProficient\") }].concat(skills);\n\n return {\n item: item,\n document: item,\n cssClass: this.isEditable ? \"editable\" : \"locked\",\n system: item.system,\n source: source.system,\n fields: item.schema.fields,\n systemFields: item.system.schema.fields,\n isEditable: this.isEditable,\n isGM: game.user.isGM,\n config: CONFIG,\n settings: settings,\n containers: containers,\n computers: computers,\n hadContainer: hadContainer,\n weight: weight,\n unitlabels: { weight: MGT2Helper.getWeightLabel() },\n skills: skills,\n };\n }\n\n /** @override — resolve the per-type template before rendering */\n async _renderHTML(context, options) {\n const templatePath = `systems/mgt2/templates/items/${this.document.type}-sheet.html`;\n const html = await renderTemplate(templatePath, context);\n return { sheet: html };\n }\n\n /** @override — put rendered HTML into the window content */\n _replaceHTML(result, content, options) {\n content.innerHTML = result.sheet;\n this._activateTabGroups();\n this._bindItemEvents();\n }\n\n /** Bind CSS class-based events (templates not yet migrated to data-action) */\n _bindItemEvents() {\n const html = this.element;\n if (!this.isEditable) return;\n const bind = (sel, handler) => {\n for (const el of html.querySelectorAll(sel)) {\n el.addEventListener(\"click\", (ev) => handler.call(this, ev, ev.currentTarget));\n }\n };\n bind(\".event-create\", TravellerItemSheet.#onCareerEventCreate);\n bind(\".event-delete\", TravellerItemSheet.#onCareerEventDelete);\n bind(\".options-create\", TravellerItemSheet.#onOptionCreate);\n bind(\".options-delete\", TravellerItemSheet.#onOptionDelete);\n bind(\".modifiers-create\", TravellerItemSheet.#onModifierCreate);\n bind(\".modifiers-delete\", TravellerItemSheet.#onModifierDelete);\n }\n\n _activateTabGroups() {\n for (const [group, activeTab] of Object.entries(this.tabGroups)) {\n const nav = this.element.querySelector(`nav[data-group=\"${group}\"], .horizontal-tabs`);\n if (!nav) continue;\n\n nav.querySelectorAll('[data-tab]').forEach(link => {\n link.classList.toggle('active', link.dataset.tab === activeTab);\n link.addEventListener('click', event => {\n event.preventDefault();\n this.tabGroups[group] = link.dataset.tab;\n this.render();\n });\n });\n\n this.element.querySelectorAll(`.itemsheet-panel [data-tab], [data-group=\"${group}\"][data-tab]`).forEach(content => {\n content.classList.toggle('active', content.dataset.tab === activeTab);\n });\n }\n }\n\n /** @override — process form data before submit (weight/qty/cost conversions + container logic) */\n _prepareSubmitData(event, form, formData) {\n const data = foundry.utils.expandObject(formData.object);\n\n if (data.hasOwnProperty(\"weight\")) {\n data.system = data.system || {};\n data.system.weight = MGT2Helper.convertWeightFromInput(data.weight);\n delete data.weight;\n }\n\n if (data.system?.hasOwnProperty(\"quantity\")) {\n data.system.quantity = MGT2Helper.getIntegerFromInput(data.system.quantity);\n }\n\n if (data.system?.hasOwnProperty(\"cost\")) {\n data.system.cost = MGT2Helper.getIntegerFromInput(data.system.cost);\n }\n\n // Container/equipped logic\n if (data.system?.hasOwnProperty(\"container\") && this.document.system.hasOwnProperty(\"equipped\")) {\n const equippedChange = this.document.system.equipped !== data.system.equipped;\n const containerChange = this.document.system.container?.id !== data.system.container?.id;\n\n if (equippedChange && data.system.equipped === true) {\n data.system.container = { id: \"\" };\n } else if (containerChange && data.system.container?.id !== \"\" && this.document.system.container?.id === \"\") {\n data.system.equipped = false;\n }\n }\n\n return foundry.utils.flattenObject(data);\n }\n\n // =========================================================\n // Actions\n // =========================================================\n\n static async #onCareerEventCreate(event) {\n event.preventDefault();\n const events = this.document.system.events;\n let newEvents;\n if (!events || events.length === 0) {\n newEvents = [{ age: \"\", description: \"\" }];\n } else {\n newEvents = [...events, { age: \"\", description: \"\" }];\n }\n return this.document.update({ system: { events: newEvents } });\n }\n\n static async #onCareerEventDelete(event, target) {\n event.preventDefault();\n const element = target.closest(\"[data-events-part]\");\n const index = Number(element.dataset.eventsPart);\n const events = foundry.utils.deepClone(this.document.system.events);\n const newEvents = Object.entries(events)\n .filter(([key]) => Number(key) !== index)\n .map(([, val]) => val);\n return this.document.update({ system: { events: newEvents } });\n }\n\n static async #onOptionCreate(event, target) {\n event.preventDefault();\n const property = target.dataset.property;\n const options = this.document.system[property];\n let newOptions;\n if (!options || options.length === 0) {\n newOptions = [{ name: \"\", description: \"\" }];\n } else {\n newOptions = [...options, { name: \"\", description: \"\" }];\n }\n return this.document.update({ [`system.${property}`]: newOptions });\n }\n\n static async #onOptionDelete(event, target) {\n event.preventDefault();\n const element = target.closest(\"[data-options-part]\");\n const property = element.dataset.property;\n const index = Number(element.dataset.optionsPart);\n const options = foundry.utils.deepClone(this.document.system[property]);\n const newOptions = Object.entries(options)\n .filter(([key]) => Number(key) !== index)\n .map(([, val]) => val);\n return this.document.update({ [`system.${property}`]: newOptions });\n }\n\n static async #onModifierCreate(event) {\n event.preventDefault();\n const modifiers = this.document.system.modifiers;\n let newModifiers;\n if (!modifiers || modifiers.length === 0) {\n newModifiers = [{ characteristic: \"Endurance\", value: null }];\n } else {\n newModifiers = [...modifiers, { characteristic: \"Endurance\", value: null }];\n }\n return this.document.update({ system: { modifiers: newModifiers } });\n }\n\n static async #onModifierDelete(event, target) {\n event.preventDefault();\n const element = target.closest(\"[data-modifiers-part]\");\n const index = Number(element.dataset.modifiersPart);\n const modifiers = foundry.utils.deepClone(this.document.system.modifiers);\n const newModifiers = Object.entries(modifiers)\n .filter(([key]) => Number(key) !== index)\n .map(([, val]) => val);\n return this.document.update({ system: { modifiers: newModifiers } });\n }\n}\n","/**\n * Define a set of template paths to pre-load\n * Pre-loaded templates are compiled and cached for fast access when rendering\n * @return {Promise}\n */\nexport const preloadHandlebarsTemplates = async function() {\n\n const templatePaths = [\n \"systems/mgt2/templates/items/parts/sheet-configuration.html\",\n \"systems/mgt2/templates/items/parts/sheet-physical-item.html\",\n \"systems/mgt2/templates/roll-prompt.html\",\n \"systems/mgt2/templates/chat/roll.html\",\n //\"systems/mgt2/templates/chat/roll-characteristic.html\",\n \"systems/mgt2/templates/actors/actor-config-sheet.html\",\n \"systems/mgt2/templates/actors/actor-config-characteristic-sheet.html\",\n \"systems/mgt2/templates/actors/trait-sheet.html\",\n \"systems/mgt2/templates/editor-fullview.html\"\n //\"systems/mgt2/templates/actors/parts/actor-characteristic.html\"\n ];\n \n return loadTemplates(templatePaths);\n };","import { MGT2Helper } from \"./helper.js\";\n\nexport class ChatHelper {\n\n\n // _injectContent(message, type, html) {\n\n // _setupCardListeners(message, html);\n\n // }\n\n\n static setupCardListeners(message, html, messageData) {\n if (!message || !html) {\n return;\n }\n // if (SettingsUtility.getSettingValue(SETTING_NAMES.MANUAL_DAMAGE_MODE) > 0) {\n // html.find('.card-buttons').find(`[data-action='rsr-${ROLL_TYPE.DAMAGE}']`).click(async event => {\n // await _processDamageButtonEvent(message, event);\n // });\n // }\n html.find('button[data-action=\"rollDamage\"]').click(async event => {\n //ui.notifications.warn(\"rollDamage\");\n await this._processRollDamageButtonEvent(message, event);\n });\n\n html.find('button[data-action=\"damage\"]').click(async event => {\n //ui.notifications.warn(\"damage\");\n await this._applyChatCardDamage(message, event);\n //await _processApplyButtonEvent(message, event);\n });\n\n html.find('button[data-action=\"healing\"]').click(async event => {\n ui.notifications.warn(\"healing\");\n //await _processApplyTotalButtonEvent(message, event);\n });\n\n html.find('button[data-index]').click(async event => {\n \n await this._processRollButtonEvent(message, event);\n });\n }\n\n static async _processRollButtonEvent(message, event) {\n event.preventDefault();\n event.stopPropagation();\n let buttons = message.flags.mgt2.buttons;\n const index = event.target.dataset.index;\n const button = buttons[index];\n let roll = await new Roll(button.formula, {}).roll({ async: true });\n //console.log(message);\n\n const chatData = {\n user: game.user.id,\n speaker: message.speaker,\n formula: roll._formula,\n tooltip: await roll.getTooltip(),\n total: Math.round(roll.total * 100) / 100,\n //formula: isPrivate ? \"???\" : roll._formula,\n //tooltip: isPrivate ? \"\" : await roll.getTooltip(),\n //total: isPrivate ? \"?\" : Math.round(roll.total * 100) / 100,\n type: CONST.CHAT_MESSAGE_TYPES.ROLL,\n rollObjectName: button.message.objectName,\n rollMessage: MGT2Helper.format(button.message.flavor, Math.round(roll.total * 100) / 100),\n };\n\n const html = await renderTemplate(\"systems/mgt2/templates/chat/roll.html\", chatData);\n chatData.content = html;\n return roll.toMessage(chatData);\n }\n\n static async _processRollDamageButtonEvent(message, event) {\n event.preventDefault();\n event.stopPropagation();\n let rollFormula = message.flags.mgt2.damage.formula;\n\n let roll = await new Roll(rollFormula, {}).roll({ async: true });\n\n let speaker;\n let selectTokens = canvas.tokens.controlled;\n if (selectTokens.length > 0) {\n speaker = selectTokens[0].actor;\n } else {\n speaker = game.user.character;\n }\n\n let rollTypeName = message.flags.mgt2.damage.rollTypeName ? message.flags.mgt2.damage.rollTypeName + \" DAMAGE\" : null;\n\n const chatData = {\n user: game.user.id,\n speaker: ChatMessage.getSpeaker({ actor: speaker }),\n formula: roll._formula,\n tooltip: await roll.getTooltip(),\n total: Math.round(roll.total * 100) / 100,\n type: CONST.CHAT_MESSAGE_TYPES.ROLL,\n showButtons: true,\n hasDamage: true,\n rollTypeName: rollTypeName,\n rollObjectName: message.flags.mgt2.damage.rollObjectName\n };\n\n const html = await renderTemplate(\"systems/mgt2/templates/chat/roll.html\", chatData);\n chatData.content = html;\n\n return roll.toMessage(chatData);\n }\n\n async _processDamageButtonEvent(message, event) {\n event.preventDefault();\n event.stopPropagation();\n\n //message.flags[MODULE_SHORT].manualDamage = false\n //message.flags[MODULE_SHORT].renderDamage = true; \n // current user/actor\n\n await ItemUtility.runItemAction(null, message, ROLL_TYPE.DAMAGE);\n }\n\n static _applyChatCardDamage(message, event) {\n const roll = message.rolls[0];\n return Promise.all(canvas.tokens.controlled.map(t => {\n const a = t.actor;\n return a.applyDamage(roll.total);\n }));\n }\n}","export const registerSettings = function () {\n\n game.settings.register(\"mgt2\", \"theme\", {\n name: \"MGT2.Settings.theme.name\",\n hint: \"MGT2.Settings.theme.hint\",\n scope: \"client\",\n config: true,\n default: \"black-and-red\",\n type: String,\n choices: {\n \"black-and-red\": \"MGT2.Themes.BlackAndRed\",\n \"mwamba\": \"MGT2.Themes.Mwamba\",\n \"blue\": \"MGT2.Themes.Blue\"\n },\n requiresReload: true\n });\n\n game.settings.register('mgt2', 'usePronouns', {\n name: \"MGT2.Settings.usePronouns.name\",\n hint: \"MGT2.Settings.usePronouns.hint\",\n default: false,\n scope: 'world',\n type: Boolean,\n config: true,\n requiresReload: false\n });\n\n game.settings.register('mgt2', 'useGender', {\n name: \"MGT2.Settings.useGender.name\",\n hint: \"MGT2.Settings.useGender.hint\",\n default: false,\n scope: 'world',\n type: Boolean,\n config: true,\n requiresReload: false\n });\n\n game.settings.register('mgt2', 'showLife', {\n name: \"MGT2.Settings.showLife.name\",\n hint: \"MGT2.Settings.showLife.hint\",\n default: false,\n scope: 'world',\n type: Boolean,\n config: true,\n requiresReload: false\n });\n\n // game.settings.register('mgt2', 'useWeightMetric', {\n // name: \"MGT2.Settings.useWeightMetric.name\",\n // hint: \"MGT2.Settings.useWeightMetric.hint\",\n // default: true,\n // scope: 'world',\n // type: Boolean,\n // config: true,\n // requiresReload: true\n // });\n\n // game.settings.register('mgt2', 'useDistanceMetric', {\n // name: \"MGT2.Settings.useDistanceMetric.name\",\n // hint: \"MGT2.Settings.useDistanceMetric.hint\",\n // default: true,\n // scope: 'world',\n // type: Boolean,\n // config: true,\n // requiresReload: true\n // });\n\n // game.settings.register('mgt2', 'showTrash', {\n // name: \"Show Trash tab to Player\",\n // hint: \"Player can see the Trash tab and recover item\",\n // default: false,\n // scope: 'world',\n // type: Boolean,\n // config: true,\n // requiresReload: false\n // });\n\n /*game.settings.register('mgt2', 'containerDropIn', {\n name: \"Test\",\n hint: \"Mon hint\",\n default: true,\n scope: 'client',\n type: Boolean,\n config: true\n });*/\n};\n","import {\n CharacterData,\n VehiculeData,\n ItemData,\n EquipmentData,\n DiseaseData,\n CareerData,\n TalentData,\n ContactData,\n ArmorData,\n ComputerData,\n WeaponData,\n ItemContainerData,\n SpeciesData\n} from \"./models/index.mjs\";\n\nimport { MGT2 } from \"./config.js\";\nimport { TravellerActor, MGT2Combatant } from \"./actors/actor.js\";\nimport { TravellerItem } from \"./item.js\";\nimport { TravellerItemSheet, TravellerCharacterSheet, TravellerVehiculeSheet } from \"./applications/sheets/_module.mjs\";\nimport { preloadHandlebarsTemplates } from \"./templates.js\";\n//import { MGT2Helper } from \"./helper.js\";\nimport {ChatHelper} from \"./chatHelper.js\";\n\n/* -------------------------------------------- */\n/* Foundry VTT Initialization */\n/* -------------------------------------------- */\nimport { registerSettings } from \"./settings.js\";\n\nfunction registerHandlebarsHelpers() {\n Handlebars.registerHelper('showDM', function (dm) {\n if (dm === 0) return \"0\";\n if (dm > 0) return `+${dm}`;\n if (dm < 0) return `${dm}`;\n return \"\";\n });\n}\n\nHooks.once(\"init\", async function () {\n CONFIG.MGT2 = MGT2;\n CONFIG.Combat.initiative = {\n formula: \"2d6 + @initiative\",\n decimals: 2\n };\n\n CONFIG.Actor.trackableAttributes = {\n character: {\n bar: [\"life\",\n \"characteristics.strength\",\n \"characteristics.dexterity\",\n \"characteristics.endurance\",\n \"characteristics.intellect\",\n \"characteristics.education\",\n \"characteristics.social\",\n \"characteristics.morale\",\n \"characteristics.luck\",\n \"characteristics.sanity\",\n \"characteristics.charm\",\n \"characteristics.psionic\",\n \"characteristics.other\"\n ],\n value: [\"life.value\",\n \"health.radiations\",\n \"characteristics.strength.value\",\n \"characteristics.dexterity.value\",\n \"characteristics.endurance.value\",\n \"characteristics.intellect.value\",\n \"characteristics.education.value\",\n \"characteristics.social.value\",\n \"characteristics.morale.value\",\n \"characteristics.luck.value\",\n \"characteristics.sanity.value\",\n \"characteristics.charm.value\",\n \"characteristics.psionic.value\",\n \"characteristics.other.value\"]\n }\n };\n\n game.mgt2 = {\n TravellerActor,\n TravellerItem\n };\n\n registerHandlebarsHelpers();\n registerSettings();\n\n CONFIG.Combatant.documentClass = MGT2Combatant;\n CONFIG.Actor.documentClass = TravellerActor;\n CONFIG.Item.documentClass = TravellerItem;\n\n foundry.documents.collections.Actors.unregisterSheet(\"core\", foundry.appv1.sheets.ActorSheet);\n foundry.documents.collections.Actors.registerSheet(\"mgt2\", TravellerCharacterSheet, { types: [\"character\"], makeDefault: true, label: \"Traveller Sheet\" });\n foundry.documents.collections.Actors.registerSheet(\"mgt2\", TravellerVehiculeSheet, { types: [\"vehicule\"], makeDefault: true, label: \"Vehicule Sheet\" });\n\n foundry.documents.collections.Items.unregisterSheet(\"core\", foundry.appv1.sheets.ItemSheet);\n foundry.documents.collections.Items.registerSheet(\"mgt2\", TravellerItemSheet, { makeDefault: true });\n\n Object.assign(CONFIG.Actor.dataModels, {\n \"character\": CharacterData,\n \"vehicule\": VehiculeData\n });\n\n Object.assign(CONFIG.Item.dataModels, {\n \"item\": ItemData,\n \"equipment\": EquipmentData,\n \"disease\": DiseaseData,\n \"career\": CareerData,\n \"talent\": TalentData,\n \"contact\": ContactData,\n \"weapon\": WeaponData,\n \"computer\": ComputerData,\n \"armor\": ArmorData,\n \"container\": ItemContainerData,\n \"species\": SpeciesData\n });\n\n\n Hooks.on(\"renderChatMessage\", (message, html, messageData) => {\n ChatHelper.setupCardListeners(message, html, messageData);\n });\n\n // Preload template partials\n await preloadHandlebarsTemplates();\n});\n\nexport { MGT2 };"],"names":["fields","HandlebarsApplicationMixin"],"mappings":"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"}
\ No newline at end of file
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..fc87e57
--- /dev/null
+++ b/package.json
@@ -0,0 +1,8 @@
+{
+ "name": "foundryvtt-mgt2",
+ "description": "Mongoose Traveller 2nd Edition for FoundryVTT",
+ "scripts": {
+ "build": "rollup -c rollup.config.mjs",
+ "watch": "rollup -c rollup.config.mjs --watch"
+ }
+}
diff --git a/rollup.config.mjs b/rollup.config.mjs
new file mode 100644
index 0000000..e92eec9
--- /dev/null
+++ b/rollup.config.mjs
@@ -0,0 +1,8 @@
+export default {
+ input: 'src/module/core.js',
+ output: {
+ file: 'mgt2.bundle.js',
+ format: 'es',
+ sourcemap: true,
+ },
+};
diff --git a/src/module/actors/actor.js b/src/module/actors/actor.js
index 76e1be9..ea4eaf6 100644
--- a/src/module/actors/actor.js
+++ b/src/module/actors/actor.js
@@ -82,6 +82,10 @@ export class TravellerActor extends Actor {
return [];
}
-
+ async recalculateWeight() {
+ if (this.type === "character") {
+ return ActorCharacter.recalculateWeight(this);
+ }
+ }
}
diff --git a/src/module/actors/character.js b/src/module/actors/character.js
index b96595d..a558686 100644
--- a/src/module/actors/character.js
+++ b/src/module/actors/character.js
@@ -27,7 +27,7 @@ export class ActorCharacter {
// Eject software
for (let item of $this.items) {
if (item.system.hasOwnProperty("software") && item.system.computerId === d._id) {
- let clone = duplicate(item);
+ let clone = foundry.utils.deepClone(item);
clone.system.software.computerId = "";
itemToUpdates.push(clone);
}
@@ -41,7 +41,7 @@ export class ActorCharacter {
if (itemToUpdates.length > 0)
await $this.updateEmbeddedDocuments('Item', itemToUpdates);
- await this.recalculateWeight();
+ await this.recalculateWeight($this);
}
static async onUpdateDescendantDocuments($this, parent, collection, documents, changes, options, userId) {
@@ -90,7 +90,7 @@ export class ActorCharacter {
for (let computer of computers) {
let newProcessingUsed = computerChanges[computer._id].processingUsed;
if (computer.system.processingUsed !== newProcessingUsed) {
- const cloneComputer = duplicate($this.getEmbeddedDocument("Item", computer._id));
+ const cloneComputer = foundry.utils.deepClone($this.getEmbeddedDocument("Item", computer._id));
cloneComputer.system.processingUsed = newProcessingUsed;
cloneComputer.system.overload = cloneComputer.system.processingUsed > cloneComputer.system.processing;
updatedComputers.push(cloneComputer);
@@ -138,7 +138,7 @@ export class ActorCharacter {
}
if (recalculEncumbrance || recalculWeight) {
- const cloneActor = duplicate($this);
+ const cloneActor = foundry.utils.deepClone($this);
await this.recalculateArmor($this, cloneActor);
@@ -163,7 +163,7 @@ export class ActorCharacter {
static async recalculateArmor($this, cloneActor) {
if (cloneActor === null || cloneActor === undefined)
- cloneActor = duplicate($this);
+ cloneActor = foundry.utils.deepClone($this);
let armor = 0;
for (let item of $this.items) {
@@ -180,7 +180,7 @@ export class ActorCharacter {
static async recalculateWeight($this, cloneActor) {
if (cloneActor === null || cloneActor === undefined)
- cloneActor = duplicate($this);
+ cloneActor = foundry.utils.deepClone($this);
let updatedContainers = [];
let containerChanges = {};
@@ -241,8 +241,8 @@ export class ActorCharacter {
let newWeight = containerChanges[container._id].weight;
let newCount = containerChanges[container._id].count;
if (container.system.weight !== newWeight || container.system.count !== newCount) {
- //const cloneContainer = duplicate();
- const cloneContainer = duplicate($this.getEmbeddedDocument("Item", container._id));
+ //const cloneContainer = foundry.utils.deepClone();
+ const cloneContainer = foundry.utils.deepClone($this.getEmbeddedDocument("Item", container._id));
//foundry.utils.setProperty(cloneContainer, "system.weight", newWeight);
cloneContainer.system.weight = newWeight;
cloneContainer.system.count = newCount;
diff --git a/src/module/applications/sheets/_module.mjs b/src/module/applications/sheets/_module.mjs
new file mode 100644
index 0000000..0b4a0f4
--- /dev/null
+++ b/src/module/applications/sheets/_module.mjs
@@ -0,0 +1,4 @@
+export { default as MGT2ActorSheet } from "./base-actor-sheet.mjs";
+export { default as TravellerCharacterSheet } from "./character-sheet.mjs";
+export { default as TravellerVehiculeSheet } from "./vehicule-sheet.mjs";
+export { default as TravellerItemSheet } from "./item-sheet.mjs";
diff --git a/src/module/applications/sheets/base-actor-sheet.mjs b/src/module/applications/sheets/base-actor-sheet.mjs
new file mode 100644
index 0000000..658ccc7
--- /dev/null
+++ b/src/module/applications/sheets/base-actor-sheet.mjs
@@ -0,0 +1,104 @@
+const { HandlebarsApplicationMixin } = foundry.applications.api;
+
+export default class MGT2ActorSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ActorSheetV2) {
+
+ static SHEET_MODES = { EDIT: 0, PLAY: 1 }
+
+ constructor(options = {}) {
+ super(options);
+ this._sheetMode = this.constructor.SHEET_MODES.PLAY;
+ }
+
+ /** @override */
+ static DEFAULT_OPTIONS = {
+ classes: ["mgt2", "sheet", "actor"],
+ position: {
+ width: 780,
+ },
+ form: {
+ submitOnChange: true,
+ closeOnSubmit: false,
+ },
+ window: {
+ resizable: true,
+ },
+ dragDrop: [{ dragSelector: ".drag-item-list", dropSelector: ".drop-item-list" }],
+ actions: {
+ toggleSheet: MGT2ActorSheet.#onToggleSheet,
+ },
+ }
+
+ get isPlayMode() {
+ if (this._sheetMode === undefined) this._sheetMode = this.constructor.SHEET_MODES.PLAY;
+ return this._sheetMode === this.constructor.SHEET_MODES.PLAY;
+ }
+
+ get isEditMode() {
+ if (this._sheetMode === undefined) this._sheetMode = this.constructor.SHEET_MODES.PLAY;
+ return this._sheetMode === this.constructor.SHEET_MODES.EDIT;
+ }
+
+ tabGroups = { primary: "stats" }
+
+ /** @override */
+ async _prepareContext() {
+ const base = await super._prepareContext();
+ const actor = this.document;
+ return {
+ ...base,
+ actor: actor,
+ // Flat shorthands for template backward-compat (AppV1 style)
+ name: actor.name,
+ img: actor.img,
+ cssClass: this.isEditable ? "editable" : "locked",
+ system: actor.system,
+ source: actor.toObject(),
+ fields: actor.schema.fields,
+ systemFields: actor.system.schema.fields,
+ isEditable: this.isEditable,
+ isEditMode: this.isEditMode,
+ isPlayMode: this.isPlayMode,
+ isGM: game.user.isGM,
+ config: CONFIG.MGT2,
+ };
+ }
+
+ /** @override */
+ _onRender(context, options) {
+ super._onRender(context, options);
+ this._activateTabGroups();
+ }
+
+ _activateTabGroups() {
+ for (const [group, activeTab] of Object.entries(this.tabGroups)) {
+ const nav = this.element.querySelector(`nav[data-group="${group}"]`);
+ if (!nav) continue;
+
+ nav.querySelectorAll('[data-tab]').forEach(link => {
+ link.classList.toggle('active', link.dataset.tab === activeTab);
+ link.addEventListener('click', event => {
+ event.preventDefault();
+ this.tabGroups[group] = link.dataset.tab;
+ this.render();
+ });
+ });
+
+ this.element.querySelectorAll(`[data-group="${group}"][data-tab]`).forEach(content => {
+ content.classList.toggle('active', content.dataset.tab === activeTab);
+ });
+ }
+ }
+
+ /** @override */
+ _canDragDrop(selector) {
+ return this.isEditable;
+ }
+
+ static async #onToggleSheet(event) {
+ event.preventDefault();
+ this._sheetMode = this.isPlayMode
+ ? this.constructor.SHEET_MODES.EDIT
+ : this.constructor.SHEET_MODES.PLAY;
+ this.render();
+ }
+}
diff --git a/src/module/applications/sheets/character-sheet.mjs b/src/module/applications/sheets/character-sheet.mjs
new file mode 100644
index 0000000..8fb5a4a
--- /dev/null
+++ b/src/module/applications/sheets/character-sheet.mjs
@@ -0,0 +1,848 @@
+import MGT2ActorSheet from "./base-actor-sheet.mjs";
+import { MGT2 } from "../../config.js";
+import { MGT2Helper } from "../../helper.js";
+import { RollPromptHelper } from "../../roll-prompt.js";
+import { CharacterPrompts } from "../../actors/character-prompts.js";
+
+export default class TravellerCharacterSheet extends MGT2ActorSheet {
+
+ /** @override */
+ static DEFAULT_OPTIONS = {
+ ...super.DEFAULT_OPTIONS,
+ classes: [...super.DEFAULT_OPTIONS.classes, "character", "nopad"],
+ window: {
+ ...super.DEFAULT_OPTIONS.window,
+ title: "TYPES.Actor.character",
+ },
+ actions: {
+ ...super.DEFAULT_OPTIONS.actions,
+ createItem: TravellerCharacterSheet.#onCreateItem,
+ editItem: TravellerCharacterSheet.#onEditItem,
+ deleteItem: TravellerCharacterSheet.#onDeleteItem,
+ equipItem: TravellerCharacterSheet.#onEquipItem,
+ itemStorageIn: TravellerCharacterSheet.#onItemStorageIn,
+ itemStorageOut: TravellerCharacterSheet.#onItemStorageOut,
+ softwareEject: TravellerCharacterSheet.#onSoftwareEject,
+ createContainer: TravellerCharacterSheet.#onContainerCreate,
+ editContainer: TravellerCharacterSheet.#onContainerEdit,
+ deleteContainer: TravellerCharacterSheet.#onContainerDelete,
+ roll: TravellerCharacterSheet.#onRoll,
+ openConfig: TravellerCharacterSheet.#onOpenConfig,
+ openCharacteristic: TravellerCharacterSheet.#onOpenCharacteristic,
+ traitCreate: TravellerCharacterSheet.#onTraitCreate,
+ traitEdit: TravellerCharacterSheet.#onTraitEdit,
+ traitDelete: TravellerCharacterSheet.#onTraitDelete,
+ openEditor: TravellerCharacterSheet.#onOpenEditor,
+ },
+ }
+
+ /** @override */
+ static PARTS = {
+ sheet: {
+ template: "systems/mgt2/templates/actors/actor-sheet.html",
+ },
+ }
+
+ /** @override */
+ tabGroups = {
+ primary: "inventory",
+ characteristics: "core",
+ inventory: "onhand",
+ }
+
+ /** @override */
+ async _prepareContext() {
+ const context = await super._prepareContext();
+ const actor = this.document;
+
+ context.settings = {
+ weightUnit: "kg",
+ usePronouns: game.settings.get("mgt2", "usePronouns"),
+ useGender: game.settings.get("mgt2", "useGender"),
+ showLife: game.settings.get("mgt2", "showLife"),
+ };
+ context.isGM = game.user.isGM;
+ context.showTrash = false;
+ context.initiative = actor.getInitiative();
+
+ this._prepareCharacterItems(context);
+
+ return context;
+ }
+
+ _prepareCharacterItems(context) {
+ const actor = this.document;
+ const settings = context.settings;
+ const items = actor.items;
+
+ const weapons = [], armors = [], augments = [], computers = [], softwares = [];
+ const miscItems = [], equipments = [], containerItems = [], careers = [];
+ const skills = [], psionics = [], diseases = [], wounds = [], contacts = [];
+ const actorContainers = [];
+
+ for (let i of items) {
+ if (i.type === "container") {
+ actorContainers.push(i);
+ } else if (i.type === "computer") {
+ computers.push(i);
+ i._subItems = [];
+ if (i.system.overload === true)
+ i._overloadClass = "computer-overload";
+ }
+ }
+
+ actorContainers.sort(MGT2Helper.compareByName);
+
+ const containers = [{ name: "(tous)", _id: "" }].concat(actorContainers);
+ const containerIndex = new Map();
+
+ for (let c of actorContainers) {
+ containerIndex.set(c._id, c);
+
+ if (c.system.weight > 0) {
+ const w = MGT2Helper.convertWeightForDisplay(c.system.weight) + " " + settings.weightUnit;
+ c._display = c.name.length > 12 ? `${c.name.substring(0, 12)}... (${w})` : `${c.name} (${w})`;
+ } else {
+ c._display = c.name.length > 12 ? c.name.substring(0, 12) + "..." : c.name;
+ }
+
+ if (c.system.onHand === true)
+ c._subItems = [];
+ }
+
+ const containerView = actor.system.containerView;
+ let currentContainerView = containerView !== "" ? containerIndex.get(containerView) : null;
+
+ context.containerView = currentContainerView || null;
+ context.containerWeight = currentContainerView
+ ? MGT2Helper.convertWeightForDisplay(currentContainerView.system.weight)
+ : MGT2Helper.convertWeightForDisplay(0);
+ context.containerShowAll = containerView === "";
+
+ for (let i of items) {
+ const item = i.system;
+
+ if (item.hasOwnProperty("weight") && item.weight > 0) {
+ i._weight = isNaN(item.quantity)
+ ? MGT2Helper.convertWeightForDisplay(item.weight) + " " + settings.weightUnit
+ : MGT2Helper.convertWeightForDisplay(item.weight * item.quantity) + " " + settings.weightUnit;
+ }
+
+ if (item.hasOwnProperty("container") && item.container.id !== "" && item.container.id !== undefined) {
+ const container = containerIndex.get(item.container.id);
+ if (container === undefined) {
+ if (context.containerShowAll) {
+ i._containerName = "#deleted#";
+ containerItems.push(i);
+ }
+ continue;
+ }
+
+ if (container.system.locked && !game.user.isGM) continue;
+
+ if (container.system.onHand === true)
+ container._subItems.push(i);
+
+ if (context.containerShowAll || actor.system.containerView === item.container.id) {
+ i._containerName = container.name;
+ containerItems.push(i);
+ }
+ continue;
+ }
+
+ if (item.hasOwnProperty("equipped")) {
+ i._canEquip = true;
+ i._toggleClass = item.equipped ? "active" : "";
+ } else {
+ i._canEquip = false;
+ }
+
+ switch (i.type) {
+ case "equipment":
+ (i.system.subType === "augment" ? augments : equipments).push(i);
+ break;
+
+ case "armor":
+ if (i.system.options?.length > 0)
+ i._subInfo = i.system.options.map(x => x.name).join(", ");
+ armors.push(i);
+ break;
+
+ case "computer":
+ if (i.system.options?.length > 0)
+ i._subInfo = i.system.options.map(x => x.name).join(", ");
+ break;
+
+ case "item":
+ if (i.system.subType === "software") {
+ if (i.system.software.computerId && i.system.software.computerId !== "") {
+ const computer = computers.find(x => x._id === i.system.software.computerId);
+ if (computer !== undefined) computer._subItems.push(i);
+ else softwares.push(i);
+ } else {
+ i._display = i.system.software.bandwidth > 0
+ ? `${i.name} (${i.system.software.bandwidth})`
+ : i.name;
+ softwares.push(i);
+ }
+ } else {
+ miscItems.push(i);
+ }
+ break;
+
+ case "weapon":
+ i._range = i.system.range.isMelee
+ ? game.i18n.localize("MGT2.Melee")
+ : MGT2Helper.getRangeDisplay(i.system.range);
+ if (i.system.traits?.length > 0)
+ i._subInfo = i.system.traits.map(x => x.name).join(", ");
+ weapons.push(i);
+ break;
+
+ case "career":
+ careers.push(i);
+ break;
+
+ case "contact":
+ contacts.push(i);
+ break;
+
+ case "disease":
+ (i.system.subType === "wound" ? wounds : diseases).push(i);
+ break;
+
+ case "talent":
+ if (i.system.subType === "skill") {
+ skills.push(i);
+ } else {
+ if (MGT2Helper.hasValue(i.system.psionic, "reach"))
+ i._reach = game.i18n.localize(`MGT2.PsionicReach.${i.system.psionic.reach}`);
+ if (MGT2Helper.hasValue(i.system.roll, "difficulty"))
+ i._difficulty = game.i18n.localize(`MGT2.Difficulty.${i.system.roll.difficulty}`);
+ psionics.push(i);
+ }
+ break;
+
+ case "container":
+ if (i.system.onHand === true)
+ miscItems.push(i);
+ break;
+ }
+ }
+
+ const byName = MGT2Helper.compareByName;
+ const byEquipName = (a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase());
+
+ context.encumbranceNormal = MGT2Helper.convertWeightForDisplay(actor.system.inventory.encumbrance.normal);
+ context.encumbranceHeavy = MGT2Helper.convertWeightForDisplay(actor.system.inventory.encumbrance.heavy);
+
+ const totalWeight = actor.system.inventory.weight;
+ if (totalWeight > actor.system.inventory.encumbrance.heavy) {
+ context.encumbranceClasses = "encumbrance-heavy";
+ context.encumbrance = 2;
+ } else if (totalWeight > actor.system.inventory.encumbrance.normal) {
+ context.encumbranceClasses = "encumbrance-normal";
+ context.encumbrance = 1;
+ } else {
+ context.encumbrance = 0;
+ }
+
+ if (softwares.length > 0) { softwares.sort(byName); context.softwares = softwares; }
+ augments.sort(byEquipName); context.augments = augments;
+ armors.sort(byEquipName); context.armors = armors;
+ computers.sort(byEquipName); context.computers = computers;
+ context.careers = careers;
+ contacts.sort(byName); context.contacts = contacts;
+ containers.sort(byName); context.containers = containers;
+ diseases.sort(byName); context.diseases = diseases;
+ context.wounds = wounds;
+ equipments.sort(byEquipName); context.equipments = equipments;
+ miscItems.sort(byEquipName); context.items = miscItems;
+ actorContainers.sort(byName); context.actorContainers = actorContainers;
+ skills.sort(byName); context.skills = skills;
+ psionics.sort(byName); context.psionics = psionics;
+ weapons.sort(byEquipName); context.weapons = weapons;
+
+ if (containerItems.length > 0) {
+ containerItems.sort((a, b) => {
+ const r = a._containerName.localeCompare(b._containerName);
+ return r !== 0 ? r : a.name.toLowerCase().localeCompare(b.name.toLowerCase());
+ });
+ }
+ context.containerItems = containerItems;
+ }
+
+ // =========================================================
+ // Event Binding (AppV2 _onRender — replaces jQuery activateListeners)
+ // Templates still use CSS class selectors, so we bind manually here.
+ // =========================================================
+
+ /** @override */
+ _onRender(context, options) {
+ super._onRender(context, options);
+ const html = this.element;
+ if (!this.isEditable) return;
+
+ this._bindClassEvent(html, ".roll", "click", TravellerCharacterSheet.#onRoll);
+ this._bindClassEvent(html, ".cfg-characteristic", "click", TravellerCharacterSheet.#onOpenCharacteristic);
+ this._bindClassEvent(html, ".item-create", "click", TravellerCharacterSheet.#onCreateItem);
+ this._bindClassEvent(html, ".item-edit", "click", TravellerCharacterSheet.#onEditItem);
+ this._bindClassEvent(html, ".item-delete", "click", TravellerCharacterSheet.#onDeleteItem);
+ this._bindClassEvent(html, ".item-equip", "click", TravellerCharacterSheet.#onEquipItem);
+ this._bindClassEvent(html, ".item-storage-in", "click", TravellerCharacterSheet.#onItemStorageIn);
+ this._bindClassEvent(html, ".item-storage-out", "click", TravellerCharacterSheet.#onItemStorageOut);
+ this._bindClassEvent(html, ".software-eject", "click", TravellerCharacterSheet.#onSoftwareEject);
+ this._bindClassEvent(html, ".container-create", "click", TravellerCharacterSheet.#onContainerCreate);
+ this._bindClassEvent(html, ".container-edit", "click", TravellerCharacterSheet.#onContainerEdit);
+ this._bindClassEvent(html, ".container-delete", "click", TravellerCharacterSheet.#onContainerDelete);
+ this._bindClassEvent(html, ".traits-create", "click", TravellerCharacterSheet.#onTraitCreate);
+ this._bindClassEvent(html, ".traits-edit", "click", TravellerCharacterSheet.#onTraitEdit);
+ this._bindClassEvent(html, ".traits-delete", "click", TravellerCharacterSheet.#onTraitDelete);
+ this._bindClassEvent(html, "[data-editor='open']", "click", TravellerCharacterSheet.#onOpenEditor);
+ html.querySelector("[name='config']")?.addEventListener("click", (ev) => TravellerCharacterSheet.#onOpenConfig.call(this, ev, ev.currentTarget));
+ }
+
+ /** Helper: bind a handler to all matching elements, with `this` set to the sheet instance */
+ _bindClassEvent(html, selector, event, handler) {
+ for (const el of html.querySelectorAll(selector)) {
+ el.addEventListener(event, (ev) => handler.call(this, ev, ev.currentTarget));
+ }
+ }
+
+ // =========================================================
+ // Drag & Drop
+ // =========================================================
+
+ /** @override */
+ async _onDrop(event) {
+ event.preventDefault();
+ event.stopImmediatePropagation();
+ const dropData = MGT2Helper.getDataFromDropEvent(event);
+ if (!dropData) return false;
+
+ const sourceItemData = await MGT2Helper.getItemDataFromDropData(dropData);
+
+ if (sourceItemData.type === "species") {
+ const update = {
+ system: {
+ personal: {
+ species: sourceItemData.name,
+ speciesText: {
+ description: sourceItemData.system.description,
+ descriptionLong: sourceItemData.system.descriptionLong,
+ },
+ },
+ },
+ };
+ update.system.personal.traits = this.actor.system.personal.traits.concat(sourceItemData.system.traits);
+
+ if (sourceItemData.system.modifiers?.length > 0) {
+ update.system.characteristics = {};
+ for (let modifier of sourceItemData.system.modifiers) {
+ if (MGT2Helper.hasValue(modifier, "characteristic") && MGT2Helper.hasValue(modifier, "value")) {
+ const c = this.actor.system.characteristics[modifier.characteristic];
+ const updateValue = { value: c.value + modifier.value };
+ if (c.showMax) updateValue.max = c.max + modifier.value;
+ update.system.characteristics[modifier.characteristic] = updateValue;
+ }
+ }
+ }
+
+ this.actor.update(update);
+ return true;
+ }
+
+ if (["contact", "disease", "career", "talent"].includes(sourceItemData.type)) {
+ let transferData = {};
+ try { transferData = sourceItemData.toJSON(); } catch (e) { transferData = sourceItemData; }
+ delete transferData._id;
+ delete transferData.id;
+ await this.actor.createEmbeddedDocuments("Item", [transferData]);
+ return true;
+ }
+
+ if (!["armor", "weapon", "computer", "container", "item", "equipment"].includes(sourceItemData.type)) return false;
+
+ const target = event.target.closest(".table-row");
+ let targetId = null;
+ let targetItem = null;
+ if (target !== null) {
+ targetId = target.dataset.itemId;
+ targetItem = this.actor.getEmbeddedDocument("Item", targetId);
+ }
+
+ let sourceItem = this.actor.getEmbeddedDocument("Item", sourceItemData.id);
+ if (sourceItem) {
+ if (!targetItem) return false;
+ sourceItem = foundry.utils.deepClone(sourceItem);
+ if (sourceItem._id === targetId) return false;
+
+ if (targetItem.type === "item" || targetItem.type === "equipment") {
+ if (targetItem.system.subType === "software")
+ sourceItem.system.software.computerId = targetItem.system.software.computerId;
+ else
+ sourceItem.system.container.id = targetItem.system.container.id;
+ this.actor.updateEmbeddedDocuments("Item", [sourceItem]);
+ return true;
+ } else if (targetItem.type === "computer") {
+ sourceItem.system.software.computerId = targetId;
+ this.actor.updateEmbeddedDocuments("Item", [sourceItem]);
+ return true;
+ } else if (targetItem.type === "container") {
+ if (targetItem.system.locked && !game.user.isGM) {
+ ui.notifications.error("Verrouillé");
+ } else {
+ sourceItem.system.container.id = targetId;
+ this.actor.updateEmbeddedDocuments("Item", [sourceItem]);
+ return true;
+ }
+ }
+ } else {
+ let transferData = {};
+ try { transferData = sourceItemData.toJSON(); } catch (e) { transferData = sourceItemData; }
+ delete transferData._id;
+ delete transferData.id;
+
+ const recalcWeight = transferData.system.hasOwnProperty("weight");
+
+ if (transferData.system.hasOwnProperty("container")) transferData.system.container.id = "";
+ if (transferData.type === "item" && transferData.system.subType === "software") transferData.system.software.computerId = "";
+ if (transferData.type === "container") transferData.system.onHand = true;
+ if (transferData.system.hasOwnProperty("equipment")) transferData.system.equipped = false;
+
+ if (targetItem !== null) {
+ if (transferData.type === "item" && transferData.system.subType === "software") {
+ if (targetItem.type === "item" && targetItem.system.subType === "software")
+ transferData.system.software.computerId = targetItem.system.software.computerId;
+ else if (targetItem.type === "computer")
+ transferData.system.software.computerId = targetItem._id;
+ } else if (["armor", "computer", "equipment", "item", "weapon"].includes(transferData.type)) {
+ if (targetItem.type === "container") {
+ if (!targetItem.system.locked || game.user.isGM)
+ transferData.system.container.id = targetId;
+ } else {
+ transferData.system.container.id = targetItem.system.container.id;
+ }
+ }
+ }
+
+ await this.actor.createEmbeddedDocuments("Item", [transferData]);
+ if (recalcWeight) await this.actor.recalculateWeight();
+ }
+ return true;
+ }
+
+ // =========================================================
+ // Actions (static private methods)
+ // =========================================================
+
+ static async #onCreateItem(event, target) {
+ event.preventDefault();
+ const data = {
+ name: target.dataset.createName,
+ type: target.dataset.typeItem,
+ };
+ if (target.dataset.subtype) {
+ data.system = { subType: target.dataset.subtype };
+ }
+ const cls = getDocumentClass("Item");
+ return cls.create(data, { parent: this.actor });
+ }
+
+ static async #onEditItem(event, target) {
+ event.preventDefault();
+ const li = target.closest("[data-item-id]");
+ const item = this.actor.getEmbeddedDocument("Item", li?.dataset.itemId);
+ if (item) item.sheet.render(true);
+ }
+
+ static async #onDeleteItem(event, target) {
+ event.preventDefault();
+ const li = target.closest("[data-item-id]");
+ if (!li?.dataset.itemId) return;
+ this.actor.deleteEmbeddedDocuments("Item", [li.dataset.itemId]);
+ }
+
+ static async #onEquipItem(event, target) {
+ event.preventDefault();
+ const li = target.closest("[data-item-id]");
+ const item = foundry.utils.deepClone(this.actor.getEmbeddedDocument("Item", li?.dataset.itemId));
+ if (!item) return;
+ item.system.equipped = !item.system.equipped;
+ this.actor.updateEmbeddedDocuments("Item", [item]);
+ }
+
+ static async #onItemStorageIn(event, target) {
+ event.preventDefault();
+ const li = target.closest("[data-item-id]");
+ const item = foundry.utils.deepClone(this.actor.getEmbeddedDocument("Item", li?.dataset.itemId));
+ if (!item) return;
+
+ if (item.type === "container") {
+ item.system.onHand = false;
+ } else {
+ const containers = this.actor.getContainers();
+ let container;
+ const dropInId = this.actor.system.containerDropIn;
+
+ if (!dropInId) {
+ container = containers.length === 0
+ ? await getDocumentClass("Item").create({ name: "New container", type: "container" }, { parent: this.actor })
+ : containers[0];
+ } else {
+ container = containers.find(x => x._id === dropInId);
+ }
+
+ if (container?.system.locked && !game.user.isGM) {
+ ui.notifications.error("Objet verrouillé");
+ return;
+ }
+ item.system.container.id = container._id;
+ }
+ this.actor.updateEmbeddedDocuments("Item", [item]);
+ }
+
+ static async #onItemStorageOut(event, target) {
+ event.preventDefault();
+ const li = target.closest("[data-item-id]");
+ const item = foundry.utils.deepClone(this.actor.getEmbeddedDocument("Item", li?.dataset.itemId));
+ if (!item) return;
+ item.system.container.id = "";
+ this.actor.updateEmbeddedDocuments("Item", [item]);
+ }
+
+ static async #onSoftwareEject(event, target) {
+ event.preventDefault();
+ const li = target.closest("[data-item-id]");
+ const item = foundry.utils.deepClone(this.actor.getEmbeddedDocument("Item", li?.dataset.itemId));
+ if (!item) return;
+ item.system.software.computerId = "";
+ this.actor.updateEmbeddedDocuments("Item", [item]);
+ }
+
+ static async #onContainerCreate(event) {
+ event.preventDefault();
+ const cls = getDocumentClass("Item");
+ return cls.create({ name: "New container", type: "container" }, { parent: this.actor });
+ }
+
+ static async #onContainerEdit(event) {
+ event.preventDefault();
+ const container = this.actor.getEmbeddedDocument("Item", this.actor.system.containerView);
+ if (container) container.sheet.render(true);
+ }
+
+ static async #onContainerDelete(event) {
+ event.preventDefault();
+ const containers = this.actor.getContainers();
+ const container = containers.find(x => x._id === this.actor.system.containerView);
+ if (!container) return;
+
+ const containerItems = this.actor.items.filter(
+ x => x.system.hasOwnProperty("container") && x.system.container.id === container._id
+ );
+
+ if (containerItems.length > 0) {
+ for (let item of containerItems) {
+ let clone = foundry.utils.deepClone(item);
+ clone.system.container.id = "";
+ this.actor.updateEmbeddedDocuments("Item", [clone]);
+ }
+ }
+
+ const cloneActor = foundry.utils.deepClone(this.actor);
+ cloneActor.system.containerView = "";
+ if (cloneActor.system.containerDropIn === container._id) {
+ cloneActor.system.containerDropIn = "";
+ const remaining = containers.filter(x => x._id !== container._id);
+ if (remaining.length > 0) cloneActor.system.containerDropIn = remaining[0]._id;
+ }
+
+ this.actor.deleteEmbeddedDocuments("Item", [container._id]);
+ this.actor.update(cloneActor);
+ }
+
+ static async #onRoll(event, target) {
+ event.preventDefault();
+
+ const rollOptions = {
+ rollTypeName: game.i18n.localize("MGT2.RollPrompt.Roll"),
+ rollObjectName: "",
+ characteristics: [{ _id: "", name: "" }],
+ characteristic: "",
+ skills: [],
+ skill: "",
+ fatigue: this.actor.system.states.fatigue,
+ encumbrance: this.actor.system.states.encumbrance,
+ difficulty: null,
+ damageFormula: null,
+ };
+
+ const cardButtons = [];
+ for (const [key, label] of Object.entries(MGT2.Characteristics)) {
+ const c = this.actor.system.characteristics[key];
+ if (c.show) {
+ rollOptions.characteristics.push({
+ _id: key,
+ name: game.i18n.localize(label) + MGT2Helper.getDisplayDM(c.dm),
+ });
+ }
+ }
+
+ for (let item of this.actor.items) {
+ if (item.type === "talent" && item.system.subType === "skill")
+ rollOptions.skills.push({ _id: item._id, name: item.getRollDisplay() });
+ }
+
+ rollOptions.skills.sort(MGT2Helper.compareByName);
+ rollOptions.skills = [{ _id: "NP", name: game.i18n.localize("MGT2.Items.NotProficient") }].concat(rollOptions.skills);
+
+ let itemObj = null;
+ let isInitiative = false;
+ const rollType = target.dataset.roll;
+
+ if (rollType === "initiative") {
+ rollOptions.rollTypeName = game.i18n.localize("MGT2.RollPrompt.InitiativeRoll");
+ rollOptions.characteristic = this.actor.system.config.initiative;
+ isInitiative = true;
+ } else if (rollType === "characteristic") {
+ rollOptions.characteristic = target.dataset.rollCharacteristic;
+ rollOptions.rollTypeName = game.i18n.localize("MGT2.RollPrompt.CharacteristicRoll");
+ rollOptions.rollObjectName = game.i18n.localize(`MGT2.Characteristics.${rollOptions.characteristic}.name`);
+ } else {
+ if (rollType === "skill") {
+ rollOptions.skill = target.dataset.rollSkill;
+ itemObj = this.actor.getEmbeddedDocument("Item", rollOptions.skill);
+ rollOptions.rollTypeName = game.i18n.localize("MGT2.RollPrompt.SkillRoll");
+ rollOptions.rollObjectName = itemObj.name;
+ } else if (rollType === "psionic") {
+ rollOptions.rollTypeName = game.i18n.localize("MGT2.RollPrompt.PsionicRoll");
+ }
+
+ if (itemObj === null && target.dataset.itemId) {
+ itemObj = this.actor.getEmbeddedDocument("Item", target.dataset.itemId);
+ rollOptions.rollObjectName = itemObj.name;
+ if (itemObj.type === "weapon") rollOptions.rollTypeName = game.i18n.localize("TYPES.Item.weapon");
+ else if (itemObj.type === "armor") rollOptions.rollTypeName = game.i18n.localize("TYPES.Item.armor");
+ else if (itemObj.type === "computer") rollOptions.rollTypeName = game.i18n.localize("TYPES.Item.computer");
+ }
+
+ if (rollType === "psionic" && itemObj) {
+ rollOptions.rollObjectName = itemObj.name;
+ if (MGT2Helper.hasValue(itemObj.system.psionic, "duration")) {
+ cardButtons.push({
+ label: game.i18n.localize("MGT2.Items.Duration"),
+ formula: itemObj.system.psionic.duration,
+ message: {
+ objectName: itemObj.name,
+ flavor: "{0} ".concat(game.i18n.localize(`MGT2.Durations.${itemObj.system.psionic.durationUnit}`)),
+ },
+ });
+ }
+ }
+
+ if (itemObj?.system.hasOwnProperty("damage")) {
+ rollOptions.damageFormula = itemObj.system.damage;
+ if (itemObj.type === "disease") {
+ if (itemObj.system.subType === "disease")
+ rollOptions.rollTypeName = game.i18n.localize("MGT2.DiseaseSubType.disease");
+ else if (itemObj.system.subType === "poison")
+ rollOptions.rollTypeName = game.i18n.localize("MGT2.DiseaseSubType.poison");
+ }
+ }
+
+ if (itemObj?.system.hasOwnProperty("roll")) {
+ if (MGT2Helper.hasValue(itemObj.system.roll, "characteristic")) rollOptions.characteristic = itemObj.system.roll.characteristic;
+ if (MGT2Helper.hasValue(itemObj.system.roll, "skill")) rollOptions.skill = itemObj.system.roll.skill;
+ if (MGT2Helper.hasValue(itemObj.system.roll, "difficulty")) rollOptions.difficulty = itemObj.system.roll.difficulty;
+ }
+ }
+
+ const userRollData = await RollPromptHelper.roll(rollOptions);
+
+ const rollModifiers = [];
+ const rollFormulaParts = [];
+
+ if (userRollData.diceModifier) {
+ rollFormulaParts.push("3d6", userRollData.diceModifier);
+ } else {
+ rollFormulaParts.push("2d6");
+ }
+
+ if (userRollData.characteristic) {
+ const c = this.actor.system.characteristics[userRollData.characteristic];
+ rollFormulaParts.push(MGT2Helper.getFormulaDM(c.dm));
+ rollModifiers.push(game.i18n.localize(`MGT2.Characteristics.${userRollData.characteristic}.name`) + MGT2Helper.getDisplayDM(c.dm));
+ }
+
+ if (userRollData.skill) {
+ if (userRollData.skill === "NP") {
+ rollFormulaParts.push("-3");
+ rollModifiers.push(game.i18n.localize("MGT2.Items.NotProficient"));
+ } else {
+ const skillObj = this.actor.getEmbeddedDocument("Item", userRollData.skill);
+ rollFormulaParts.push(MGT2Helper.getFormulaDM(skillObj.system.level));
+ rollModifiers.push(skillObj.getRollDisplay());
+ }
+ }
+
+ if (userRollData.psionic) {
+ const psionicObj = this.actor.getEmbeddedDocument("Item", userRollData.psionic);
+ rollFormulaParts.push(MGT2Helper.getFormulaDM(psionicObj.system.level));
+ rollModifiers.push(psionicObj.getRollDisplay());
+ }
+
+ if (userRollData.timeframes && userRollData.timeframes !== "" && userRollData.timeframes !== "Normal") {
+ rollModifiers.push(game.i18n.localize(`MGT2.Timeframes.${userRollData.timeframes}`));
+ rollFormulaParts.push(userRollData.timeframes === "Slower" ? "+2" : "-2");
+ }
+
+ if (userRollData.encumbrance === true) {
+ rollFormulaParts.push("-2");
+ rollModifiers.push(game.i18n.localize("MGT2.Actor.Encumbrance") + " -2");
+ }
+
+ if (userRollData.fatigue === true) {
+ rollFormulaParts.push("-2");
+ rollModifiers.push(game.i18n.localize("MGT2.Actor.Fatigue") + " -2");
+ }
+
+ if (userRollData.customDM) {
+ const s = userRollData.customDM.trim();
+ if (/^[0-9]/.test(s)) rollFormulaParts.push("+");
+ rollFormulaParts.push(s);
+ }
+
+ if (MGT2Helper.hasValue(userRollData, "difficulty")) rollOptions.difficulty = userRollData.difficulty;
+
+ const rollFormula = rollFormulaParts.join("");
+ if (!Roll.validate(rollFormula)) {
+ ui.notifications.error(game.i18n.localize("MGT2.Errors.InvalidRollFormula"));
+ return;
+ }
+
+ let roll = await new Roll(rollFormula, this.actor.getRollData()).roll({ async: true, rollMode: userRollData.rollMode });
+
+ if (isInitiative && this.token?.combatant) {
+ await this.token.combatant.update({ initiative: roll.total });
+ }
+
+ const chatData = {
+ user: game.user.id,
+ speaker: this.actor ? ChatMessage.getSpeaker({ actor: this.actor }) : null,
+ formula: roll._formula,
+ tooltip: await roll.getTooltip(),
+ total: Math.round(roll.total * 100) / 100,
+ type: CONST.CHAT_MESSAGE_TYPES.ROLL,
+ showButtons: true,
+ showLifeButtons: false,
+ showRollRequest: false,
+ rollTypeName: rollOptions.rollTypeName,
+ rollObjectName: rollOptions.rollObjectName,
+ rollModifiers: rollModifiers,
+ showRollDamage: rollOptions.damageFormula !== null && rollOptions.damageFormula !== "",
+ cardButtons: cardButtons,
+ };
+
+ if (MGT2Helper.hasValue(rollOptions, "difficulty")) {
+ chatData.rollDifficulty = rollOptions.difficulty;
+ chatData.rollDifficultyLabel = MGT2Helper.getDifficultyDisplay(rollOptions.difficulty);
+ if (roll.total >= MGT2Helper.getDifficultyValue(rollOptions.difficulty))
+ chatData.rollSuccess = true;
+ else
+ chatData.rollFailure = true;
+ }
+
+ const html = await renderTemplate("systems/mgt2/templates/chat/roll.html", chatData);
+ chatData.content = html;
+
+ let flags = null;
+ if (rollOptions.damageFormula) {
+ flags = { mgt2: { damage: { formula: rollOptions.damageFormula, rollObjectName: rollOptions.rollObjectName, rollTypeName: rollOptions.rollTypeName } } };
+ }
+ if (cardButtons.length > 0) {
+ if (!flags) flags = { mgt2: {} };
+ flags.mgt2.buttons = cardButtons;
+ }
+ if (flags) chatData.flags = flags;
+
+ return roll.toMessage(chatData);
+ }
+
+ static async #onOpenConfig(event) {
+ event.preventDefault();
+ const userConfig = await CharacterPrompts.openConfig(this.actor.system);
+ if (userConfig) this.actor.update({ "system.config": userConfig });
+ }
+
+ static async #onOpenCharacteristic(event, target) {
+ event.preventDefault();
+ const name = target.dataset.cfgCharacteristic;
+ const c = this.actor.system.characteristics[name];
+
+ let showAll = false;
+ for (const value of Object.values(this.actor.system.characteristics)) {
+ if (!value.show) { showAll = true; break; }
+ }
+
+ const userConfig = await CharacterPrompts.openCharacteristic(
+ game.i18n.localize(`MGT2.Characteristics.${name}.name`),
+ c.show, c.showMax, showAll
+ );
+
+ if (userConfig) {
+ const data = { system: { characteristics: {} } };
+ data.system.characteristics[name] = { show: userConfig.show, showMax: userConfig.showMax };
+
+ if (userConfig.showAll === true) {
+ for (const [key, value] of Object.entries(this.actor.system.characteristics)) {
+ if (key !== name && !value.show)
+ data.system.characteristics[key] = { show: true };
+ }
+ }
+ this.actor.update(data);
+ }
+ }
+
+ static async #onTraitCreate(event) {
+ event.preventDefault();
+ let traits = this.actor.system.personal.traits;
+ let newTraits;
+ if (traits.length === 0) {
+ newTraits = [{ name: "", description: "" }];
+ } else {
+ newTraits = [...traits, { name: "", description: "" }];
+ }
+ return this.actor.update({ system: { personal: { traits: newTraits } } });
+ }
+
+ static async #onTraitEdit(event, target) {
+ event.preventDefault();
+ const element = target.closest("[data-traits-part]");
+ const index = Number(element.dataset.traitsPart);
+ const trait = this.actor.system.personal.traits[index];
+ const result = await CharacterPrompts.openTraitEdit(trait);
+ const traits = [...this.actor.system.personal.traits];
+ traits[index] = { ...traits[index], name: result.name, description: result.description };
+ return this.actor.update({ system: { personal: { traits: traits } } });
+ }
+
+ static async #onTraitDelete(event, target) {
+ event.preventDefault();
+ const element = target.closest("[data-traits-part]");
+ const index = Number(element.dataset.traitsPart);
+ const traits = foundry.utils.deepClone(this.actor.system.personal.traits);
+ const newTraits = Object.entries(traits)
+ .filter(([key]) => Number(key) !== index)
+ .map(([, value]) => value);
+ return this.actor.update({ system: { personal: { traits: newTraits } } });
+ }
+
+ static async #onOpenEditor(event) {
+ event.preventDefault();
+ await CharacterPrompts.openEditorFullView(
+ this.actor.system.personal.species,
+ this.actor.system.personal.speciesText.descriptionLong
+ );
+ }
+}
diff --git a/src/module/applications/sheets/item-sheet.mjs b/src/module/applications/sheets/item-sheet.mjs
new file mode 100644
index 0000000..038dd72
--- /dev/null
+++ b/src/module/applications/sheets/item-sheet.mjs
@@ -0,0 +1,253 @@
+const { HandlebarsApplicationMixin } = foundry.applications.api;
+import { MGT2Helper } from "../../helper.js";
+
+export default class TravellerItemSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2) {
+
+ /** @override */
+ static DEFAULT_OPTIONS = {
+ classes: ["mgt2", "sheet", "item"],
+ position: { width: 630 },
+ form: {
+ submitOnChange: true,
+ closeOnSubmit: false,
+ },
+ window: { resizable: true },
+ actions: {
+ careerEventCreate: TravellerItemSheet.#onCareerEventCreate,
+ careerEventDelete: TravellerItemSheet.#onCareerEventDelete,
+ optionCreate: TravellerItemSheet.#onOptionCreate,
+ optionDelete: TravellerItemSheet.#onOptionDelete,
+ modifierCreate: TravellerItemSheet.#onModifierCreate,
+ modifierDelete: TravellerItemSheet.#onModifierDelete,
+ },
+ }
+
+ /** @override */
+ static PARTS = {
+ sheet: {
+ // template is dynamic — resolved in _prepareContext / _renderHTML
+ template: "",
+ },
+ }
+
+ /** Resolve template dynamically based on item type */
+ get template() {
+ return `systems/mgt2/templates/items/${this.document.type}-sheet.html`;
+ }
+
+ tabGroups = { primary: "tab1" }
+
+ /** @override */
+ async _prepareContext() {
+ const item = this.document;
+ const source = item.toObject();
+
+ const settings = {
+ usePronouns: game.settings.get("mgt2", "usePronouns"),
+ };
+
+ let containers = null;
+ let computers = null;
+ let hadContainer = false;
+
+ if (item.actor !== null) {
+ hadContainer = true;
+ containers = [{ name: "", _id: "" }].concat(item.actor.getContainers());
+ computers = [{ name: "", _id: "" }].concat(item.actor.getComputers());
+ }
+
+ let weight = null;
+ if (item.system.hasOwnProperty("weight")) {
+ weight = MGT2Helper.convertWeightForDisplay(item.system.weight);
+ }
+
+ let skills = [];
+ if (this.actor !== null) {
+ for (let actorItem of this.actor.items) {
+ if (actorItem.type === "talent" && actorItem.system.subType === "skill")
+ skills.push({ _id: actorItem._id, name: actorItem.getRollDisplay() });
+ }
+ }
+ skills.sort(MGT2Helper.compareByName);
+ skills = [{ _id: "NP", name: game.i18n.localize("MGT2.Items.NotProficient") }].concat(skills);
+
+ return {
+ item: item,
+ document: item,
+ cssClass: this.isEditable ? "editable" : "locked",
+ system: item.system,
+ source: source.system,
+ fields: item.schema.fields,
+ systemFields: item.system.schema.fields,
+ isEditable: this.isEditable,
+ isGM: game.user.isGM,
+ config: CONFIG,
+ settings: settings,
+ containers: containers,
+ computers: computers,
+ hadContainer: hadContainer,
+ weight: weight,
+ unitlabels: { weight: MGT2Helper.getWeightLabel() },
+ skills: skills,
+ };
+ }
+
+ /** @override — resolve the per-type template before rendering */
+ async _renderHTML(context, options) {
+ const templatePath = `systems/mgt2/templates/items/${this.document.type}-sheet.html`;
+ const html = await renderTemplate(templatePath, context);
+ return { sheet: html };
+ }
+
+ /** @override — put rendered HTML into the window content */
+ _replaceHTML(result, content, options) {
+ content.innerHTML = result.sheet;
+ this._activateTabGroups();
+ this._bindItemEvents();
+ }
+
+ /** Bind CSS class-based events (templates not yet migrated to data-action) */
+ _bindItemEvents() {
+ const html = this.element;
+ if (!this.isEditable) return;
+ const bind = (sel, handler) => {
+ for (const el of html.querySelectorAll(sel)) {
+ el.addEventListener("click", (ev) => handler.call(this, ev, ev.currentTarget));
+ }
+ };
+ bind(".event-create", TravellerItemSheet.#onCareerEventCreate);
+ bind(".event-delete", TravellerItemSheet.#onCareerEventDelete);
+ bind(".options-create", TravellerItemSheet.#onOptionCreate);
+ bind(".options-delete", TravellerItemSheet.#onOptionDelete);
+ bind(".modifiers-create", TravellerItemSheet.#onModifierCreate);
+ bind(".modifiers-delete", TravellerItemSheet.#onModifierDelete);
+ }
+
+ _activateTabGroups() {
+ for (const [group, activeTab] of Object.entries(this.tabGroups)) {
+ const nav = this.element.querySelector(`nav[data-group="${group}"], .horizontal-tabs`);
+ if (!nav) continue;
+
+ nav.querySelectorAll('[data-tab]').forEach(link => {
+ link.classList.toggle('active', link.dataset.tab === activeTab);
+ link.addEventListener('click', event => {
+ event.preventDefault();
+ this.tabGroups[group] = link.dataset.tab;
+ this.render();
+ });
+ });
+
+ this.element.querySelectorAll(`.itemsheet-panel [data-tab], [data-group="${group}"][data-tab]`).forEach(content => {
+ content.classList.toggle('active', content.dataset.tab === activeTab);
+ });
+ }
+ }
+
+ /** @override — process form data before submit (weight/qty/cost conversions + container logic) */
+ _prepareSubmitData(event, form, formData) {
+ const data = foundry.utils.expandObject(formData.object);
+
+ if (data.hasOwnProperty("weight")) {
+ data.system = data.system || {};
+ data.system.weight = MGT2Helper.convertWeightFromInput(data.weight);
+ delete data.weight;
+ }
+
+ if (data.system?.hasOwnProperty("quantity")) {
+ data.system.quantity = MGT2Helper.getIntegerFromInput(data.system.quantity);
+ }
+
+ if (data.system?.hasOwnProperty("cost")) {
+ data.system.cost = MGT2Helper.getIntegerFromInput(data.system.cost);
+ }
+
+ // Container/equipped logic
+ if (data.system?.hasOwnProperty("container") && this.document.system.hasOwnProperty("equipped")) {
+ const equippedChange = this.document.system.equipped !== data.system.equipped;
+ const containerChange = this.document.system.container?.id !== data.system.container?.id;
+
+ if (equippedChange && data.system.equipped === true) {
+ data.system.container = { id: "" };
+ } else if (containerChange && data.system.container?.id !== "" && this.document.system.container?.id === "") {
+ data.system.equipped = false;
+ }
+ }
+
+ return foundry.utils.flattenObject(data);
+ }
+
+ // =========================================================
+ // Actions
+ // =========================================================
+
+ static async #onCareerEventCreate(event) {
+ event.preventDefault();
+ const events = this.document.system.events;
+ let newEvents;
+ if (!events || events.length === 0) {
+ newEvents = [{ age: "", description: "" }];
+ } else {
+ newEvents = [...events, { age: "", description: "" }];
+ }
+ return this.document.update({ system: { events: newEvents } });
+ }
+
+ static async #onCareerEventDelete(event, target) {
+ event.preventDefault();
+ const element = target.closest("[data-events-part]");
+ const index = Number(element.dataset.eventsPart);
+ const events = foundry.utils.deepClone(this.document.system.events);
+ const newEvents = Object.entries(events)
+ .filter(([key]) => Number(key) !== index)
+ .map(([, val]) => val);
+ return this.document.update({ system: { events: newEvents } });
+ }
+
+ static async #onOptionCreate(event, target) {
+ event.preventDefault();
+ const property = target.dataset.property;
+ const options = this.document.system[property];
+ let newOptions;
+ if (!options || options.length === 0) {
+ newOptions = [{ name: "", description: "" }];
+ } else {
+ newOptions = [...options, { name: "", description: "" }];
+ }
+ return this.document.update({ [`system.${property}`]: newOptions });
+ }
+
+ static async #onOptionDelete(event, target) {
+ event.preventDefault();
+ const element = target.closest("[data-options-part]");
+ const property = element.dataset.property;
+ const index = Number(element.dataset.optionsPart);
+ const options = foundry.utils.deepClone(this.document.system[property]);
+ const newOptions = Object.entries(options)
+ .filter(([key]) => Number(key) !== index)
+ .map(([, val]) => val);
+ return this.document.update({ [`system.${property}`]: newOptions });
+ }
+
+ static async #onModifierCreate(event) {
+ event.preventDefault();
+ const modifiers = this.document.system.modifiers;
+ let newModifiers;
+ if (!modifiers || modifiers.length === 0) {
+ newModifiers = [{ characteristic: "Endurance", value: null }];
+ } else {
+ newModifiers = [...modifiers, { characteristic: "Endurance", value: null }];
+ }
+ return this.document.update({ system: { modifiers: newModifiers } });
+ }
+
+ static async #onModifierDelete(event, target) {
+ event.preventDefault();
+ const element = target.closest("[data-modifiers-part]");
+ const index = Number(element.dataset.modifiersPart);
+ const modifiers = foundry.utils.deepClone(this.document.system.modifiers);
+ const newModifiers = Object.entries(modifiers)
+ .filter(([key]) => Number(key) !== index)
+ .map(([, val]) => val);
+ return this.document.update({ system: { modifiers: newModifiers } });
+ }
+}
diff --git a/src/module/applications/sheets/vehicule-sheet.mjs b/src/module/applications/sheets/vehicule-sheet.mjs
new file mode 100644
index 0000000..e57a6e6
--- /dev/null
+++ b/src/module/applications/sheets/vehicule-sheet.mjs
@@ -0,0 +1,24 @@
+import MGT2ActorSheet from "./base-actor-sheet.mjs";
+
+export default class TravellerVehiculeSheet extends MGT2ActorSheet {
+
+ /** @override */
+ static DEFAULT_OPTIONS = {
+ ...super.DEFAULT_OPTIONS,
+ classes: [...super.DEFAULT_OPTIONS.classes, "vehicule", "nopad"],
+ window: {
+ ...super.DEFAULT_OPTIONS.window,
+ title: "TYPES.Actor.vehicule",
+ },
+ }
+
+ /** @override */
+ static PARTS = {
+ sheet: {
+ template: "systems/mgt2/templates/actors/vehicule-sheet.html",
+ },
+ }
+
+ /** @override */
+ tabGroups = { primary: "stats" }
+}
diff --git a/src/module/core.js b/src/module/core.js
index a3bda7b..5b882d5 100644
--- a/src/module/core.js
+++ b/src/module/core.js
@@ -1,5 +1,6 @@
import {
CharacterData,
+ VehiculeData,
ItemData,
EquipmentData,
DiseaseData,
@@ -11,13 +12,12 @@ import {
WeaponData,
ItemContainerData,
SpeciesData
-} from "./datamodels.js";
+} from "./models/index.mjs";
import { MGT2 } from "./config.js";
import { TravellerActor, MGT2Combatant } from "./actors/actor.js";
import { TravellerItem } from "./item.js";
-import { TravellerItemSheet } from "./item-sheet.js";
-import { TravellerActorSheet } from "./actors/character-sheet.js";
+import { TravellerItemSheet, TravellerCharacterSheet, TravellerVehiculeSheet } from "./applications/sheets/_module.mjs";
import { preloadHandlebarsTemplates } from "./templates.js";
//import { MGT2Helper } from "./helper.js";
import {ChatHelper} from "./chatHelper.js";
@@ -88,14 +88,16 @@ Hooks.once("init", async function () {
CONFIG.Actor.documentClass = TravellerActor;
CONFIG.Item.documentClass = TravellerItem;
- Actors.unregisterSheet("core", ActorSheet);
- Actors.registerSheet("mgt2", TravellerActorSheet, { types: ["character"], makeDefault: true, label: "Traveller Sheet" });
+ foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet);
+ foundry.documents.collections.Actors.registerSheet("mgt2", TravellerCharacterSheet, { types: ["character"], makeDefault: true, label: "Traveller Sheet" });
+ foundry.documents.collections.Actors.registerSheet("mgt2", TravellerVehiculeSheet, { types: ["vehicule"], makeDefault: true, label: "Vehicule Sheet" });
- Items.unregisterSheet("core", ItemSheet);
- Items.registerSheet("mgt2", TravellerItemSheet, { makeDefault: true });
+ foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
+ foundry.documents.collections.Items.registerSheet("mgt2", TravellerItemSheet, { makeDefault: true });
Object.assign(CONFIG.Actor.dataModels, {
- "character": CharacterData
+ "character": CharacterData,
+ "vehicule": VehiculeData
});
Object.assign(CONFIG.Item.dataModels, {
diff --git a/src/module/datamodels.js b/src/module/datamodels.js
deleted file mode 100644
index 8098027..0000000
--- a/src/module/datamodels.js
+++ /dev/null
@@ -1,485 +0,0 @@
-// https://foundryvtt.com/article/system-data-models/
-// https://foundryvtt.com/api/classes/foundry.data.fields.NumberField.html
-// https://foundryvtt.com/api/v10/classes/foundry.data.fields.DataField.html
-const fields = foundry.data.fields;
-
-export class CharacterData extends foundry.abstract.TypeDataModel {
-
- static defineSchema() {
- // XP
- return {
- name: new fields.StringField({ required: false, blank: false, trim: true }),
- life: new fields.SchemaField({
- value: new fields.NumberField({ required: false, initial: 0, integer: true }),
- max: new fields.NumberField({ required: true, initial: 0, integer: true })
- }),
- personal: new fields.SchemaField({
- title: new fields.StringField({ required: false, blank: true, trim: true }),
- species: new fields.StringField({ required: false, blank: true, trim: true }),
- speciesText: new fields.SchemaField({
- description: new fields.StringField({ required: false, blank: true, trim: true, nullable: true }),
- descriptionLong: new fields.HTMLField({ required: false, blank: true, trim: true })
- }),
- age: new fields.StringField({ required: false, blank: true, trim: true }),
- gender: new fields.StringField({ required: false, blank: true, trim: true }),
- pronouns: new fields.StringField({ required: false, blank: true, trim: true }),
- homeworld: new fields.StringField({ required: false, blank: true, trim: true }),
- ucp: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
- traits: new fields.ArrayField(
- new fields.SchemaField({
- name: new fields.StringField({ required: true, blank: true, trim: true }),
- description: new fields.StringField({ required: false, blank: true, trim: true })
- })
- )
- }),
- biography: new fields.HTMLField({ required: false, blank: true, trim: true }),
-
- characteristics: new fields.SchemaField({
- strength: createCharacteristicField(true, true),
- dexterity: createCharacteristicField(true, true),
- endurance: createCharacteristicField(true, true),
- intellect: createCharacteristicField(true, false),
- education: createCharacteristicField(true, false),
- social: createCharacteristicField(true, false),
- morale: createCharacteristicField(true, false),
- luck: createCharacteristicField(true, false),
- sanity: createCharacteristicField(true, false),
- charm: createCharacteristicField(true, false),
- psionic: createCharacteristicField(true, false),
- other: createCharacteristicField(true, false)
- }),
-
- health: new fields.SchemaField({
- radiations: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true })
- }),
- study: new fields.SchemaField({
- skill: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
- total: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true }),
- completed: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true })
- }),
- finance: new fields.SchemaField({
- pension: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- credits: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- cashOnHand: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- debt: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- livingCost: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- monthlyShipPayments: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- notes: new fields.StringField({ required: false, blank: true, trim: true, initial: "" })
- }),
- containerView: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
- containerDropIn: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
- notes: new fields.HTMLField({ required: false, blank: true, trim: true }),
-
- inventory: new fields.SchemaField({
- armor: new fields.NumberField({ required: true, initial: 0, integer: true }),
- weight: new fields.NumberField({ required: true, initial: 0, min: 0, integer: false }),
- encumbrance: new fields.SchemaField({
- normal: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- heavy: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true })
- })
- }),
- states: new fields.SchemaField({
- encumbrance: new fields.BooleanField({ required: false, initial: false }),
- fatigue: new fields.BooleanField({ required: false, initial: false }),
- unconscious: new fields.BooleanField({ required: false, initial: false }),
- surgeryRequired: new fields.BooleanField({ required: false, initial: false })
- }),
-
- config: new fields.SchemaField({
- psionic: new fields.BooleanField({ required: false, initial: true }),
- initiative: new fields.StringField({ required: false, blank: true, initial: "dexterity" }),
- damages: new fields.SchemaField({
- rank1: new fields.StringField({ required: false, blank: true, initial: "strength" }),
- rank2: new fields.StringField({ required: false, blank: true, initial: "dexterity" }),
- rank3: new fields.StringField({ required: false, blank: true, initial: "endurance" })
- })
- })
- };
- }
-}
-
-// export class CreatureData extends foundry.abstract.TypeDataModel {
-// static defineSchema() {
-// return {
-// name: new fields.StringField({ required: false, blank: false, trim: true }),
-// TL: new fields.StringField({ required: true, blank: false, initial: "NA" }),
-// species: new fields.StringField({ required: false, blank: true, trim: true }),
-// //cost: new fields.NumberField({ required: true, integer: true }),
-// armor: new fields.NumberField({ required: false, initial: 0, integer: true }),
-// life: new fields.SchemaField({
-// value: new fields.NumberField({ required: false, initial: 0, integer: true }),
-// max: new fields.NumberField({ required: true, initial: 0, integer: true })
-// }),
-
-// speed: new fields.StringField({ required: false, initial: "4m", blank: true, trim: true }),
-
-// traits: new fields.ArrayField(
-// new fields.SchemaField({
-// name: new fields.StringField({ required: true, blank: true, trim: true }),
-// description: new fields.StringField({ required: false, blank: true, trim: true })
-// })
-// ),
-
-// description: new fields.HTMLField({ required: false, blank: true, trim: true }),
-// behaviour: new fields.StringField({ required: false, blank: true, trim: true })
-// }
-// };
-// }
-
-// export class NPCData extends CreatureData {
-// static defineSchema() {
-// const schema = super.defineSchema();
-// // Species, Gender, Age
-// // STR, DEX, END, INT,. EDU, SOC, PSI, SKILL/Psy, equipment
-// // Status
-// schema.secret = new fields.HTMLField({ required: false, blank: true, trim: true });
-
-// return schema;
-// }
-// }
-
-export class VehiculeData extends foundry.abstract.TypeDataModel {
-
- static defineSchema() {
- return {
- name: new fields.StringField({ required: false, blank: false, trim: true }),
-
- skillId: new fields.StringField({ required: false, initial: "", blank: true, trim: true }),
- speed: new fields.SchemaField({
- cruise: new fields.StringField({ required: false, initial: "Slow", blank: true }),
- maximum: new fields.StringField({ required: false, initial: "Medium", blank: true })
- }),
- agility: new fields.NumberField({ required: false, min: 0, integer: true }),
- crew: new fields.NumberField({ required: false, min: 0, integer: true }),
- passengers: new fields.NumberField({ required: false, min: 0, integer: true }),
- cargo: new fields.NumberField({ required: false, min: 0, integer: false }),
- //hull
- life: new fields.SchemaField({
- value: new fields.NumberField({ required: true, initial: 0, integer: true }),
- max: new fields.NumberField({ required: true, initial: 0, integer: true })
- }),
- shipping: new fields.NumberField({ required: false, min: 0, integer: true }),
- cost: new fields.NumberField({ required: false, min: 0, integer: true }),
- armor: new fields.SchemaField({
- front: new fields.NumberField({ required: true, initial: 0, integer: true }),
- rear: new fields.NumberField({ required: true, initial: 0, integer: true }),
- sides: new fields.NumberField({ required: true, initial: 0, integer: true })
- }),
-
- skills: new fields.SchemaField({
- // Skill Level
- autopilot: new fields.NumberField({ required: true, initial: 0, integer: true })
- // Communication Range
- // Navigation
- // Sensors
- // Camouflage / Recon
- // Stealth
- })
- // config: new fields.SchemaField({
- // })
- };
- }
-}
-
-class ItemBaseData extends foundry.abstract.TypeDataModel {
- static defineSchema() {
- const fields = foundry.data.fields;
- const schema = {
- //name: new fields.StringField({ required: true, blank: true, trim: true, nullable: true }),
- description: new fields.StringField({ required: false, blank: true, trim: true, nullable: true }),
- //type: new fields.StringField({ required: false, blank: false }),
- subType: new fields.StringField({ required: false, blank: false, nullable: true })
- };
-
- return schema;
- }
-}
-
-class PhysicalItemData extends ItemBaseData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.quantity = new fields.NumberField({ required: true, initial: 1, min: 0, integer: true });
- schema.weight = new fields.NumberField({ required: true, initial: 0, min: 0, integer: false });
- schema.weightless = new fields.BooleanField({ required: false, initial: false });
- schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });
- schema.tl = new fields.StringField({ required: true, blank: false, initial: "TL12" });
- schema.container = new fields.SchemaField({
- //inContainer: new fields.BooleanField({ required: false, initial: false }),
- id: new fields.StringField({ required: false, blank: true })
- });
-
- schema.roll = new fields.SchemaField({
- characteristic: new fields.StringField({ required: false, blank: true, trim: true }),
- skill: new fields.StringField({ required: false, blank: true, trim: true }),
- difficulty: new fields.StringField({ required: false, blank: true, trim: true })
- });
-
- schema.trash = new fields.BooleanField({ required: false, initial: false });
-
- return schema;
- }
-}
-
-export class ItemData extends PhysicalItemData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.subType.initial = "loot";
- schema.software = new fields.SchemaField({
- bandwidth: new fields.NumberField({ required: false, initial: 0, min: 0, max: 10, integer: true }),
- effect: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
- computerId: new fields.StringField({ required: false, blank: true, initial: "" })
- });
- return schema;
- }
-}
-
-export class EquipmentData extends PhysicalItemData {
- static defineSchema() {
- const schema = super.defineSchema();
- // augment, clothes
- schema.equipped = new fields.BooleanField({ required: false, initial: false });
- //schema.skillModifier = new fields.StringField({ required: false, blank: true });
- //schema.characteristicModifier = new fields.StringField({ required: false, blank: true });
-
- schema.augment = new fields.SchemaField({
- improvement: new fields.StringField({ required: false, blank: true, trim: true })
- });
-
- schema.subType.initial = "equipment"; // augment, clothing, trinket, toolkit, equipment
-
- return schema;
- }
-}
-
-export class DiseaseData extends ItemBaseData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.subType.initial = "disease"; // disease;poison
- schema.difficulty = new fields.StringField({ required: true, initial: "Average" });
- schema.damage = new fields.StringField({ required: false, blank: true });
- schema.interval = new fields.StringField({ required: false, blank: true });
- return schema;
- }
-}
-
-export class CareerData extends ItemBaseData {
- static defineSchema() {
- const schema = super.defineSchema();
-
- schema.difficulty = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });
- schema.damage = new fields.StringField({ required: false, blank: true });
- schema.interval = new fields.StringField({ required: false, blank: true });
-
- schema.assignment = new fields.StringField({ required: false, blank: true });
- schema.terms = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.rank = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.events = new fields.ArrayField(
- new fields.SchemaField({
- age: new fields.NumberField({ required: false, integer: true }),
- description: new fields.StringField({ required: false, blank: true, trim: true })
- })
- );
-
- return schema;
- }
-}
-
-export class TalentData extends ItemBaseData {
- static defineSchema() {
- const schema = super.defineSchema();
-
- schema.subType.initial = "skill";
- schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true })
- schema.level = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true })
- schema.skill = new fields.SchemaField({
- speciality: new fields.StringField({ required: false, blank: true, trim: true }),
- reduceEncumbrance: new fields.BooleanField({ required: false, initial: false })
- });
-
- schema.psionic = new fields.SchemaField({
- reach: new fields.StringField({ required: false, blank: true, trim: true }),
- cost: new fields.NumberField({ required: false, initial: 1, min: 0, integer: true }),
- duration: new fields.StringField({ required: false, blank: true, trim: true }),
- durationUnit: new fields.StringField({ required: false })
- });
-
- schema.roll = new fields.SchemaField({
- characteristic: new fields.StringField({ required: false, blank: true, trim: true }),
- skill: new fields.StringField({ required: false, blank: true, trim: true }),
- difficulty: new fields.StringField({ required: false, blank: true, trim: true })
- });
-
- return schema;
- }
-}
-
-export class ContactData extends ItemBaseData {
- static defineSchema() {
- const schema = super.defineSchema();
-
- schema.subType.initial = "skill";
- schema.cost = new fields.NumberField({ required: true, initial: 1, min: 0, integer: true })
-
- schema.skill = new fields.SchemaField({
- speciality: new fields.StringField({ required: false, blank: true, trim: true }),
- characteristic: new fields.StringField({ required: false, blank: true, trim: true })
- });
-
- schema.status = new fields.StringField({ required: false, blank: true, trim: true, initial: "Alive" });
- schema.attitude = new fields.StringField({ required: false, blank: true, trim: true, initial: "Unknow" });
- schema.relation = new fields.StringField({ required: false, blank: true, trim: true, initial: "Contact" });
- schema.title = new fields.StringField({ required: false, blank: true, trim: true });
- schema.nickname = new fields.StringField({ required: false, blank: true, trim: true });
- schema.species = new fields.StringField({ required: false, blank: true, trim: true });
- schema.gender = new fields.StringField({ required: false, blank: true, trim: true });
- schema.pronouns = new fields.StringField({ required: false, blank: true, trim: true });
- schema.homeworld = new fields.StringField({ required: false, blank: true, trim: true });
- schema.location = new fields.StringField({ required: false, blank: true, trim: true });
- schema.occupation = new fields.StringField({ required: false, blank: true, trim: true });
- schema.notes = new fields.HTMLField({ required: false, blank: true, trim: true });
-
- return schema;
- }
-}
-
-export class WeaponData extends PhysicalItemData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.equipped = new fields.BooleanField({ required: false, initial: false });
- schema.range = new fields.SchemaField({
- isMelee: new fields.BooleanField({ required: false, initial: false }),
- value: new fields.NumberField({ required: false, integer: true, nullable: true }),
- unit: new fields.StringField({ required: false, blank: true, nullable: true })
- }),
- //schema.tons = new fields.NumberField({ required: false, initial: 0, min: 0, integer: false });
- schema.damage = new fields.StringField({ required: false, blank: true, trim: true });
- schema.magazine = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.magazineCost = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.traits = new fields.ArrayField(
- new fields.SchemaField({
- name: new fields.StringField({ required: true, blank: true, trim: true }),
- description: new fields.StringField({ required: false, blank: true, trim: true })
- })
- );
- schema.options = new fields.ArrayField(
- new fields.SchemaField({
- name: new fields.StringField({ required: true, blank: true, trim: true }),
- description: new fields.StringField({ required: false, blank: true, trim: true })
- })
- );
-
- return schema;
- }
-}
-
-export class ArmorData extends PhysicalItemData {
- static defineSchema() {
- const schema = super.defineSchema();
- schema.equipped = new fields.BooleanField({ required: false, initial: false });
- schema.radiations = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.protection = new fields.StringField({ required: false, blank: false, trim: true });
-
- // Some armours have a required skill. A Traveller suffers DM-1 to all checks taken in the armour per missing
- // skill level. For example, a Traveller with Vacc Suit skill 0 who is in a suit that requires Vacc Suit 2 would have
- // DM-2 to all their checks. Not having the skill at all inflicts the usual DM-3 unskilled penalty instead.
- schema.requireSkill = new fields.StringField({ required: false, blank: false });
- schema.requireSkillLevel = new fields.NumberField({ required: false, min: 0, integer: true });
-
- //requirements: new fields.StringField({ required: false, blank: false, trim: true }),
-
- // As powered armour, battle dress supports its own weight. While powered and active, the mass of battle dress
- // does not count against the encumbrance of the wearer and is effectively weightless.
- schema.powered = new fields.BooleanField({ required: false, initial: false });
- schema.options = new fields.ArrayField(
- new fields.SchemaField({
- name: new fields.StringField({ required: true, blank: true, trim: true }),
- description: new fields.StringField({ required: false, blank: true, trim: true })
- })
- );
-
- // Characteristics Modifiers (Pirate of Drinax - ASLAN BATTLE DRESS STR/DEX, Slot)
-
- return schema;
- }
-}
-
-export class ComputerData extends PhysicalItemData {
- static defineSchema() {
- const schema = super.defineSchema();
-
- schema.processing = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.processingUsed = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.overload = new fields.BooleanField({ required: false, initial: false });
- //schema.softwares = new fields.ArrayField(new fields.StringField({ required: false, blank: true, trim: true }));
- schema.options = new fields.ArrayField(
- new fields.SchemaField({
- name: new fields.StringField({ required: true, blank: true, trim: true }),
- description: new fields.StringField({ required: false, blank: true, trim: true })
- })
- );
-
- return schema;
- }
-}
-
-export class SoftwareData extends ItemBaseData {
- static defineSchema() {
- const schema = super.defineSchema();
-
- schema.bandwidth = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
- schema.inUse = new fields.BooleanField({ required: false, initial: false });
- schema.computer = new fields.StringField({ required: false, blank: true, nullable: true });
-
- return schema;
- }
-}
-
-export class SpeciesData extends foundry.abstract.TypeDataModel {
- static defineSchema() {
- const fields = foundry.data.fields;
- const schema = {
- description: new fields.StringField({ required: false, blank: true, trim: true, nullable: true }),
- descriptionLong: new fields.HTMLField({ required: false, blank: true, trim: true }),
- traits: new fields.ArrayField(
- new fields.SchemaField({
- name: new fields.StringField({ required: true, blank: true, trim: true }),
- description: new fields.StringField({ required: false, blank: true, trim: true })
- })
- ),
- modifiers: new fields.ArrayField(
- new fields.SchemaField({
- characteristic: new fields.StringField({ required: false, blank: true, trim: true }),
- value: new fields.NumberField({ required: false, integer: true, nullable: true })
- })
- )
- };
-
- return schema;
- }
-}
-
-export class ItemContainerData extends ItemBaseData {
- static defineSchema() {
- const schema = super.defineSchema();
-
- schema.onHand = new fields.BooleanField({ required: false, initial: false });
- schema.location = new fields.StringField({ required: false, blank: true, trim: true });
- schema.count = new fields.NumberField({ required: false, initial: 0, integer: true });
- schema.weight = new fields.NumberField({ required: false, initial: 0, integer: false });
- schema.weightless = new fields.BooleanField({ required: false, initial: false });
-
- schema.locked = new fields.BooleanField({ required: false, initial: false }); // GM only
- schema.lockedDescription = new fields.StringField({ required: false, blank: true, trim: true, nullable: true });
- return schema;
- }
-}
-
-function createCharacteristicField(show = true, showMax = false) {
- return new fields.SchemaField({
- value: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
- max: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true }),
- dm: new fields.NumberField({ required: false, initial: 0, integer: true }),
- show: new fields.BooleanField({ required: false, initial: show }),
- showMax: new fields.BooleanField({ required: false, initial: showMax })
- });
-}
\ No newline at end of file
diff --git a/src/module/models/character.mjs b/src/module/models/character.mjs
new file mode 100644
index 0000000..4ece334
--- /dev/null
+++ b/src/module/models/character.mjs
@@ -0,0 +1,96 @@
+import { createCharacteristicField } from "./items/base-item.mjs";
+const fields = foundry.data.fields;
+
+export default class CharacterData extends foundry.abstract.TypeDataModel {
+
+ static defineSchema() {
+ return {
+ name: new fields.StringField({ required: false, blank: false, trim: true }),
+ life: new fields.SchemaField({
+ value: new fields.NumberField({ required: false, initial: 0, integer: true }),
+ max: new fields.NumberField({ required: true, initial: 0, integer: true })
+ }),
+ personal: new fields.SchemaField({
+ title: new fields.StringField({ required: false, blank: true, trim: true }),
+ species: new fields.StringField({ required: false, blank: true, trim: true }),
+ speciesText: new fields.SchemaField({
+ description: new fields.StringField({ required: false, blank: true, trim: true, nullable: true }),
+ descriptionLong: new fields.HTMLField({ required: false, blank: true, trim: true })
+ }),
+ age: new fields.StringField({ required: false, blank: true, trim: true }),
+ gender: new fields.StringField({ required: false, blank: true, trim: true }),
+ pronouns: new fields.StringField({ required: false, blank: true, trim: true }),
+ homeworld: new fields.StringField({ required: false, blank: true, trim: true }),
+ ucp: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
+ traits: new fields.ArrayField(
+ new fields.SchemaField({
+ name: new fields.StringField({ required: true, blank: true, trim: true }),
+ description: new fields.StringField({ required: false, blank: true, trim: true })
+ })
+ )
+ }),
+ biography: new fields.HTMLField({ required: false, blank: true, trim: true }),
+
+ characteristics: new fields.SchemaField({
+ strength: createCharacteristicField(true, true),
+ dexterity: createCharacteristicField(true, true),
+ endurance: createCharacteristicField(true, true),
+ intellect: createCharacteristicField(true, false),
+ education: createCharacteristicField(true, false),
+ social: createCharacteristicField(true, false),
+ morale: createCharacteristicField(true, false),
+ luck: createCharacteristicField(true, false),
+ sanity: createCharacteristicField(true, false),
+ charm: createCharacteristicField(true, false),
+ psionic: createCharacteristicField(true, false),
+ other: createCharacteristicField(true, false)
+ }),
+
+ health: new fields.SchemaField({
+ radiations: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true })
+ }),
+ study: new fields.SchemaField({
+ skill: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
+ total: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true }),
+ completed: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true })
+ }),
+ finance: new fields.SchemaField({
+ pension: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ credits: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ cashOnHand: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ debt: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ livingCost: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ monthlyShipPayments: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ notes: new fields.StringField({ required: false, blank: true, trim: true, initial: "" })
+ }),
+ containerView: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
+ containerDropIn: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
+ notes: new fields.HTMLField({ required: false, blank: true, trim: true }),
+
+ inventory: new fields.SchemaField({
+ armor: new fields.NumberField({ required: true, initial: 0, integer: true }),
+ weight: new fields.NumberField({ required: true, initial: 0, min: 0, integer: false }),
+ encumbrance: new fields.SchemaField({
+ normal: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ heavy: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true })
+ })
+ }),
+ states: new fields.SchemaField({
+ encumbrance: new fields.BooleanField({ required: false, initial: false }),
+ fatigue: new fields.BooleanField({ required: false, initial: false }),
+ unconscious: new fields.BooleanField({ required: false, initial: false }),
+ surgeryRequired: new fields.BooleanField({ required: false, initial: false })
+ }),
+
+ config: new fields.SchemaField({
+ psionic: new fields.BooleanField({ required: false, initial: true }),
+ initiative: new fields.StringField({ required: false, blank: true, initial: "dexterity" }),
+ damages: new fields.SchemaField({
+ rank1: new fields.StringField({ required: false, blank: true, initial: "strength" }),
+ rank2: new fields.StringField({ required: false, blank: true, initial: "dexterity" }),
+ rank3: new fields.StringField({ required: false, blank: true, initial: "endurance" })
+ })
+ })
+ };
+ }
+}
diff --git a/src/module/models/index.mjs b/src/module/models/index.mjs
new file mode 100644
index 0000000..f7f9296
--- /dev/null
+++ b/src/module/models/index.mjs
@@ -0,0 +1,16 @@
+// Actor DataModels
+export { default as CharacterData } from "./character.mjs";
+export { default as VehiculeData } from "./vehicule.mjs";
+
+// Item DataModels
+export { default as ItemData } from "./items/item.mjs";
+export { default as EquipmentData } from "./items/equipment.mjs";
+export { default as DiseaseData } from "./items/disease.mjs";
+export { default as CareerData } from "./items/career.mjs";
+export { default as TalentData } from "./items/talent.mjs";
+export { default as ContactData } from "./items/contact.mjs";
+export { default as WeaponData } from "./items/weapon.mjs";
+export { default as ArmorData } from "./items/armor.mjs";
+export { default as ComputerData } from "./items/computer.mjs";
+export { default as ItemContainerData } from "./items/container.mjs";
+export { default as SpeciesData } from "./items/species.mjs";
diff --git a/src/module/models/items/armor.mjs b/src/module/models/items/armor.mjs
new file mode 100644
index 0000000..4dc8892
--- /dev/null
+++ b/src/module/models/items/armor.mjs
@@ -0,0 +1,23 @@
+import { PhysicalItemData } from "./base-item.mjs";
+const fields = foundry.data.fields;
+
+export default class ArmorData extends PhysicalItemData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.equipped = new fields.BooleanField({ required: false, initial: false });
+ schema.radiations = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
+ schema.protection = new fields.StringField({ required: false, blank: false, trim: true });
+ // A Traveller suffers DM-1 to all checks per missing skill level in the required skill.
+ schema.requireSkill = new fields.StringField({ required: false, blank: false });
+ schema.requireSkillLevel = new fields.NumberField({ required: false, min: 0, integer: true });
+ // Powered armour supports its own weight and is effectively weightless for encumbrance.
+ schema.powered = new fields.BooleanField({ required: false, initial: false });
+ schema.options = new fields.ArrayField(
+ new fields.SchemaField({
+ name: new fields.StringField({ required: true, blank: true, trim: true }),
+ description: new fields.StringField({ required: false, blank: true, trim: true })
+ })
+ );
+ return schema;
+ }
+}
diff --git a/src/module/models/items/base-item.mjs b/src/module/models/items/base-item.mjs
new file mode 100644
index 0000000..eb21a6c
--- /dev/null
+++ b/src/module/models/items/base-item.mjs
@@ -0,0 +1,41 @@
+const fields = foundry.data.fields;
+
+export function createCharacteristicField(show = true, showMax = false) {
+ return new fields.SchemaField({
+ value: new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }),
+ max: new fields.NumberField({ required: false, initial: 0, min: 0, integer: true }),
+ dm: new fields.NumberField({ required: false, initial: 0, integer: true }),
+ show: new fields.BooleanField({ required: false, initial: show }),
+ showMax: new fields.BooleanField({ required: false, initial: showMax })
+ });
+}
+
+export class ItemBaseData extends foundry.abstract.TypeDataModel {
+ static defineSchema() {
+ return {
+ description: new fields.StringField({ required: false, blank: true, trim: true, nullable: true }),
+ subType: new fields.StringField({ required: false, blank: false, nullable: true })
+ };
+ }
+}
+
+export class PhysicalItemData extends ItemBaseData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.quantity = new fields.NumberField({ required: true, initial: 1, min: 0, integer: true });
+ schema.weight = new fields.NumberField({ required: true, initial: 0, min: 0, integer: false });
+ schema.weightless = new fields.BooleanField({ required: false, initial: false });
+ schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });
+ schema.tl = new fields.StringField({ required: true, blank: false, initial: "TL12" });
+ schema.container = new fields.SchemaField({
+ id: new fields.StringField({ required: false, blank: true })
+ });
+ schema.roll = new fields.SchemaField({
+ characteristic: new fields.StringField({ required: false, blank: true, trim: true }),
+ skill: new fields.StringField({ required: false, blank: true, trim: true }),
+ difficulty: new fields.StringField({ required: false, blank: true, trim: true })
+ });
+ schema.trash = new fields.BooleanField({ required: false, initial: false });
+ return schema;
+ }
+}
diff --git a/src/module/models/items/career.mjs b/src/module/models/items/career.mjs
new file mode 100644
index 0000000..ae4ae93
--- /dev/null
+++ b/src/module/models/items/career.mjs
@@ -0,0 +1,21 @@
+import { ItemBaseData } from "./base-item.mjs";
+const fields = foundry.data.fields;
+
+export default class CareerData extends ItemBaseData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.difficulty = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });
+ schema.damage = new fields.StringField({ required: false, blank: true });
+ schema.interval = new fields.StringField({ required: false, blank: true });
+ schema.assignment = new fields.StringField({ required: false, blank: true });
+ schema.terms = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
+ schema.rank = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
+ schema.events = new fields.ArrayField(
+ new fields.SchemaField({
+ age: new fields.NumberField({ required: false, integer: true }),
+ description: new fields.StringField({ required: false, blank: true, trim: true })
+ })
+ );
+ return schema;
+ }
+}
diff --git a/src/module/models/items/computer.mjs b/src/module/models/items/computer.mjs
new file mode 100644
index 0000000..470641f
--- /dev/null
+++ b/src/module/models/items/computer.mjs
@@ -0,0 +1,18 @@
+import { PhysicalItemData } from "./base-item.mjs";
+const fields = foundry.data.fields;
+
+export default class ComputerData extends PhysicalItemData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.processing = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
+ schema.processingUsed = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
+ schema.overload = new fields.BooleanField({ required: false, initial: false });
+ schema.options = new fields.ArrayField(
+ new fields.SchemaField({
+ name: new fields.StringField({ required: true, blank: true, trim: true }),
+ description: new fields.StringField({ required: false, blank: true, trim: true })
+ })
+ );
+ return schema;
+ }
+}
diff --git a/src/module/models/items/contact.mjs b/src/module/models/items/contact.mjs
new file mode 100644
index 0000000..eeff7ff
--- /dev/null
+++ b/src/module/models/items/contact.mjs
@@ -0,0 +1,27 @@
+import { ItemBaseData } from "./base-item.mjs";
+const fields = foundry.data.fields;
+
+export default class ContactData extends ItemBaseData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.subType.initial = "skill";
+ schema.cost = new fields.NumberField({ required: true, initial: 1, min: 0, integer: true });
+ schema.skill = new fields.SchemaField({
+ speciality: new fields.StringField({ required: false, blank: true, trim: true }),
+ characteristic: new fields.StringField({ required: false, blank: true, trim: true })
+ });
+ schema.status = new fields.StringField({ required: false, blank: true, trim: true, initial: "Alive" });
+ schema.attitude = new fields.StringField({ required: false, blank: true, trim: true, initial: "Unknow" });
+ schema.relation = new fields.StringField({ required: false, blank: true, trim: true, initial: "Contact" });
+ schema.title = new fields.StringField({ required: false, blank: true, trim: true });
+ schema.nickname = new fields.StringField({ required: false, blank: true, trim: true });
+ schema.species = new fields.StringField({ required: false, blank: true, trim: true });
+ schema.gender = new fields.StringField({ required: false, blank: true, trim: true });
+ schema.pronouns = new fields.StringField({ required: false, blank: true, trim: true });
+ schema.homeworld = new fields.StringField({ required: false, blank: true, trim: true });
+ schema.location = new fields.StringField({ required: false, blank: true, trim: true });
+ schema.occupation = new fields.StringField({ required: false, blank: true, trim: true });
+ schema.notes = new fields.HTMLField({ required: false, blank: true, trim: true });
+ return schema;
+ }
+}
diff --git a/src/module/models/items/container.mjs b/src/module/models/items/container.mjs
new file mode 100644
index 0000000..e72368e
--- /dev/null
+++ b/src/module/models/items/container.mjs
@@ -0,0 +1,16 @@
+import { ItemBaseData } from "./base-item.mjs";
+const fields = foundry.data.fields;
+
+export default class ItemContainerData extends ItemBaseData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.onHand = new fields.BooleanField({ required: false, initial: false });
+ schema.location = new fields.StringField({ required: false, blank: true, trim: true });
+ schema.count = new fields.NumberField({ required: false, initial: 0, integer: true });
+ schema.weight = new fields.NumberField({ required: false, initial: 0, integer: false });
+ schema.weightless = new fields.BooleanField({ required: false, initial: false });
+ schema.locked = new fields.BooleanField({ required: false, initial: false }); // GM only
+ schema.lockedDescription = new fields.StringField({ required: false, blank: true, trim: true, nullable: true });
+ return schema;
+ }
+}
diff --git a/src/module/models/items/disease.mjs b/src/module/models/items/disease.mjs
new file mode 100644
index 0000000..92494d6
--- /dev/null
+++ b/src/module/models/items/disease.mjs
@@ -0,0 +1,13 @@
+import { ItemBaseData } from "./base-item.mjs";
+const fields = foundry.data.fields;
+
+export default class DiseaseData extends ItemBaseData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.subType.initial = "disease"; // disease, poison
+ schema.difficulty = new fields.StringField({ required: true, initial: "Average" });
+ schema.damage = new fields.StringField({ required: false, blank: true });
+ schema.interval = new fields.StringField({ required: false, blank: true });
+ return schema;
+ }
+}
diff --git a/src/module/models/items/equipment.mjs b/src/module/models/items/equipment.mjs
new file mode 100644
index 0000000..097ae7e
--- /dev/null
+++ b/src/module/models/items/equipment.mjs
@@ -0,0 +1,14 @@
+import { PhysicalItemData } from "./base-item.mjs";
+const fields = foundry.data.fields;
+
+export default class EquipmentData extends PhysicalItemData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.equipped = new fields.BooleanField({ required: false, initial: false });
+ schema.augment = new fields.SchemaField({
+ improvement: new fields.StringField({ required: false, blank: true, trim: true })
+ });
+ schema.subType.initial = "equipment"; // augment, clothing, trinket, toolkit, equipment
+ return schema;
+ }
+}
diff --git a/src/module/models/items/item.mjs b/src/module/models/items/item.mjs
new file mode 100644
index 0000000..abb49da
--- /dev/null
+++ b/src/module/models/items/item.mjs
@@ -0,0 +1,15 @@
+import { PhysicalItemData } from "./base-item.mjs";
+const fields = foundry.data.fields;
+
+export default class ItemData extends PhysicalItemData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.subType.initial = "loot";
+ schema.software = new fields.SchemaField({
+ bandwidth: new fields.NumberField({ required: false, initial: 0, min: 0, max: 10, integer: true }),
+ effect: new fields.StringField({ required: false, blank: true, trim: true, initial: "" }),
+ computerId: new fields.StringField({ required: false, blank: true, initial: "" })
+ });
+ return schema;
+ }
+}
diff --git a/src/module/models/items/species.mjs b/src/module/models/items/species.mjs
new file mode 100644
index 0000000..3d4fb6e
--- /dev/null
+++ b/src/module/models/items/species.mjs
@@ -0,0 +1,22 @@
+const fields = foundry.data.fields;
+
+export default class SpeciesData extends foundry.abstract.TypeDataModel {
+ static defineSchema() {
+ return {
+ description: new fields.StringField({ required: false, blank: true, trim: true, nullable: true }),
+ descriptionLong: new fields.HTMLField({ required: false, blank: true, trim: true }),
+ traits: new fields.ArrayField(
+ new fields.SchemaField({
+ name: new fields.StringField({ required: true, blank: true, trim: true }),
+ description: new fields.StringField({ required: false, blank: true, trim: true })
+ })
+ ),
+ modifiers: new fields.ArrayField(
+ new fields.SchemaField({
+ characteristic: new fields.StringField({ required: false, blank: true, trim: true }),
+ value: new fields.NumberField({ required: false, integer: true, nullable: true })
+ })
+ )
+ };
+ }
+}
diff --git a/src/module/models/items/talent.mjs b/src/module/models/items/talent.mjs
new file mode 100644
index 0000000..46c0a8b
--- /dev/null
+++ b/src/module/models/items/talent.mjs
@@ -0,0 +1,27 @@
+import { ItemBaseData } from "./base-item.mjs";
+const fields = foundry.data.fields;
+
+export default class TalentData extends ItemBaseData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.subType.initial = "skill";
+ schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });
+ schema.level = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true });
+ schema.skill = new fields.SchemaField({
+ speciality: new fields.StringField({ required: false, blank: true, trim: true }),
+ reduceEncumbrance: new fields.BooleanField({ required: false, initial: false })
+ });
+ schema.psionic = new fields.SchemaField({
+ reach: new fields.StringField({ required: false, blank: true, trim: true }),
+ cost: new fields.NumberField({ required: false, initial: 1, min: 0, integer: true }),
+ duration: new fields.StringField({ required: false, blank: true, trim: true }),
+ durationUnit: new fields.StringField({ required: false })
+ });
+ schema.roll = new fields.SchemaField({
+ characteristic: new fields.StringField({ required: false, blank: true, trim: true }),
+ skill: new fields.StringField({ required: false, blank: true, trim: true }),
+ difficulty: new fields.StringField({ required: false, blank: true, trim: true })
+ });
+ return schema;
+ }
+}
diff --git a/src/module/models/items/weapon.mjs b/src/module/models/items/weapon.mjs
new file mode 100644
index 0000000..e1b0273
--- /dev/null
+++ b/src/module/models/items/weapon.mjs
@@ -0,0 +1,30 @@
+import { PhysicalItemData } from "./base-item.mjs";
+const fields = foundry.data.fields;
+
+export default class WeaponData extends PhysicalItemData {
+ static defineSchema() {
+ const schema = super.defineSchema();
+ schema.equipped = new fields.BooleanField({ required: false, initial: false });
+ schema.range = new fields.SchemaField({
+ isMelee: new fields.BooleanField({ required: false, initial: false }),
+ value: new fields.NumberField({ required: false, integer: true, nullable: true }),
+ unit: new fields.StringField({ required: false, blank: true, nullable: true })
+ });
+ schema.damage = new fields.StringField({ required: false, blank: true, trim: true });
+ schema.magazine = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
+ schema.magazineCost = new fields.NumberField({ required: false, initial: 0, min: 0, integer: true });
+ schema.traits = new fields.ArrayField(
+ new fields.SchemaField({
+ name: new fields.StringField({ required: true, blank: true, trim: true }),
+ description: new fields.StringField({ required: false, blank: true, trim: true })
+ })
+ );
+ schema.options = new fields.ArrayField(
+ new fields.SchemaField({
+ name: new fields.StringField({ required: true, blank: true, trim: true }),
+ description: new fields.StringField({ required: false, blank: true, trim: true })
+ })
+ );
+ return schema;
+ }
+}
diff --git a/src/module/models/vehicule.mjs b/src/module/models/vehicule.mjs
new file mode 100644
index 0000000..ac4e8b5
--- /dev/null
+++ b/src/module/models/vehicule.mjs
@@ -0,0 +1,33 @@
+const fields = foundry.data.fields;
+
+export default class VehiculeData extends foundry.abstract.TypeDataModel {
+
+ static defineSchema() {
+ return {
+ name: new fields.StringField({ required: false, blank: false, trim: true }),
+ skillId: new fields.StringField({ required: false, initial: "", blank: true, trim: true }),
+ speed: new fields.SchemaField({
+ cruise: new fields.StringField({ required: false, initial: "Slow", blank: true }),
+ maximum: new fields.StringField({ required: false, initial: "Medium", blank: true })
+ }),
+ agility: new fields.NumberField({ required: false, min: 0, integer: true }),
+ crew: new fields.NumberField({ required: false, min: 0, integer: true }),
+ passengers: new fields.NumberField({ required: false, min: 0, integer: true }),
+ cargo: new fields.NumberField({ required: false, min: 0, integer: false }),
+ life: new fields.SchemaField({
+ value: new fields.NumberField({ required: true, initial: 0, integer: true }),
+ max: new fields.NumberField({ required: true, initial: 0, integer: true })
+ }),
+ shipping: new fields.NumberField({ required: false, min: 0, integer: true }),
+ cost: new fields.NumberField({ required: false, min: 0, integer: true }),
+ armor: new fields.SchemaField({
+ front: new fields.NumberField({ required: true, initial: 0, integer: true }),
+ rear: new fields.NumberField({ required: true, initial: 0, integer: true }),
+ sides: new fields.NumberField({ required: true, initial: 0, integer: true })
+ }),
+ skills: new fields.SchemaField({
+ autopilot: new fields.NumberField({ required: true, initial: 0, integer: true })
+ })
+ };
+ }
+}