diff --git a/assets/screens/rosette-nebula-ngc2239-hoo.webp b/assets/screens/rosette-nebula-ngc2239-hoo.webp new file mode 100644 index 0000000..de309f4 Binary files /dev/null and b/assets/screens/rosette-nebula-ngc2239-hoo.webp differ diff --git a/lang/en.json b/lang/en.json new file mode 100644 index 0000000..66ff194 --- /dev/null +++ b/lang/en.json @@ -0,0 +1,426 @@ +{ + "TYPES.Item.armor": "Armor", + "TYPES.Item.augment": "Augment", + "TYPES.Item.career": "Career", + "TYPES.Item.contact": "Contact", + "TYPES.Item.computer": "Computer", + "TYPES.Item.disease": "Disease", + "TYPES.Item.item": "Item", + "TYPES.Item.equipment": "Equipment", + "TYPES.Item.talent": "Skill & Psionic Talent", + "TYPES.Item.species": "Espèce", + "TYPES.Item.weapon": "Weapon", + "TYPES.Item.container": "Container (backpack, chest)", + "TYPES.Actor.character": "Traveller", + "TYPES.Actor.vehicule": "Vehicule", + "TYPES.Actor.container": "Container (backpack, chest)", + "MGT2": { + "Themes": { + "BlackAndRed": "Classic Traveller Cover", + "Mwamba": "Oppa Mwamba Style" + }, + "Settings": { + "theme": { + "name": "Choice color theme", + "hint": "Choice a theme for color" + }, + "useWeightMetric": { + "name": "Use Metric system for WEIGHT", + "hint": "kilogram (kg) instead of pounds (lbs)" + }, + "useDistanceMetric": { + "name": "Use Metric system for DISTANCE", + "hint": "kilometer (km) instead of mile (mi)" + }, + "usePronouns": { + "name": "Use Pronouns", + "hint": "Displays the fields that allow you to enter pronouns" + }, + "useGender": { + "name": "Use Gender", + "hint": "Displays the fields that allow you to enter a gender" + }, + "showLife": { + "name": "Show Life in sheet", + "hint": "Show life information in actor sheet" + } + }, + "Specie": "Specie", + "Species": "Species", + "Gender": "Gender", + "Pronouns": "Pronouns", + "Actor": { + "StudyPeriod":"Study Period", + "TrainingInSkill":"Training In Skill", + "Completed":"Completed", + "Weeks":"Weeks", + "NewCareer":"New Career", + "AddCareer":"Add Career", + "EditCareer":"Edit Career", + "DeleteCareer":"Delete Career", + "NewSkill":"New Skill", + "DeleteSkill":"Delete Skill", + "EditSkill":"EditSkill", + "PsionicTalents":"Psionic Talents", + "NewPsionicTalent": "New Psionic Talent", + "AddPsionicTalent": "Add Psionic Talent", + "EditPsionic": "Edit Psionic", + "DeletePsionic": "Delete Psionic", + "AddArmor": "Add Armor", + "AddAugment": "Add Augment", + "AddContact": "Add Contact", + "AddDisease": "Add Disease", + "AddEquipment": "Add Equipment", + "AddItem": "Add Item", + "AddWeapon": "Add Weapon", + "AddWound": "Add Wound", + "Armor": "Armor", + "Armors": "Armors", + "Augments": "Augments", + "Biography": "Biography", + "CashOnHand": "Cash On Hand", + "Characteristic": "Characteristic", + "Contacts": "Contacts", + "Damage": "Damage", + "DamageOrder": "Damage Order", + "Debt": "Debt", + "DeleteArmor": "Delete Armor", + "DeleteAugment": "Delete Augment", + "DeleteContact": "Delete Contact", + "DeleteDisease": "Delete Disease", + "DeleteEquipment": "DeleteEquipment", + "DeleteItem": "Delete Item", + "DeleteSoftware": "Delete Software", + "DeleteWeapon": "Delete Weapon", + "DeleteWound": "Delete Wound", + "EditArmor": "Edit Armor", + "EditAugment": "Edit Augment", + "EditContact": "Edit Contact", + "EditDisease": "Edit Disease", + "EditItem": "Edit Item", + "EditSoftware": "Edit Software", + "EditWeapon": "Edit Weapon", + "EditWound": "Edit Wound", + "Encumbrance": "Encumbrance", + "EncumbranceHint": "DM -2 on all physical actions. They will also count as performing heavy labour.", + "Fatigue": "Fatigue", + "FatigueHint": "DM -2 to all checks until full rest.", + "Finance": "Finance", + "Health": "Health", + "HiddenCharacteristics": "Hidden Characteristics", + "Initiative": "Initiative", + "Inventory": "Inventory", + "Life": "Life", + "LivingCost": "Living Cost", + "NewArmor": "New Armor", + "NewAugment": "New Augment", + "NewContact": "New Contact", + "NewDiseases": "New Diseases", + "NewEquipment": "New Equipment", + "NewItem": "New Item", + "NewWeapon": "New Weapon", + "NewWound": "New Wound", + "Notes": "Notes", + "Pension": "Pension", + "PlaceholderAGE": "AGE", + "PlaceholderGENDER": "GENDER", + "PlaceholderPRONOUNS": "PRONOUNS", + "PlaceholderSPECIES": "SPECIES", + "PlaceholderTITLE": "TITLE", + "PlaceholderUCP": "UCP", + "Rads": "Rads", + "RelationsAndContacts": "Relations & Contacts", + "ShowHiddenFields": "Show hidden fields", + "ShowMinMax": "Show Min/Max", + "ShowPsionicTalents": "Show Psionic Talents", + "Skills": "Skills", + "States": "States", + "StoreEquipment": "Store Equipment", + "StoreItem": "Store Item", + "SurgeryRequired": "Surgery Required", + "SurgeryRequiredHint": "Recover only the END DM (can get worse).", + "TabCore": "CORE", + "TabOthers": "OTHERS", + "TotalWeight": "Total Weight", + "UnloadSoftware": "Unload Software", + "UnstoreItem": "UnstoreItem", + "Wounds": "Wounds", + "Show": "Show" + }, + "Characteristics": { + "strength": { + "name": "Strength", + "short": "STR" + }, + "dexterity": { + "name": "Dexterity", + "short": "DEX" + }, + "endurance": { + "name": "Endurance", + "short": "END" + }, + "intellect": { + "name": "Intellect", + "short": "INT" + }, + "education": { + "name": "Education", + "short": "EDU" + }, + "social": { + "name": "Social", + "short": "SOC" + }, + "morale": { + "name": "Morale", + "short": "MOR" + }, + "luck": { + "name": "Luck", + "short": "LUC" + }, + "sanity": { + "name": "Sanity", + "short": "SAN" + }, + "charm": { + "name": "Charm", + "short": "CHA" + }, + "psionic": { + "name": "Psionic", + "short": "PSI" + }, + "other": { + "name": "Other", + "short": "OTH" + } + }, + "MetricSystem": { + "Weight": { + "kg": "kg" + }, + "Distance": { + "km": "km" + } + }, + "ImperialSystem": { + "Weight": { + "lb": "lb" + }, + "Distance": { + "mi": "mi" + } + }, + "Melee": "Melee", + "MetricRange": { + "meter": "M", + "kilometer": "KM" + }, + "MetricWeight": { + "kilogram": "KG", + "ton": "TON" + }, + "EquipmentSubType": { + "augment": "Augment", + "clothing": "Clothing", + "equipment": "Equipment", + "computer": "Computer", + "trinket": "trinket", + "toolkit": "toolkit" + }, + "ItemSubType": { + "loot": "Loot", + "software": "Software" + }, + "DiseaseSubType": { + "disease": "Disease", + "poison": "Poison", + "wound": "Wound" + }, + "Difficulty": { + "NA": "Not Applicable", + "Simple": "Simple", + "Easy": "Easy", + "Routine": "Routine", + "Average": "Average", + "Difficult": "Difficult", + "VeryDifficult": "Very Difficult", + "Formidable": "Formidable", + "Impossible": "Impossible" + }, + "PsionicReach": { + "NA": "N/A", + "Personal": "Personal", + "Close": "Close", + "Short": "Short", + "Medium": "Medium", + "Long": "Long", + "VeryLong": "VeryLong", + "Distant": "Distant", + "VeryDistant": "VeryDistant", + "Continental": "Continental", + "Planetary": "Planetary" + }, + "TalentSubType": { + "skill": "Skill", + "psionic": "Psionic talent" + }, + "Contact": { + "Attitude": { + "Unknow": "Unknow", + "Hostile": "Hostile", + "Unfriendly": "Unfriendly", + "Indifferent": "Indifferent", + "Friendly": "Friendly", + "Helpful": "Helpful", + "Complicated": "Complicated" + }, + "Relation": { + "Allie": "Allie", + "Contact": "Contact", + "Rival": "Rival", + "Enemy": "Enemy" + }, + "Status": { + "Alive": "Alive", + "Unknow": "Unknow", + "Dead": "Dead" + } + }, + "TL": { + "NA": "N/A", + "Unknow": "Unknow", + "NotIdentified": "Not Identified", + "L00": "TL0", + "L01": "TL1", + "L02": "TL2", + "L03": "TL3", + "L04": "TL4", + "L05": "TL5", + "L06": "TL6", + "L07": "TL7", + "L08": "TL8", + "L09": "TL9", + "L10": "TL10", + "L11": "TL11", + "L12": "TL12", + "L13": "TL13", + "L14": "TL14", + "L15": "TL15" + }, + "RollPrompt": { + "Title": "Roll: ", + "CharacteristicRoll": "Characteristic Roll", + "Roll": "Roll", + "SkillRoll": "Skill Roll", + "ItemRoll": "Item Roll", + "PsionicRoll": "Psionic Roll", + "InitiativeRoll": "Initiative", + "CharacteristicDM": "Characteristic DM", + "SkillDM": "Skill DM", + "Timeframes": "Timeframes", + "States": "States", + "CustomDM": "Custom DM", + "Difficulty": "Difficulty", + "RollMode": "Roll Mode", + "PublicRoll": "Public Roll", + "PrivateGMRoll": "Private GM Roll", + "BlindGMRoll": "Blind GM Roll", + "SelfRoll": "Self Roll", + "EncumbranceDM": "Encumbrance (DM -2)", + "FatigueDM": "Fatigue (DM -2)", + "Boon": "Boon", + "Bane": "Bane" + }, + "Timeframes": { + "Normal": "Normal", + "Slower": "Slower (+2)", + "Faster": "Faster (-2)" + }, + "Chat": { + "Roll": { + "ApplyDamages": "Apply Damages", + "Damages": "Roll damages" + } + }, + "Items": { + "Age": "Age", + "Armor": "Armor", + "Armors": "Armors", + "Assignment": "Assignment", + "Attitude": "Attitude", + "Bandwidth": "Bandwidth", + "Career": "Career", + "Careers": "Careers", + "Characteristic": "Characteristic", + "Characteristics": "Characteristics", + "Computer": "Computer", + "Computers": "Computers", + "Configuration": "Configuration", + "Contact": "Contact", + "Container": "Container", + "Containers": "Containers", + "Cost": "Cost", + "Damage": "Damage", + "Description": "Description", + "Details": "Details", + "Disease": "Disease", + "Diseases": "Diseases", + "Difficulty": "Difficulty", + "Equipped": "Equipped", + "Equipment": "Equipment", + "Equipments": "Equipments", + "EventsMishaps": "Events & Mishaps", + "Homeworld": "Homeworld", + "Informations": "Informations", + "Improvement": "Improvement", + "Interval": "Interval", + "IsMelee": "IsMelee", + "Items": "Items", + "Level": "Level", + "Location": "Location", + "Locked": "Locked", + "LockedDescription": "Locked Description", + "Magazine": "Magazine", + "MagazineCost": "Magazine Cost", + "Nickname": "Nickname", + "NotProficient": "Not proficient (-3)", + "Notes": "Notes", + "Occupation": "Occupation", + "OnHand": "On Hand", + "Options": "Options", + "PSICost": "PSI Cost", + "Powered": "Powered", + "Processing": "Processing", + "Protection": "Protection", + "PsionicSkill": "Psionic Skill", + "Qty": "Qty", + "Radiations": "Radiations", + "Rads": "Rads", + "Range": "Range", + "Rank": "Rank", + "Reach": "Reach", + "ReduceEncumbrance": "Reduce Encumbrance", + "Relation": "Relation", + "Relations": "Relations", + "Skill": "Skill", + "Speciality": "Speciality", + "Status": "Status", + "Storage": "Storage", + "Software": "Software", + "Softwares": "Softwares", + "TL": "TL", + "Terms": "Terms", + "Title": "Title", + "Trait": "Trait", + "Type": "Type", + "Weapon": "Weapon", + "Weapons": "Weapons", + "Weight": "Weight", + "Weightless": "Weightless", + "Quantity": "Quantity" + } + } +} \ No newline at end of file diff --git a/lang/fr.json b/lang/fr.json new file mode 100644 index 0000000..a733662 --- /dev/null +++ b/lang/fr.json @@ -0,0 +1,426 @@ +{ + "TYPES.Item.armor": "Armure", + "TYPES.Item.augment": "Augmentation", + "TYPES.Item.career": "Carrière", + "TYPES.Item.contact": "Contact", + "TYPES.Item.computer": "Ordinateur", + "TYPES.Item.disease": "Maladie, Poison & Blessure", + "TYPES.Item.item": "Objet", + "TYPES.Item.equipment": "Équipment", + "TYPES.Item.talent": "Compétence & Talent Psy", + "TYPES.Item.race": "Race", + "TYPES.Item.weapon": "Arme", + "TYPES.Item.container": "Contenant (sac, coffre)", + "TYPES.Actor.character": "Voyageur", + "TYPES.Actor.vehicule": "Véhicule", + "TYPES.Actor.container": "Contenant (sac, coffre)", + "MGT2": { + "Themes": { + "BlackAndRed": "Couverture Classique Traveller", + "Mwamba": "Oppa Mwamba Style" + }, + "Settings": { + "theme": { + "name": "Thème", + "hint": "Choisissez un thème" + }, + "useWeightMetric": { + "name": "Utiliser le Système Métrique pour le Poid", + "hint": "kilogramme (kg) au lieu de la livre (lbs)" + }, + "useDistanceMetric": { + "name": "Utiliser le Système Métrique pour la Distance", + "hint": "kilomètre (km) au lieu du mile (mi)" + }, + "usePronouns": { + "name": "Utiliser le Pronom", + "hint": "Afficher le champs qui permet de saisir le pronom" + }, + "useGender": { + "name": "Utiliser le Genre", + "hint": "Afficher le champs qui permet de saisir le genre" + }, + "showLife": { + "name": "Afficher la Vie sur la fiche", + "hint": "Affiche le compteur de vie sur la fiche" + } + }, + "Specie": "Espèce", + "Species": "Espèces", + "Gender": "Genre", + "Pronouns": "Pronoms", + "Actor": { + "StudyPeriod":"Période d'étude", + "TrainingInSkill":"Compétence en formation", + "Completed":"Completée", + "Weeks":"Semaines", + "NewCareer":"Nouvelle Carrière", + "AddCareer":"Ajouter Carrière", + "EditCareer":"Éditer Carrière", + "DeleteCareer":"Supprimer Carrière", + "NewSkill":"Nouvelle Compétence", + "DeleteSkill":"Supprimer Compétence", + "EditSkill":"Éditer Compétence", + "PsionicTalents":"Talents Psionique", + "NewPsionicTalent": "Nouveau Talent Psionique", + "AddPsionicTalent": "Ajouter Talent Psionique", + "EditPsionic": "Éditer Talent Psionique", + "DeletePsionic": "Supprimer Talent Psionique", + "AddArmor": "Ajouter Armure", + "AddAugment": "Ajouter Augmentation", + "AddContact": "Ajouter Contact", + "AddDisease": "Ajouter Maladie", + "AddEquipment": "Ajouter Équipement", + "AddItem": "Ajouter Objet", + "AddWeapon": "Ajouter Arme", + "AddWound": "Ajouter Blessure", + "Armor": "Armure", + "Armors": "Armures", + "Augments": "Augmentations", + "Biography": "Biographie", + "CashOnHand": "Crédits en main", + "Characteristic": "Caractéristique", + "Contacts": "Contacts", + "Damage": "Dégâts", + "DamageOrder": "Ordre des dégâts", + "Debt": "Dette", + "DeleteArmor": "Supprimer Armure", + "DeleteAugment": "Supprimer Augmentation", + "DeleteContact": "Supprimer Contact", + "DeleteDisease": "Supprimer Malaide", + "DeleteEquipment": "Supprimer Équipement", + "DeleteItem": "Supprimer Objet", + "DeleteSoftware": "Supprimer Logiciel", + "DeleteWeapon": "Supprimer Arme", + "DeleteWound": "Supprimer Blessure", + "EditArmor": "Éditer Armure", + "EditAugment": "Éditer Augmentation", + "EditContact": "Éditer Contact", + "EditDisease": "Éditer Maladie", + "EditItem": "Éditer Objet", + "EditSoftware": "Éditer Logiciel", + "EditWeapon": "Éditer Arme", + "EditWound": "Éditer Blessure", + "Encumbrance": "Encombrement", + "EncumbranceHint": "DM -2 on all physical actions. They will also count as performing heavy labour.", + "Fatigue": "Fatigue", + "FatigueHint": "DM -2 to all checks until full rest.", + "Finance": "Finance", + "Health": "Santé", + "HiddenCharacteristics": "Caractéristiques cachées", + "Initiative": "Initiative", + "Inventory": "Inventaire", + "Life": "Vie", + "LivingCost": "Coût de la vie", + "NewArmor": "Nouvelle Armure", + "NewAugment": "Nouvelle Augmentation", + "NewContact": "Nouveau Contact", + "NewDiseases": "Nouvelle Maladie", + "NewEquipment": "Nouvelle Équipement", + "NewItem": "Nouveau Objet", + "NewWeapon": "Nouvel Arme", + "NewWound": "Nouvelle Blessure", + "Notes": "Notes", + "Pension": "Pension", + "PlaceholderAGE": "ÂGE", + "PlaceholderGENDER": "GENRE", + "PlaceholderPRONOUNS": "PRONOMS", + "PlaceholderSPECIES": "ESPÈCE", + "PlaceholderTITLE": "TITRE", + "PlaceholderUCP": "PUP", + "Rads": "Rads", + "RelationsAndContacts": "Relations & Contacts", + "ShowHiddenFields": "Afficher les champs cachés", + "ShowMinMax": "Afficher le Min/Max", + "ShowPsionicTalents": "Afficher les Talents Psy", + "Skills": "Compétences", + "States": "États", + "StoreEquipment": "Entreposer Équipement", + "StoreItem": "Entreposer Objet", + "SurgeryRequired": "Chirugie requise", + "SurgeryRequiredHint": "Recover only the END DM (can get worse).", + "TabCore": "P", + "TabOthers": "A", + "TotalWeight": "Poids total", + "UnloadSoftware": "Éjecter le Logiciel", + "UnstoreItem": "Rependre", + "Wounds": "Blessures", + "Show": "Afficher" + }, + "Characteristics": { + "strength": { + "name": "Force", + "short": "FOR" + }, + "dexterity": { + "name": "Dexterité", + "short": "DEX" + }, + "endurance": { + "name": "Endurance", + "short": "END" + }, + "intellect": { + "name": "Intellect", + "short": "INT" + }, + "education": { + "name": "Éducation", + "short": "ÉDU" + }, + "social": { + "name": "Sociale", + "short": "SOC" + }, + "morale": { + "name": "Moral", + "short": "MOR" + }, + "luck": { + "name": "Chance", + "short": "CHA" + }, + "sanity": { + "name": "Mentale", + "short": "MEN" + }, + "charm": { + "name": "Charme", + "short": "CHA" + }, + "psionic": { + "name": "Psionique", + "short": "PSI" + }, + "other": { + "name": "Autre", + "short": "AUT" + } + }, + "MetricSystem": { + "Weight": { + "kg": "kg" + }, + "Distance": { + "km": "km" + } + }, + "ImperialSystem": { + "Weight": { + "lb": "lb" + }, + "Distance": { + "mi": "mi" + } + }, + "Melee": "Mêlée", + "MetricRange": { + "meter": "M", + "kilometer": "KM" + }, + "MetricWeight": { + "kilogram": "KG", + "ton": "TON" + }, + "EquipmentSubType": { + "augment": "Augmentation", + "clothing": "Vêtement", + "equipment": "Équipement", + "computer": "Ordinateur", + "trinket": "Babiole", + "toolkit": "Outils" + }, + "ItemSubType": { + "loot": "Butin", + "software": "Logiciel" + }, + "DiseaseSubType": { + "disease": "Maladie", + "poison": "Poison", + "wound": "Blessure" + }, + "Difficulty": { + "NA": "N/A", + "Simple": "Simple", + "Easy": "Facile", + "Routine": "Routine", + "Average": "Moyenne", + "Difficult": "Difficile", + "VeryDifficult": "Très Difficile", + "Formidable": "Formidable", + "Impossible": "Impossible" + }, + "PsionicReach": { + "NA": "N/A", + "Personal": "Personel", + "Close": "Close", + "Short": "Courte", + "Medium": "Moyenne", + "Long": "Longue", + "VeryLong": "Très Longue", + "Distant": "Distant", + "VeryDistant": "Très Distant", + "Continental": "Continental", + "Planetary": "Planétaire" + }, + "TalentSubType": { + "skill": "Compétence", + "psionic": "Talent Psionique" + }, + "Contact": { + "Attitude": { + "Unknow": "Inconnu", + "Hostile": "Hostile", + "Unfriendly": "Non favorable", + "Indifferent": "Indifférente", + "Friendly": "Amicale", + "Helpful": "Aidante", + "Complicated": "Compliqué" + }, + "Relation": { + "Allie": "Allié", + "Contact": "Contact", + "Rival": "Rival", + "Enemy": "Ennemie" + }, + "Status": { + "Alive": "En vie", + "Unknow": "Inconnu", + "Dead": "Mort" + } + }, + "TL": { + "NA": "N/A", + "Unknow": "Inconnue", + "NotIdentified": "Non Identifié", + "L00": "TL0", + "L01": "TL1", + "L02": "TL2", + "L03": "TL3", + "L04": "TL4", + "L05": "TL5", + "L06": "TL6", + "L07": "TL7", + "L08": "TL8", + "L09": "TL9", + "L10": "TL10", + "L11": "TL11", + "L12": "TL12", + "L13": "TL13", + "L14": "TL14", + "L15": "TL15" + }, + "RollPrompt": { + "Title": "Jet: ", + "CharacteristicRoll": "Jet de caractéristique", + "Roll": "Jet", + "SkillRoll": "Jet de Compétence", + "ItemRoll": "Jet d'Objet", + "PsionicRoll": "Jet de Psionique", + "InitiativeRoll": "Initiative", + "CharacteristicDM": "Caractéristique MD", + "SkillDM": "Compétence MD", + "Timeframes": "Délais MD", + "States": "États", + "CustomDM": "MD Personnalisé", + "Difficulty": "Difficulté", + "RollMode": "Style de Jet", + "PublicRoll": "Jet Public", + "PrivateGMRoll": "Jet Privé au MJ", + "BlindGMRoll": "Jet Aveugle au MJ", + "SelfRoll": "Jet pour Soi", + "EncumbranceDM": "Encombrement (MD -2)", + "FatigueDM": "Fatigue (MD -2)", + "Boon": "Avantage", + "Bane": "Désavantage" + }, + "Timeframes": { + "Normal": "Normal", + "Slower": "Lent (+2)", + "Faster": "Rapide (-2)" + }, + "Chat": { + "Roll": { + "ApplyDamages": "Appliquer Dégâts", + "Damages": "Lancer les Dégâts" + } + }, + "Items": { + "Age": "Âge", + "Armor": "Armure", + "Armors": "Armures", + "Assignment": "Affectation", + "Attitude": "Attitude", + "Bandwidth": "Bande passante", + "Career": "Carrière", + "Careers": "Carrières", + "Characteristic": "Caracteristique", + "Characteristics": "Caracteristiques", + "Computer": "Ordinateur", + "Computers": "Ordinateurs", + "Configuration": "Configuration", + "Contact": "Contact", + "Container": "Conteneur", + "Containers": "Conteneurs", + "Cost": "Coût", + "Damage": "Dégâts", + "Description": "Description", + "Details": "Détails", + "Difficulty": "Difficulté", + "Disease": "Maladie", + "Diseases": "Maladies", + "Equipped": "Équipé", + "Equipment": "Équipement", + "Equipments": "Équipements", + "EventsMishaps": "Événements & Incidents", + "Homeworld": "Monde Natal", + "Informations": "Informations", + "Improvement": "Améliorations", + "Interval": "Intervalle", + "IsMelee": "Est Mêlée", + "Items": "Objets", + "Level": "Niveau", + "Location": "Localisation", + "Locked": "Verrouillé", + "LockedDescription": "Description Verrouillé", + "Magazine": "Chargeur", + "MagazineCost": "Coût du Chargeur", + "Nickname": "Surnom", + "NotProficient": "Incompétent (-3)", + "Notes": "Notes", + "Occupation": "Profession", + "OnHand": "Sur Soi", + "Options": "Options", + "PSICost": "Coût PSI", + "Powered": "Alimenté", + "Processing": "Traitement", + "Protection": "Protection", + "PsionicSkill": "Compétence Psionique", + "Qty": "Qté", + "Radiations": "Radiations", + "Rads": "Rads", + "Range": "Portée", + "Rank": "Rang", + "Reach": "Portée", + "ReduceEncumbrance": "Réduit l'Encombrement", + "Relation": "Relation", + "Relations": "Relations", + "Skill": "Compétence", + "Speciality": "Spécialité", + "Status": "Statut", + "Storage": "Stockage", + "Software": "Logiciel", + "Softwares": "Logiciels", + "TL": "TL", + "Terms": "Termes", + "Title": "Titre", + "Trait": "Trait", + "Type": "Type", + "Weapon": "Arme", + "Weapons": "Armes", + "Weight": "Poid", + "Weightless": "Aucun Poid", + "Quantity": "Quantité" + } + } +} \ No newline at end of file diff --git a/mgt2.bundle.js b/mgt2.bundle.js new file mode 100644 index 0000000..886f2ee --- /dev/null +++ b/mgt2.bundle.js @@ -0,0 +1,2412 @@ +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 }), + 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: "" }) + }), + 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 }) + }); + 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 ItemBaseData { + static defineSchema() { + const schema = super.defineSchema(); + 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; + } +} +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 }) + }); +} + +const MGT2$1 = {}; +MGT2$1.MetricRange = Object.freeze({ + meter: "MGT2.MetricRange.meter", + kilometer: "MGT2.MetricRange.kilometer" +}); +MGT2$1.MetricWeight = Object.freeze({ + kilogram: "MGT2.MetricWeight.kilogram", + ton: "MGT2.MetricWeight.ton" +}); +MGT2$1.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" +}); +MGT2$1.ItemSubType = Object.freeze({ + loot: "MGT2.ItemSubType.loot", + software: "MGT2.ItemSubType.software" +}); +MGT2$1.EquipmentSubType = Object.freeze({ + augment: "MGT2.EquipmentSubType.augment", + clothing: "MGT2.EquipmentSubType.clothing", + equipment: "MGT2.EquipmentSubType.equipment", + trinket: "MGT2.EquipmentSubType.trinket", + toolkit: "MGT2.EquipmentSubType.toolkit" +}); +MGT2$1.TalentSubType = Object.freeze({ + skill: "MGT2.TalentSubType.skill", + psionic: "MGT2.TalentSubType.psionic" +}); +MGT2$1.DiseaseSubType = Object.freeze({ + disease: "MGT2.DiseaseSubType.disease", + poison: "MGT2.DiseaseSubType.poison", + wound: "MGT2.DiseaseSubType.wound" +}); +MGT2$1.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" +}); +MGT2$1.ContactRelations = Object.freeze({ + Allie: "MGT2.Contact.Relation.Allie", + Contact: "MGT2.Contact.Relation.Contact", + Rival: "MGT2.Contact.Relation.Rival", + Enemy: "MGT2.Contact.Relation.Enemy" +}); +MGT2$1.ContactStatus = Object.freeze({ + Alive: "MGT2.Contact.Status.Alive", + Unknow: "MGT2.Contact.Status.Unknow", + Dead: "MGT2.Contact.Status.Dead" +}); +MGT2$1.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" +}); +MGT2$1.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" +}); +MGT2$1.InitiativeCharacteristics = Object.freeze({ + dexterity: "MGT2.Characteristics.dexterity.name", + intellect: "MGT2.Characteristics.intellect.name" +}); +MGT2$1.DamageCharacteristics = Object.freeze({ + strength: "MGT2.Characteristics.strength.name", + dexterity: "MGT2.Characteristics.dexterity.name", + endurance: "MGT2.Characteristics.endurance.name" +}); +MGT2$1.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" +}); +MGT2$1.Timeframes = Object.freeze({ + Normal: "MGT2.Timeframes.Normal", + Slower: "MGT2.Timeframes.Slower", + Faster: "MGT2.Timeframes.Faster" +}); +MGT2$1.SpeedBands = Object.freeze({ + Stoppped: "MGT2.Stoppped", + Idle: "MGT2.Idle", + VerySlow: "MGT2.VerySlow", + Slow: "MGT2.Slow", + Medium: "MGT2.Medium", + High: "MGT2.High.", + Fast: "MGT2.Fast", + VeryFast: "MGT2.VeryFast", + Subsonic: "MGT2.Subsonic", + Hypersonic: "MGT2.Hypersonic" +}); + +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") { + 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") { + 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 (toDeleteIds.length > 0) + await $this.deleteEmbeddedDocuments("Item", toDeleteIds); + if (itemToUpdates.length > 0) + await $this.updateEmbeddedDocuments("Item", itemToUpdates); + await $this.recalculateWeight(); + } + 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 = duplicate($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) { + 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; + } + } + i++; + } + if (recalculEncumbrance || recalculWeight) { + const cloneActor = duplicate($this); + await this.recalculateArmor($this, cloneActor); + if (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 === void 0) + cloneActor = duplicate($this); + 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; + } + } + } + cloneActor.system.inventory.armor = armor; + } + static async recalculateWeight($this, cloneActor) { + if (cloneActor === null || cloneActor === void 0) + cloneActor = duplicate($this); + 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; + } + } + if (item.type === "armor") { + if (item.system.equipped === true) { + if (item.system.powered === true) + itemWeight = 0; + else + itemWeight *= 0.25; + } + } + 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; + } + } + } + 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; + } + } + } + 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); + } + } + static async preUpdate($this, changed, options, user) { + var _a, _b, _c, _d, _e, _f, _g, _h; + const newStr = (_a = foundry.utils.getProperty(changed, "system.characteristics.strength.value")) != null ? _a : $this.system.characteristics.strength.value; + const newEnd = (_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 += 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 = (_c = foundry.utils.getProperty(changed, "system.characteristics.strength.value")) != null ? _c : $this.system.characteristics.strength.value; + const strengthMax = (_d = foundry.utils.getProperty(changed, "system.characteristics.strength.max")) != null ? _d : $this.system.characteristics.strength.max; + const dexterityValue = (_e = foundry.utils.getProperty(changed, "system.characteristics.dexterity.value")) != null ? _e : $this.system.characteristics.dexterity.value; + const dexterityMax = (_f = foundry.utils.getProperty(changed, "system.characteristics.dexterity.max")) != null ? _f : $this.system.characteristics.dexterity.max; + const enduranceValue = (_g = foundry.utils.getProperty(changed, "system.characteristics.endurance.value")) != null ? _g : $this.system.characteristics.endurance.value; + const enduranceMax = (_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 = foundry.utils.getProperty(changed, path + ".value"); + if (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 (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); + 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 (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 []; + } +} + +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 (this.type === "computer") { + const newProcessing = (_a = foundry.utils.getProperty(changed, "system.processing")) != null ? _a : 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; + if (newQty !== this.system.quantity && newQty > 1) { + foundry.utils.setProperty(changed, "system.quantity", 1); + } + } + if (this.type === "item" && this.system.subType === "software") { + const newWeight = (_c = foundry.utils.getProperty(changed, "system.weight")) != null ? _c : 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) { + 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 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 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 !== void 0 && range.unit !== "") + label = game.i18n.localize(`MGT2.MetricRange.${range.unit}`).toLowerCase(); + else + label = ""; + } + 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); + } + static getDistanceLabel() { + const label = game.settings.get("mgt2", "useDistanceMetric") === true ? "MGT2.MetricSystem.Distance.km" : "MGT2.ImperialSystem.Distance.mi"; + return game.i18n.localize(label); + } + 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) { + if (game.settings.get("mgt2", "useWeightMetric") === true || weight === 0) + return weight; + 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; + const kg = this.POUNDS_CONVERT / weight; + return Math.round(kg * 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 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 === "." ? "," : "."; +let MGT2Helper = _MGT2Helper; + +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; + } + let weight = null; + if (item.system.hasOwnProperty("weight")) { + weight = MGT2Helper.convertWeightForDisplay(item.system.weight); + } + 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() }); + } + } + } + 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 == "weapon") { + html.find(".options-create").click(this._onOptionCreate.bind(this)); + html.find(".options-delete").click(this._onOptionDelete.bind(this)); + } + } + 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: "" + }; + } + } else if (containerChange) { + if (formData.system.container.id !== "" && (this.item.system.container.id === "" || this.item.system.container.id === null)) { + formData.system.equipped = false; + } + } + } + if (formData.hasOwnProperty("weight")) { + formData.system.weight = MGT2Helper.convertWeightFromInput(formData.weight); + delete formData.weight; + } + if (formData.system.hasOwnProperty("quantity")) { + formData.system.quantity = MGT2Helper.getIntegerFromInput(formData.system.quantity); + } + if (formData.system.hasOwnProperty("cost")) { + formData.system.cost = MGT2Helper.getIntegerFromInput(formData.system.cost); + } + 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 + }); + 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; + } +} +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); + }); + } +} + +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: "Save", + icon: '', + callback: (html) => { + 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); + } +} +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: "Save", + icon: '', + callback: (html) => { + const formData = new FormDataExtended(html[0].querySelector("form")).object; + resolve(formData); + } + } + } + }).render(true); + }); + return results; + } +} + +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 = game.user.isGM || game.settings.get("mgt2", "showTrash"); + 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: 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"; + } + } + actorContainers.sort(MGT2Helper.compareByName); + const containers = [{ "name": "(tous)", "_id": "" }].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 = []; + } + 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); + } + 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; + } + 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); + } else { + if (i.system.software.bandwidth > 0) + i.display = `${i.name} (${i.system.software.bandwidth})`; + else + i.display = i.name; + softwares.push(i); + } + } 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 { + 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)); + } + 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 + }; + 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: "Not proficient (-3)" }].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 = "Weapon"; + else if (itemObj.type === "armor") + rollOptions.rollTypeName = "Armor"; + else if (itemObj.type === "computer") + rollOptions.rollTypeName = "Computer"; + } + if (button.dataset.roll === "psionic") { + rollOptions.rollObjectName = itemObj.name; + } + if (itemObj.system.hasOwnProperty("damage")) { + rollOptions.damageFormula = itemObj.system.damage; + if (itemObj.type === "disease") { + if (itemObj.system.subTypetype === "disease") { + rollOptions.rollTypeName = "Disease"; + } else if (itemObj.system.subTypetype === "poison") { + rollOptions.rollTypeName = "Poison"; + } + } + } + if (itemObj.system.hasOwnProperty("roll")) { + if (itemObj.system.roll.hasOwnProperty("characteristic") && itemObj.system.roll.characteristic !== "" && itemObj.system.roll.characteristic !== void 0) { + rollOptions.characteristic = itemObj.system.roll.characteristic; + } + if (itemObj.system.roll.hasOwnProperty("skill") && itemObj.system.roll.skill !== "" && itemObj.system.roll.skill !== void 0) { + rollOptions.skill = itemObj.system.roll.skill; + } + if (rollOptions.difficulty === null && itemObj.system.roll.hasOwnProperty("difficulty") && itemObj.system.roll.difficulty !== "" && itemObj.system.roll.difficulty !== void 0) { + 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("Not proficient (-3)"); + } 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); + } + 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 !== "" + }; + const html = await renderTemplate("systems/mgt2/templates/chat/roll.html", chatData); + chatData.content = html; + if (rollOptions.damageFormula !== null && rollOptions.damageFormula !== "") { + chatData.flags = { mgt2: { damage: { formula: rollOptions.damageFormula, rollObjectName: rollOptions.rollObjectName, rollTypeName: rollOptions.rollTypeName } } }; + } + 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: "New container", type: "container" }, { parent: this.actor }); + } else { + container = containers[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"); + } + } else { + item.system.container.id = container._id; + } + } + 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: "New container", 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 !== "contact" && sourceItemData.type !== "talent" && sourceItemData.type !== "armor" && sourceItemData.type !== "weapon" && sourceItemData.type !== "computer" && sourceItemData.type !== "container" && sourceItemData.type !== "species" && 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; + } + 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; + } + } + } else { + let transferData = {}; + try { + transferData = sourceItemData.toJSON(); + } catch (err) { + transferData = sourceItemData; + } + transferData._id; + 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; + } + } else { + transferData.system.container.id = targetItem.system.container.id; + } + } + } + (await this.actor.createEmbeddedDocuments("Item", [transferData]))[0]; + if (transferData.actor) ; + if (recalcWeight) { + await this.actor.recalculateWeight(); + } + } + return true; + } + _getSubmitData(updateData = {}) { + const formData = foundry.utils.expandObject(super._getSubmitData(updateData)); + return foundry.utils.flattenObject(formData); + } +} + +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/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; + } + 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"); + }); + } + 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, + 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" + }, + 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: true, + 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 + }); +}; + +function registerHandlebarsHelpers() { + 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() { + CONFIG.MGT2 = MGT2$1; + CONFIG.Combat.initiative = { + formula: "2d6 + @initiative", + decimals: 2 + }; + CONFIG.Actor.trackableAttributes = { + character: { + bar: [ + "life", + "characteristics.strength", + "characteristics.dexterity", + "characteristics.endurance", + "characteristics.intellect", + "characteristics.education", + "characteristics.social", + "characteristics.morale", + "characteristics.luck", + "characteristics.sanity", + "characteristics.charm", + "characteristics.psionic", + "characteristics.other" + ], + value: [ + "life.value", + "health.radiations", + "characteristics.strength.value", + "characteristics.dexterity.value", + "characteristics.endurance.value", + "characteristics.intellect.value", + "characteristics.education.value", + "characteristics.social.value", + "characteristics.morale.value", + "characteristics.luck.value", + "characteristics.sanity.value", + "characteristics.charm.value", + "characteristics.psionic.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 }); + Object.assign(CONFIG.Actor.dataModels, { + "character": CharacterData + }); + Object.assign(CONFIG.Item.dataModels, { + "item": ItemData, + "equipment": EquipmentData, + "disease": DiseaseData, + "career": CareerData, + "talent": TalentData, + "contact": ContactData, + "weapon": WeaponData, + "computer": ComputerData, + "armor": ArmorData, + "container": ItemContainerData, + "species": SpeciesData + }); + Hooks.on("renderChatMessage", (message, html, messageData) => { + ChatHelper.setupCardListeners(message, html, messageData); + }); + await preloadHandlebarsTemplates(); +}); + +export { MGT2$1 as MGT2 }; +//# sourceMappingURL=mgt2.bundle.js.map diff --git a/mgt2.bundle.js.map b/mgt2.bundle.js.map new file mode 100644 index 0000000..94040ee --- /dev/null +++ b/mgt2.bundle.js.map @@ -0,0 +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 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 }),\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 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\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 });\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 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 ItemBaseData {\r\n static defineSchema() {\r\n const schema = super.defineSchema();\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.Stoppped\",\r\n Idle: \"MGT2.Idle\",\r\n VerySlow: \"MGT2.VerySlow\",\r\n Slow: \"MGT2.Slow\",\r\n Medium: \"MGT2.Medium\",\r\n High: \"MGT2.High.\",\r\n Fast: \"MGT2.Fast\",\r\n VeryFast: \"MGT2.VeryFast\",\r\n Subsonic: \"MGT2.Subsonic\",\r\n Hypersonic: \"MGT2.Hypersonic\"\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();\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 cloneActor = duplicate($this);\r\n\r\n await this.recalculateArmor($this, cloneActor);\r\n\r\n if (recalculEncumbrance) {\r\n //console.log(\"recalculEncumbrance\");\r\n const str = $this.system.characteristics.strength.value;\r\n const end = $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 += x.system.level);\r\n let normal = str + end + sumSkill;\r\n let heavy = normal * 2;\r\n\r\n cloneActor.system.states.encumbrance = $this.system.inventory.weight > normal;\r\n cloneActor.system.encumbrance.normal = normal;\r\n cloneActor.system.encumbrance.heavy = heavy;\r\n }\r\n\r\n if (recalculWeight)\r\n await this.recalculateWeight($this, cloneActor);\r\n }\r\n }\r\n\r\n static async recalculateArmor($this, cloneActor) {\r\n if (cloneActor === null || cloneActor === undefined)\r\n cloneActor = duplicate($this);\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 cloneActor.system.inventory.armor = armor;\r\n }\r\n\r\n static async recalculateWeight($this, cloneActor) {\r\n\r\n if (cloneActor === null || cloneActor === undefined)\r\n cloneActor = duplicate($this);\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 cloneActor.system.inventory.weight = onHandWeight;\r\n cloneActor.system.states.encumbrance = onHandWeight > $this.system.inventory.encumbrance.normal;\r\n\r\n\r\n await $this.update(cloneActor);\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 = foundry.utils.getProperty(changed, \"system.characteristics.strength.value\") ?? $this.system.characteristics.strength.value;\r\n const newEnd = 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 += 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 = foundry.utils.getProperty(changed, \"system.characteristics.strength.value\") ?? $this.system.characteristics.strength.value;\r\n const strengthMax = foundry.utils.getProperty(changed, \"system.characteristics.strength.max\") ?? $this.system.characteristics.strength.max;\r\n const dexterityValue = foundry.utils.getProperty(changed, \"system.characteristics.dexterity.value\") ?? $this.system.characteristics.dexterity.value;\r\n const dexterityMax = foundry.utils.getProperty(changed, \"system.characteristics.dexterity.max\") ?? $this.system.characteristics.dexterity.max;\r\n const enduranceValue = foundry.utils.getProperty(changed, \"system.characteristics.endurance.value\") ?? $this.system.characteristics.endurance.value;\r\n const enduranceMax = 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 = foundry.utils.getProperty(changed, path + \".value\");// || this.system.characteristics[name].value;\r\n if (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\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 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 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 }\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 }\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 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\" || this.item.type == \"computer\" || 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\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 });\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 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: \"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\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\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: \"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}","import { MGT2Helper } from \"../helper.js\";\nimport { RollPromptHelper } from \"../roll-prompt.js\";\nimport { CharacterPrompts } from \"./character-prompts.js\";\n//import { MGT2 } from \"../core.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 = 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: 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\": \"(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 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 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 };\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 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: \"Not proficient (-3)\" }].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 = \"Weapon\";\n else if (itemObj.type === \"armor\")\n rollOptions.rollTypeName = \"Armor\";\n else if (itemObj.type === \"computer\")\n rollOptions.rollTypeName = \"Computer\";\n }\n\n if (button.dataset.roll === \"psionic\") {\n rollOptions.rollObjectName = itemObj.name;\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 = \"Disease\";\n } else if (itemObj.system.subTypetype === \"poison\") {\n rollOptions.rollTypeName = \"Poison\";\n }\n }\n }\n\n if (itemObj.system.hasOwnProperty(\"roll\")) {\n if (itemObj.system.roll.hasOwnProperty(\"characteristic\") && itemObj.system.roll.characteristic !== \"\" && itemObj.system.roll.characteristic !== undefined) {\n rollOptions.characteristic = itemObj.system.roll.characteristic;\n }\n\n if (itemObj.system.roll.hasOwnProperty(\"skill\") && itemObj.system.roll.skill !== \"\" && itemObj.system.roll.skill !== undefined) {\n rollOptions.skill = itemObj.system.roll.skill;\n }\n\n if (rollOptions.difficulty === null && itemObj.system.roll.hasOwnProperty(\"difficulty\") && itemObj.system.roll.difficulty !== \"\" && itemObj.system.roll.difficulty !== undefined) {\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(\"Not proficient (-3)\");\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 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 };\n\n const html = await renderTemplate(\"systems/mgt2/templates/chat/roll.html\", chatData);\n chatData.content = html;\n\n if (rollOptions.damageFormula !== null && rollOptions.damageFormula !== \"\") {\n chatData.flags = { mgt2: {damage: { formula: rollOptions.damageFormula, rollObjectName: rollOptions.rollObjectName, rollTypeName: rollOptions.rollTypeName}}};\n }\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: \"New container\", 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: \"New container\", 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 // Supported drop (don't drop vehicule stuff)\n if (sourceItemData.type !== \"contact\" && sourceItemData.type !== \"talent\" && sourceItemData.type !== \"armor\" &&\n sourceItemData.type !== \"weapon\" && sourceItemData.type !== \"computer\" && sourceItemData.type !== \"container\" &&\n sourceItemData.type !== \"species\" && 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 transferData.system.container.id = targetItem.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();\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/parts/actor-characteristic.html\"\r\n ];\r\n \r\n return loadTemplates(templatePaths);\r\n };","export 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 }\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 },\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: true,\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","MGT2","converted","item","html"],"mappings":"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"} \ No newline at end of file diff --git a/styles/mgt2.min.css b/styles/mgt2.min.css new file mode 100644 index 0000000..0b55c31 --- /dev/null +++ b/styles/mgt2.min.css @@ -0,0 +1,946 @@ +@import url("https://fonts.googleapis.com/css2?family=Barlow+Condensed:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,300..900;1,300..900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&display=swap"); +.black-and-red { + --mgt2-color-form: #0A0405; + --mgt2-bgcolor-form: #fff; + --mgt2-color-primary: #EE4050; + --mgt2-color-primary-active: #AF2F3C; + --mgt2-bgcolor-primary: #0A0405; + --mgt2-color-primary-light: #4b4a44; + --mgt2-color-warning: #EE4050; + --mgt2-color-dm: #fff; + --mgt2-bgcolor-dm: #0A0405; + --mgt2-color-software: #fff; + --mgt2-bgcolor-software: #0A0405; + --mgt2-input-color: #0A0405; + --mgt2-input-bgcolor: #fff; + --mgt2-editor-border: #C6C6C6; + --mgt2-row-hover: #F2F2F2; + --mgt2-subrow-color: #727272; + --mgt2-row-inactive-icon: #b5b3a4; + --mgt2-encumbrance-normal: #D94826; + --mgt2-encumbrance-heavy: #D82727; +} + +.mwamba { + --mgt2-color-form: #0A0405; + --mgt2-bgcolor-form: #fff; + --mgt2-color-primary: #2A9932; + --mgt2-color-primary-active: #40ED4E; + --mgt2-bgcolor-primary: #0A0405; + --mgt2-color-primary-light: #4b4a44; + --mgt2-color-warning: #EE4050; + --mgt2-color-dm: #fff; + --mgt2-bgcolor-dm: #0A0405; + --mgt2-color-software: #fff; + --mgt2-bgcolor-software: #0A0405; + --mgt2-input-color: #0A0405; + --mgt2-input-bgcolor: #fff; + --mgt2-editor-border: #C6C6C6; + --mgt2-row-hover: #F2F2F2; + --mgt2-subrow-color: #727272; + --mgt2-row-inactive-icon: #b5b3a4; +} + +.upcase { + text-transform: uppercase; +} + +.w1-10 { + width: 10%; +} + +.w2-10 { + width: 20%; +} + +.w3-10 { + width: 30%; +} + +.w4-10 { + width: 40%; +} + +.w5-10 { + width: 50%; +} + +.h100 { + height: 100%; +} + +.w100 { + width: 100%; +} + +.mgt2 a:hover { + text-shadow: none; +} +.mgt2 .w-100 { + width: 100%; +} +.mgt2 .mb-1 { + margin-bottom: 8px; +} +.mgt2 .mt-1, .mgt2 .mt-05 { + margin-top: 8px; +} +.mgt2 .mt-2 { + margin-top: 14px; +} +.mgt2 .flex-fix { + flex-grow: 0 !important; + flex-shrink: 0 !important; +} + +.mgt2.sheet header.window-header { + color: var(--mgt2-color-primary); + background-color: var(--mgt2-bgcolor-primary); +} +.mgt2.sheet h4.window-title { + font-weight: bold; + text-transform: uppercase; +} +.mgt2.window-app .window-content { + background: var(--mgt2-bgcolor-form); + padding: 0; +} + +.nopad .window-content { + padding: 0; +} + +.mgt2.sheet textarea { + color: var(--mgt2-input-color); + background-color: var(--mgt2-input-bgcolor); + font-family: "Roboto", sans-serif; + font-size: 13px; + font-stretch: 100%; +} +.mgt2 input:focus, +.mgt2 textarea:focus, +.mgt2 select:focus { + outline: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.mgt2 .checkbox-small { + flex: none !important; + width: auto !important; + height: auto !important; + margin: 0 !important; +} +.mgt2 .header { + color: var(--mgt2-color-primary); + background: var(--mgt2-bgcolor-primary); + font-size: 14px; + font-family: "Roboto Condensed", sans-serif; + font-weight: bold; + padding-left: 5px; + margin-bottom: 4px; + line-height: 30px; + text-transform: uppercase; +} +.mgt2 .field-groups { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + justify-content: space-between; +} +.mgt2 .field-group label { + text-transform: uppercase; + font-weight: 700; + font-size: 14px; + font-family: "Roboto Condensed", sans-serif; + font-optical-sizing: auto; +} +.mgt2 input.field { + background-color: var(--mgt2-input-bgcolor); + font-size: 13px; +} +.mgt2 input.field-name { + background-color: var(--mgt2-input-bgcolor); + font-size: 2rem; + border: none; + font-weight: 700; + font-family: "Roboto Condensed", sans-serif; + margin-bottom: 0.5rem; + padding: 0; +} +.mgt2 input.field-item-name { + background-color: var(--mgt2-input-bgcolor); + height: auto; + font-size: 2rem; + font-weight: 700; + font-family: "Roboto Condensed", sans-serif; +} +.mgt2 .fields { + display: flex; +} +.mgt2 .editor { + min-height: 3rem; + border: 1px solid var(--mgt2-editor-border); + height: 100%; +} +.mgt2 .sheet-body { + margin-left: 140px; + padding-bottom: 1.5rem; +} +.mgt2 label.mgt2-checkbox { + display: flex; + flex-direction: row; + align-items: center; +} +.mgt2 label.mgt2-checkbox input { + margin: 0 0.3rem 0 0; +} + +.mgt2 .dialog-button { + color: var(--mgt2-color-primary); + background-color: var(--mgt2-bgcolor-primary) !important; +} + +.characteristics-panel .tab { + padding: 4px; +} + +.mgt2 .characteristics { + flex-basis: 138px; + flex-grow: 0; + flex-shrink: 0; + position: relative; +} +.mgt2 .characteristics-header { + color: var(--mgt2-color-primary); + background: var(--mgt2-bgcolor-primary); + font-family: "Rubik", monospace; + font-style: normal; + font-size: 1rem; + line-height: 2rem; + text-transform: uppercase; +} +.mgt2 .characteristic-row { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + position: relative; +} +.mgt2 .characteristic-minmax { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + flex-wrap: nowrap; +} +.mgt2 .characteristic-dm span.label { + font-size: 0.8rem; + font-weight: 600; +} +.mgt2 .characteristic-label { + font-family: "Barlow Condensed", sans-serif; + font-size: 1.2rem; + font-weight: 600; + font-style: italic; + text-align: center; + position: relative; +} +.mgt2 .characteristic-label > a.roll { + color: black; + position: absolute; + left: 0; +} +.mgt2 .characteristic-label a.cfg-characteristic { + display: none; + font-size: 12px; + position: absolute; + right: 0; + top: 0; +} +.mgt2 .characteristic-label:hover a.cfg-characteristic { + display: block; +} +.mgt2 .characteristic-input { + color: var(--mgt2-bgcolor-primary); + text-align: center; + font-size: 1.5rem; + font-weight: 500; + width: 2.4rem; + height: 2rem; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border: none; + outline: none; + background: linear-gradient(45deg, rgba(0, 0, 0, 0) 5.66px, #000 0 7.66px, rgba(0, 0, 0, 0) 0 calc(100% - 5.66px - 2px), #000 0 calc(100% - 5.66px), rgba(0, 0, 0, 0) 0), linear-gradient(-45deg, rgba(0, 0, 0, 0) 5.66px, #000 0 7.66px, rgba(0, 0, 0, 0) 0 calc(100% - 5.66px - 2px), #000 0 calc(100% - 5.66px), rgba(0, 0, 0, 0) 0), linear-gradient(90deg, #000 4px, rgba(0, 0, 0, 0) 0) -2px 50%/100% calc(100% - 16px) repeat-x, linear-gradient(#000 4px, rgba(0, 0, 0, 0) 0) 50% -2px/calc(100% - 16px) 100% repeat-y; +} +.mgt2 .characteristic-dm { + color: var(--mgt2-color-dm); + background-color: transparent; + text-align: center; + font-size: 1rem; + width: 1.5rem; + height: 1.4rem; + padding: 0; + outline: none; + border: none; + margin: 0; + position: absolute; + right: 0; + background-color: var(--mgt2-bgcolor-dm); + border-radius: 9px; + margin-right: 2px; +} +.mgt2 .characteristic-dm:focus { + outline: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.mgt2 .characteristic-dm-minmax:focus { + outline: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.mgt2 .minmaxwrapper { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: center; + justify-content: center; + align-items: center; + margin: 0 0.5rem; + -webkit-box-sizing: border-box; + box-sizing: border-box; + background: linear-gradient(45deg, rgba(0, 0, 0, 0) 7.07px, #000 0 9.07px, rgba(0, 0, 0, 0) 0 calc(100% - 7.07px - 2px), #000 0 calc(100% - 7.07px), rgba(0, 0, 0, 0) 0), linear-gradient(-45deg, rgba(0, 0, 0, 0) 7.07px, #000 0 9.07px, rgba(0, 0, 0, 0) 0 calc(100% - 7.07px - 2px), #000 0 calc(100% - 7.07px), rgba(0, 0, 0, 0) 0), linear-gradient(90deg, #000 4px, rgba(0, 0, 0, 0) 0) -2px 50%/100% calc(100% - 20px) repeat-x, linear-gradient(#000 4px, rgba(0, 0, 0, 0) 0) 50% -2px/calc(100% - 20px) 100% repeat-y; +} +.mgt2 .minmaxwrapper input { + display: inline-block; + color: black; + background-color: transparent; + text-align: center; + font-size: 1.5rem; + width: 2rem; + height: 2rem; + border: none; + outline: none; +} +.mgt2 .minmaxwrapper input:focus { + outline: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.mgt2 .minmaxwrapper input:first-child { + margin-left: 5px; +} +.mgt2 .minmaxwrapper input:last-child { + margin-right: 5px; +} +.mgt2 .minmaxwrapper span { + font-size: 1.5rem; + font-weight: 500; +} + +.computer-overload, +.computer-overload i { + color: var(--mgt2-color-warning) !important; +} + +ul.softwares { + list-style: none; + margin: 0; + padding: 0; +} +ul.softwares li { + display: inline-block; + color: var(--mgt2-color-software); + background-color: var(--mgt2-bgcolor-software); + padding: 3px 7px; + border-radius: 8px; +} +ul.softwares li a { + display: none; +} +ul.softwares li a:first-child { + margin: 0 0.5rem; +} +ul.softwares li:hover a { + display: inline-block; +} + +.character-header { + display: flex; + margin-top: 8px; + margin-right: 8px; + flex-direction: row; + flex-wrap: nowrap; + flex-grow: 0; + flex-shrink: 0; + justify-content: flex-start; + align-items: flex-start; +} + +.character-header-img { + flex-basis: 138px; + flex-grow: 0; + flex-shrink: 0; + text-align: center; +} + +.character-summary { + flex: 0 0 100%; + margin: 0; + padding: 0; + list-style: none; + border-top: 5px double var(--mgt2-bgcolor-primary); +} +.character-summary li { + float: left; + margin: 0; + padding: 0; + color: var(--mgt2-color-primary-light); +} +.character-summary input { + display: block; + border: none; + font-weight: bold; + font-family: "Roboto Condensed", sans-serif; + background-color: #fff; + font-size: 0.8rem; + border: 1px solid #fff; +} +.character-summary input:hover { + border: 1px solid #111; +} + +.character-header-body { + display: flex; + flex-direction: column; + flex-wrap: nowrap; + justify-content: flex-start; +} +.character-header-body legend { + font-size: 0.7rem; + text-transform: uppercase; + text-wrap: nowrap; +} +.character-header-body legend i { + margin-right: 0.25rem; +} + +.character-body { + display: flex; + flex-direction: row; + align-content: flex-start; + flex-wrap: nowrap; +} +.character-body .tab { + width: 100%; +} + +.lifes { + height: 100%; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.lifes div { + font-size: 2rem; +} + +.character-states { + margin: 0; + padding: 0; + list-style: none; + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + width: 100%; + float: right; +} +.character-states li { + display: flex; + margin: 0; + padding: 0; + color: #4b4a44; + justify-content: space-between; + align-items: center; + width: 100%; + font-size: 0.7rem; + line-height: 1.1rem; +} + +.encumbrance-normal { + color: var(--mgt2-encumbrance-normal) !important; +} + +.encumbrance-heavy { + color: var(--mgt2-encumbrance-heavy) !important; + font-weight: bold; +} + +.actor-footer { + bottom: 0; + color: var(--mgt2-color-primary); + background-color: var(--mgt2-bgcolor-primary); + width: 100%; + margin: 0 -8px; + height: 1.5rem; + justify-content: space-between; + align-items: center; + padding: 0 1rem; + flex-grow: 0; + flex-shrink: 0; + display: flex; + flex-direction: row; +} + +.itemsheet { + display: flex; + flex-wrap: nowrap; + flex-direction: row; +} + +.itemsheet-header { + display: flex; + background-color: var(--mgt2-bgcolor-primary); + color: red; + padding: 0.5rem; + align-items: center; + flex: 0 0 2rem; +} +.itemsheet-header label { + -webkit-writing-mode: tb-rl; + -ms-writing-mode: tb-rl; + writing-mode: tb-rl; + -webkit-transform: rotate(-180deg); + -ms-transform: rotate(-180deg); + transform: rotate(-180deg); + font-weight: 700; + font-size: 20px; + letter-spacing: 5px; + font-family: "Rubik Mono One", monospace; + font-style: normal; + text-transform: uppercase; +} + +.itemsheet-maincol { + flex: 0 0 130px; + padding: 0 1rem 0 0; +} + +.itemsheet-panel { + display: flex; + flex: inherit; + padding: 1rem; +} +.itemsheet-panel img.profile-img { + width: 100px; + height: 100px; +} + +.itemsheet input, +.itemsheet select { + color: var(--mgt2-input-color); + background-color: var(--mgt2-input-bgcolor); + display: block; + width: 100%; + font-size: 13px; +} + +.chat-sidebar, +.mgt2-buttons button { + background: rgba(0, 0, 0, 0.1); + border: 1px solid var(--color-border-light-2); + border-radius: 3px; + -webkit-box-shadow: 0 0 2px #FFF inset; + box-shadow: 0 0 2px #FFF inset; +} + +.chat-message.message { + color: #0A0405; + background-color: #fff; + background-image: none; +} + +.dice-formula, +.dice-total { + background-color: #fff; +} + +.mgt2-buttons { + display: flex; + justify-content: center; + align-items: center; + flex-wrap: nowrap; + color: #0A0405; + margin-top: 5px; +} +.mgt2-buttons button i { + font-size: 1.1rem; + padding: 0; + margin: 0; +} + +.roll-info { + display: flex; + flex-direction: column; +} + +.roll-type-name { + font-size: 11px; + text-transform: uppercase; + color: #515151; +} + +.roll-object-name { + font-weight: 400; + font-size: 1.4rem; +} + +.mgt2 nav.horizontal-tabs { + color: var(--mgt2-color-primary); + background: var(--mgt2-bgcolor-primary); + font-style: normal; + font-weight: 700; + font-size: 14px; + line-height: 30px; + text-transform: uppercase; + justify-content: space-around; + align-items: center; + font-family: "Roboto Condensed", sans-serif; +} +.mgt2 nav.horizontal-tabs a.item { + position: relative; + flex: 1 1 auto; +} +.mgt2 nav.horizontal-tabs a.item i { + margin-right: 0.5rem; +} +.mgt2 nav.horizontal-tabs > a.item::after { + content: ""; + position: absolute; + inset: 0.25rem 0.25rem 0.25rem 0.25rem; + border: 1px solid var(--mgt2-color-primary-active); + pointer-events: none; +} +.mgt2 nav.horizontal-tabs > a.item.active::after { + border-bottom: none; + border-top: 2px solid var(--mgt2-color-primary-active); + border-left: 2px solid var(--mgt2-color-primary-active); + border-right: 2px solid var(--mgt2-color-primary-active); + inset: 0.25rem 0.25rem 0 0.25rem; +} +.mgt2 nav.horizontal-tabs .active { + color: var(--mgt2-color-primary); + text-decoration: none; + text-shadow: none; + border-bottom: none; +} + +.tab[data-tab].fullsize { + height: calc(100% - 3rem); +} + +.subTab { + flex-flow: column; + height: 100%; + display: flex; + justify-content: flex-start; + align-items: stretch; +} + +.tab-scroll { + overflow-y: auto; + height: 100%; +} + +.subTabs { + height: 100%; + flex-direction: column; +} +.subTabs.active { + display: flex !important; +} + +.mgt2 .sheet-sidebar .item { + margin: 0 1rem; +} +.mgt2 nav[data-group=sidebar].tabs { + position: absolute; + left: 100%; + top: 172px; + display: flex; + flex-direction: column; + z-index: -1; +} +.mgt2 nav[data-group=sidebar].tabs > .item { + height: 40px; + position: relative; + display: flex; + justify-content: end; + align-items: center; + padding-right: 0.75rem; + background: var(--mgt2-bgcolor-primary); + color: var(--mgt2-color-primary); + border: 1px solid transparent; + font-size: 1rem; + -webkit-transition: all 250ms ease; + transition: all 250ms ease; + margin-left: 0; +} +.mgt2 nav[data-group=sidebar].tabs > .item.active { + text-shadow: none; + margin: 0; + border-color: var(--mgt2-color-primary); +} +.mgt2 nav[data-group=sidebar].tabs > .item.active::after { + border-left: none; + inset: 0.25rem 0.25rem 0.25rem 0; +} +.mgt2 nav[data-group=sidebar].tabs > .item::after { + content: ""; + position: absolute; + inset: 0.25rem; + border: 1px solid var(--mgt2-color-primary); + pointer-events: none; +} +.mgt2 nav[data-group=sidebar].tabs > .item i { + margin-left: 0.8rem; +} + +.container-controls { + display: inline-block; + margin-left: 1rem; +} +.container-controls a:not(:last-child) { + margin-right: 0.5rem; +} + +.table-container { + display: flex; + flex-flow: column nowrap; + width: 100%; + margin: 0 auto; +} + +.table-row { + display: flex; + flex-flow: row nowrap; + width: 100%; + position: relative; + align-items: flex-start; +} +.table-row.heading { + background-color: var(--mgt2-bgcolor-primary); + align-items: center; +} +.table-row.heading .row-item { + text-transform: uppercase; + font-size: 12px; +} +.table-row.heading .row-item:first-child { + font-weight: bold; + font-size: 13px; + letter-spacing: 3px; +} +.table-row.heading .row-item:first-child i { + margin-right: 0.5rem; +} +.table-row.heading.color-1 .row-item { + background-color: var(--mgt2-bgcolor-primary); + color: var(--mgt2-color-primary); +} +.table-row.heading.color-2 .row-item { + background-color: var(--mgt2-bgcolor-form); + color: var(--mgt2-bgcolor-primary); +} +.table-row.heading div.row-item { + padding-left: 5px; +} +.table-row.heading div.row-item:last-child { + padding-right: 5px; +} +.table-row:hover:not(.heading) { + background-color: var(--mgt2-row-hover); +} + +.table-row-mb-4 { + margin-bottom: 4px; +} + +.row-item { + display: flex; + flex-grow: 1; + font-size: 14px; + line-height: 25px; + align-items: center; + -webkit-transition: all 0.15s ease-in-out; + transition: all 0.15s ease-in-out; + overflow: hidden !important; + text-overflow: ellipsis; + text-wrap: nowrap; +} +.row-item.item-controls { + justify-content: right; + padding-right: 4px; +} +.row-item.item-controls a:not(:last-child) { + margin-right: 0.4rem; +} +.row-item i { + color: black; +} +.row-item a[data-roll] { + margin-right: 0.5rem; +} + +.heading.color-1 .row-item i { + color: var(--mgt2-color-primary) !important; +} +.heading.color-2 .row-item i { + color: var(--mgt2-bgcolor-primary) !important; +} + +.table-subrow { + border-left: 2px var(--mgt2-subrow-color) dashed; + color: var(--mgt2-subrow-color); +} +.table-subrow .row-item { + font-size: 0.8em; + line-height: 20px; +} +.table-subrow .row-item:first-child { + padding-left: 1rem; +} +.table-subrow .row-item > i { + margin-right: 4px; +} + +.row-item-center { + justify-content: center; + text-align: center; +} + +.row-item-left { + justify-content: left; +} + +.row-item-right { + justify-content: right; +} + +.row-item-space-between { + justify-content: space-between; +} + +.row-item-2 { + flex-basis: 4rem; +} + +.row-item-5 { + flex-basis: 5%; +} + +.row-item-10 { + flex-basis: 10%; +} + +.row-item-12 { + flex-basis: 4rem; +} + +.row-item-15 { + flex-basis: 5rem; +} + +.row-item-20 { + flex-basis: 20%; +} + +.row-item-25 { + flex-basis: 25%; +} + +.row-item-30 { + flex-basis: 30%; +} + +.row-item-35 { + flex-basis: 35%; +} + +.row-item-40 { + flex-basis: 40%; +} + +.row-item-45 { + flex-basis: 45%; +} + +.row-item-50 { + flex-basis: 50%; +} + +.row-item-65 { + flex-basis: 50%; +} + +.row-item-85 { + flex-basis: 50%; +} + +.row-item-storage { + flex-wrap: wrap; + flex-grow: 0; + flex-basis: 20%; + font-size: 0.7rem; + line-height: 0.8rem; +} + +.item-control.item-equip i { + color: var(--mgt2-row-inactive-icon); +} +.item-control.item-equip.active i { + color: var(--mgt2-color-form); +} + +.row-description { + flex-basis: 100%; + font-size: 14px; + padding: 4px 0; + justify-content: left; + -webkit-transition: all 0.15s ease-in-out; + transition: all 0.15s ease-in-out; +} + +.row-sub-container { + display: flex; + flex-flow: column nowrap; + flex: 1; +} +.row-sub-container .row-item { + padding: 8px 0; + border-bottom: 1px solid var(--mgt2-bgcolor-primary); +} + +.table-row:last-child, +.row-sub-container .row-item:last-child { + border-bottom: 0; +} + +.item-options { + position: absolute; + top: 0.7rem; + font-size: 0.7em; + left: 1.6rem; + text-transform: uppercase; + font-family: "DM Sans", sans-serif; + font-optical-sizing: auto; + font-weight: 600; + font-style: normal; + color: var(--mgt2-subrow-color); +} \ No newline at end of file diff --git a/system.json b/system.json new file mode 100644 index 0000000..d33c63e --- /dev/null +++ b/system.json @@ -0,0 +1,40 @@ +{ + "id": "mgt2", + "version": "0.1.0", + "title": "MGT2 - Mongoose Traveller (Unofficial)", + "description": "An unofficial implementation of Mongoose Publishing Traveller. Traveller is the property of Mongoose Publishing, and can be purchased at https://www.mongoosepublishing.com", + "background": "systems/mgt2/assets/screens/rosette-nebula-ngc2239-hoo.webp", + "url": "https://github.com/JDR-Ninja/foundryvtt-mgt2", + "manifest": "https://github.com/JDR-Ninja/foundryvtt-mgt2/releases/latest/download/system.json", + "readme": "https://raw.githubusercontent.com/JDR-Ninja/foundryvtt-mgt2/main/README.md", + "download": "https://github.com/JDR-Ninja/foundryvtt-mgt2/releases/download/v0.1.0/mgt2.zip", + "authors": [ + { + "name": "JdR Ninja", + "url": "https://www.jdr.ninja/", + "discord": "jdr.ninja" + } + ], + "esmodules": ["mgt2.bundle.js"], + "styles": ["styles/mgt2.min.css"], + "packs": [], + "languages": [ + { + "lang": "en", + "name": "English", + "path": "lang/en.json" + }, + { + "lang": "fr", + "name": "Français", + "path": "lang/fr.json" + } + ], + "compatibility": { + "minimum": "11", + "verified": "11.315" + }, + "gridDistance": 1.5, + "gridUnits": "m", + "primaryTokenAttribute": "life" +} diff --git a/template.json b/template.json new file mode 100644 index 0000000..a57115e --- /dev/null +++ b/template.json @@ -0,0 +1,39 @@ +{ + "Actor": { + "types": [ + "character", + "vehicule" + ], + "htmlFields": ["notes"], + "character": {}, + "vehicule": {} + }, + "Item": { + "types": [ + "contact", + "career", + "disease", + "item", + "equipment", + "talent", + "armor", + "weapon", + "computer", + "container", + "species" + ], + "htmlFields": ["description", "notes"], + "item": {}, + "equipment": {}, + "container": {}, + "weapon": {}, + "armor": {}, + "computer": {}, + "disease": {}, + "career": {}, + "contact": {}, + "talent": {}, + "race": {}, + "species": {} + } +} \ No newline at end of file diff --git a/templates/actors/actor-config-characteristic-sheet.html b/templates/actors/actor-config-characteristic-sheet.html new file mode 100644 index 0000000..b316d6e --- /dev/null +++ b/templates/actors/actor-config-characteristic-sheet.html @@ -0,0 +1,16 @@ +
+
+ +
+
+ +
+ {{#if showAll}} +
+ {{ localize 'MGT2.Actor.HiddenCharacteristics' }} +
+ +
+
+ {{/if}} +
\ No newline at end of file diff --git a/templates/actors/actor-config-sheet.html b/templates/actors/actor-config-sheet.html new file mode 100644 index 0000000..8944c31 --- /dev/null +++ b/templates/actors/actor-config-sheet.html @@ -0,0 +1,35 @@ +
+
+ +
+
+ {{ localize 'MGT2.Actor.Initiative' }} +
+ + +
+
+
+ {{ localize 'MGT2.Actor.DamageOrder' }} +
+ + +
+
+ + +
+
+ + +
+
+
\ No newline at end of file diff --git a/templates/actors/actor-sheet.html b/templates/actors/actor-sheet.html new file mode 100644 index 0000000..ec6a8f4 --- /dev/null +++ b/templates/actors/actor-sheet.html @@ -0,0 +1,730 @@ +
+ +
+
+ +
+
+ +
    + {{#if (and settings.usePronouns settings.useGender)}} +
  • +
  • +
  • + {{else if settings.usePronouns}} +
  • +
  • + {{else if settings.useGender}} +
  • +
  • + {{else}} +
  • + {{/if}} +
  • +
  • +
  • +
+
+
+ +
+
+
+ {{ localize 'MGT2.Actor.Initiative' }} +
{{showDM initiative}}
+
+
+
+ {{#if settings.showLife}} +
+ {{ localize 'MGT2.Actor.Life' }} +
{{system.life.value}}{{#if (gt system.life.max 0) }}/{{system.life.max}}{{/if}}
+
+ {{/if}} +
+
+
+ {{ localize 'MGT2.Actor.Armor' }} +
{{system.inventory.armor}}
+
+
+
+
+ {{ localize 'MGT2.Actor.States' }} +
    +
  • +
  • +
  • + +
+
+
+
+
+
+
+
+ +
+
+ {{#if system.characteristics.strength.show}} +
{{ localize 'MGT2.Characteristics.strength.name' }}
+ {{#if system.characteristics.strength.showMax}} +
+
+ | +
+ +
+ {{else}} +
+ + +
+ {{/if}} + {{/if}} + {{#if system.characteristics.dexterity.show}} +
{{ localize 'MGT2.Characteristics.dexterity.name' }}
+ {{#if system.characteristics.dexterity.showMax}} +
+
+ | +
+ +
+ {{else}} +
+ + +
+ {{/if}} + {{/if}} + {{#if system.characteristics.endurance.show}} +
{{ localize 'MGT2.Characteristics.endurance.name' }}
+ {{#if system.characteristics.endurance.showMax}} +
+
+ | +
+ +
+ {{else}} +
+ + +
+ {{/if}} + {{/if}} + {{#if system.characteristics.intellect.show}} +
{{ localize 'MGT2.Characteristics.intellect.name' }}
+ {{#if system.characteristics.intellect.showMax}} +
+
+ | +
+ +
+ {{else}} +
+ + +
+ {{/if}} + {{/if}} + {{#if system.characteristics.education.show}} +
{{ localize 'MGT2.Characteristics.education.name' }}
+ {{#if system.characteristics.education.showMax}} +
+
+ | +
+ +
+ {{else}} +
+ + +
+ {{/if}} + {{/if}} + {{#if system.characteristics.social.show}} +
{{ localize 'MGT2.Characteristics.social.name' }}
+ {{#if system.characteristics.social.showMax}} +
+
+ | +
+ +
+ {{else}} +
+ + +
+ {{/if}} + {{/if}} +
+
+ {{#if system.characteristics.morale.show}} +
{{ localize 'MGT2.Characteristics.morale.name' }}
+ {{#if system.characteristics.morale.showMax}} +
+
+ | +
+ +
+ {{else}} +
+ + +
+ {{/if}} + {{/if}} + {{#if system.characteristics.luck.show}} +
{{ localize 'MGT2.Characteristics.luck.name' }}
+ {{#if system.characteristics.luck.showMax}} +
+
+ | +
+ +
+ {{else}} +
+ + +
+ {{/if}} + {{/if}} + {{#if system.characteristics.sanity.show}} +
{{ localize 'MGT2.Characteristics.sanity.name' }}
+ {{#if system.characteristics.sanity.showMax}} +
+
+ | +
+ +
+ {{else}} +
+ + +
+ {{/if}} + {{/if}} + {{#if system.characteristics.charm.show}} +
{{ localize 'MGT2.Characteristics.charm.name' }}
+ {{#if system.characteristics.charm.showMax}} +
+
+ | +
+ +
+ {{else}} +
+ + +
+ {{/if}} + {{/if}} + {{#if system.characteristics.psionic.show}} +
{{ localize 'MGT2.Characteristics.psionic.name' }}
+ {{#if system.characteristics.psionic.showMax}} +
+
+ | +
+ +
+ {{else}} +
+ + +
+ {{/if}} + {{/if}} + {{#if system.characteristics.other.show}} +
{{ localize 'MGT2.Characteristics.other.name' }}
+ {{#if system.characteristics.other.showMax}} +
+
+ | +
+ +
+ {{else}} +
+ + +
+ {{/if}} + {{/if}} +
+
+
+
+
{{ localize 'MGT2.Actor.Health' }}
+
+ + +
+
+
+
{{ localize 'MGT2.Actor.Wounds' }}
+
{{ localize 'MGT2.Items.Difficulty' }}
+
{{ localize 'MGT2.Items.Damage' }}
+
{{ localize 'MGT2.Items.Interval' }}
+
+
+ {{#each wounds as |wound id|}} +
+
{{wound.name}}
+
{{wound.system.difficulty}}
+
{{wound.system.damage}}
+
{{wound.system.interval}}
+
+ + +
+
+ {{/each}} +
+
+
+
{{ localize 'MGT2.Items.Diseases' }}
+
{{ localize 'MGT2.Items.Difficulty' }}
+
{{ localize 'MGT2.Items.Damage' }}
+
{{ localize 'MGT2.Items.Interval' }}
+
+
+ {{#each diseases as |disease id|}} +
+
{{disease.name}}
+
{{disease.system.difficulty}}
+
{{disease.system.damage}}
+
{{disease.system.interval}}
+
+ + +
+
+ {{/each}} +
+
+
+
{{ localize 'MGT2.Actor.StudyPeriod' }}
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
{{ localize 'MGT2.Items.Careers' }}
+
{{ localize 'MGT2.Items.Terms' }}
+
{{ localize 'MGT2.Items.Rank' }}
+
+
+ {{#each careers as |career id|}} +
+
{{career.name}}
+
{{career.system.terms}}
+
{{career.system.rank}}
+
+ + +
+
+ {{/each}} +
+
+
+
{{ localize 'MGT2.Actor.Skills' }}
+
{{ localize 'MGT2.Items.Level' }}
+
+
+ {{#each skills as |skill id|}} +
+
+ {{skill.name}}{{#if skill.system.skill.speciality}} ({{skill.system.skill.speciality}}){{/if}} +
+
{{skill.system.level}}
+
+ + +
+
+ {{/each}} +
+ {{#if system.config.psionic}} +
+
+
{{ localize 'MGT2.Actor.PsionicTalents' }}
+
{{ localize 'MGT2.Items.Level' }}
+
{{ localize 'MGT2.Items.Cost' }}
+
{{ localize 'MGT2.Items.Reach' }}
+
{{ localize 'MGT2.Items.Difficulty' }}
+
+
+ {{#each psionics as |psionic id|}} +
+
+ {{psionic.name}} +
+
{{psionic.system.level}}
+
{{psionic.system.psionic.cost}}
+
{{psionic.system.psionic.reach}}
+
{{psionic.system.psionic.difficulty}}
+
+ + +
+
+ {{/each}} +
+ {{/if}} +
+
+ +
+
+
+
{{ localize 'MGT2.Items.Weapons' }}
+
{{ localize 'MGT2.Items.Range' }}
+
{{ localize 'MGT2.Items.Damage' }}
+
{{ localize 'MGT2.Items.Weight' }}
+
+
+ {{#each weapons as |weapon id|}} +
+
+ {{weapon.name}}{{#if weapon.subInfo}}
{{weapon.subInfo}}
{{/if}} +
+
{{weapon.range}}
+
{{weapon.system.damage}}
+
{{weapon.weight}}
+
+ + + + +
+
+ {{/each}} +
+
+
+
{{ localize 'MGT2.Items.Armors' }}
+
{{ localize 'MGT2.Items.Rads' }}
+
{{ localize 'MGT2.Items.Protection' }}
+
{{ localize 'MGT2.Items.Weight' }}
+
+
+ {{#each armors as |armor id|}} +
+
+ {{armor.name}}{{#if armor.subInfo}}
{{armor.subInfo}}
{{/if}} +
+
{{armor.system.radiations}}
+
{{armor.system.protection}}
+
{{armor.weight}}
+
+ + + + +
+
+ {{/each}} +
+
+
+
{{ localize 'MGT2.Actor.Augments' }}
+
{{ localize 'MGT2.Items.Improvement' }}
+
+
+ {{#each augments as |augment id|}} +
+
{{augment.name}}
+
{{augment.system.improvement}}
+
+ + + + +
+
+ {{/each}} +
+
+
+
{{ localize 'MGT2.Items.Computers' }}
+
+
{{ localize 'MGT2.Items.Weight' }}
+
+
+ {{#each computers as |computer id|}} +
+
+ {{computer.name}}{{#if computer.subInfo}}
{{computer.subInfo}}
{{/if}} +
+
{{computer.system.processingUsed}}/{{computer.system.processing}} + {{#if computer.system.overload}}{{/if}} +
+
{{computer.weight}}
+
+ + + + +
+
+ {{#each subItems as |subItem|}} +
+
{{subItem.name}}
+
{{subItem.system.bandwidth}}
+
+
+ + +
+
+ {{/each}} + {{/each}} + {{#if softwares}} +
+ {{ localize 'MGT2.Items.Softwares' }} +
    + {{#each softwares as |software id|}} +
  • {{software.display}} + + +
  • + {{/each}} +
+
+ {{/if}} +
+
+
+
{{ localize 'MGT2.Items.Equipments' }}
+
{{ localize 'MGT2.Items.Qty' }}
+
{{ localize 'MGT2.Items.Weight' }}
+
+
+ {{#each equipments as |equipment id|}} +
+
{{equipment.name}}
+
{{equipment.system.quantity}}
+
{{equipment.weight}}
+
+ + + + +
+
+ {{/each}} +
+
+
+
{{ localize 'MGT2.Items.Items' }}
+
{{ localize 'MGT2.Items.Qty' }}
+
{{ localize 'MGT2.Items.Weight' }}
+
+
+ {{#each items as |item|}} + {{#if (eq item.type "container")}} +
+ {{else}} +
+ {{/if}} +
{{item.name}}
+
{{item.system.quantity}}
+
{{item.weight}}
+
+ + + +
+
+ {{#if (eq item.type "container")}} + {{#each subItems as |subItem|}} +
+
{{subItem.name}}
+
{{subItem.system.quantity}}
+
{{subItem.weight}}
+
+ + + +
+
+ {{/each}} + {{/if}} + {{/each}} +
+
+
+
+
{{ localize 'MGT2.Actor.Encumbrance' }} {{encumbranceNormal}} {{settings.weightUnit}} / {{encumbranceHeavy}} {{settings.weightUnit}}
+
Total :
+
{{system.inventory.weight}} {{settings.weightUnit}}
+
+
+
+
+
+
+
+ + +
+ {{#unless containerShowAll}}{{/unless}} + + {{#unless containerShowAll}}{{/unless}} +
+
+
+ + +
+
+
+ {{#if (and containerView.system.locked (not isGM))}} + + {{else}} +
+
+
{{ localize 'MGT2.Items.Items' }}
+ {{#if containerShowAll}} +
{{ localize 'MGT2.Items.Storage' }}
+ {{/if}} +
{{ localize 'MGT2.Items.Qty' }}
+
{{ localize 'MGT2.Items.Weight' }}
+
+
+ {{#each containerItems as |containerItem id|}} +
+
{{containerItem.name}}
+ {{#if ../containerShowAll}} +
{{containerItem.containerName}}
+ {{/if}} +
{{containerItem.system.quantity}}
+
{{containerItem.weight}}
+
+ + + +
+
+ {{/each}} +
+
+
{{ localize 'MGT2.Actor.TotalWeight' }} : {{containerWeight}} {{settings.weightUnit}}
+ {{/if}} +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+
+
{{ localize 'MGT2.Actor.RelationsAndContacts' }}
+
+
+
{{ localize 'MGT2.Items.Relations' }}
+
{{ localize 'MGT2.Items.Relation' }}
+
{{ localize 'MGT2.Items.Attitude' }}
+
{{ localize 'MGT2.Items.Occupation' }}
+
{{ localize 'MGT2.Items.Location' }}
+
+
+ {{#each contacts as |contact id|}} +
+
{{contact.name}}
+
{{localize (concat "Contact.Relation." contact.system.relation)}}
+
{{localize (concat "Contact.Attitude." contact.system.attitude)}}
+
{{contact.system.occupation}}
+
{{contact.system.location}}
+
+ + +
+
+ {{/each}} +
+
+
+
{{ localize 'MGT2.Actor.Notes' }}
+ {{editor system.notes target="system.notes" button=true editable=true}} +
+
+
{{ localize 'MGT2.Actor.Biography' }}
+ {{editor system.biography target="system.biography" button=true editable=true}} +
+ {{#if showTrash}} + + {{/if}} +
+ + \ No newline at end of file diff --git a/templates/actors/vehicule-sheet.html b/templates/actors/vehicule-sheet.html new file mode 100644 index 0000000..e00d74a --- /dev/null +++ b/templates/actors/vehicule-sheet.html @@ -0,0 +1,16 @@ +
+
+
+ +
+
+ +
    +
  • +
  • +
  • +
  • +
+
+
+
\ No newline at end of file diff --git a/templates/chat/request-roll.html b/templates/chat/request-roll.html new file mode 100644 index 0000000..e69de29 diff --git a/templates/chat/roll.html b/templates/chat/roll.html new file mode 100644 index 0000000..0c37837 --- /dev/null +++ b/templates/chat/roll.html @@ -0,0 +1,35 @@ +
+
{{rollObjectName}}
+ {{#if rollTypeName}} +
{{rollTypeName}}
+ {{/if}} + {{#if rollModifiers}} + {{#each rollModifiers as |rollModifier i| }} +
{{rollModifier}}
+ {{/each}} + {{/if}} +
+
+ {{#if flavor}} +
{{flavor}}
+ {{/if}} +
+
{{formula}}
+ {{{tooltip}}} +

{{total}}

+
+
+{{#if showButtons}} +
+ {{#if hasDamage}} + + + {{/if}} + {{#if showRollRequest}} + + {{/if}} + {{#if showRollDamage}} + + {{/if}} +
+{{/if}} \ No newline at end of file diff --git a/templates/items/armor-sheet.html b/templates/items/armor-sheet.html new file mode 100644 index 0000000..60bb5a1 --- /dev/null +++ b/templates/items/armor-sheet.html @@ -0,0 +1,74 @@ +
+
+ +
+
+
+ + {{> systems/mgt2/templates/items/parts/sheet-physical-item.html }} +
+
+ + +
+
+ + +
+
+
+
+
+ +
+
+ +
+ {{#if hadContainer}} +
+ + +
+ {{/if}} +
+
+
+ + +
+
+ + +
+
+
+
+
{{ localize 'MGT2.Items.Options' }}
+
Description
+
+
+ {{#each system.options as |option i| }} +
+
+
+ +
+
+ +
+
+ {{/each}} +
+
+
+ {{> systems/mgt2/templates/items/parts/sheet-configuration.html }} +
+
+
+
\ No newline at end of file diff --git a/templates/items/career-sheet.html b/templates/items/career-sheet.html new file mode 100644 index 0000000..cd32f0b --- /dev/null +++ b/templates/items/career-sheet.html @@ -0,0 +1,50 @@ +
+
+
+
+ +
+ + +
+
+ + +
+
+
+ +
+ + +
+ +
+ +
+
+
+
+
{{ localize 'MGT2.Items.Age' }}
+
{{ localize 'MGT2.Items.Details' }}
+
+
+ {{#each system.events as |event i| }} +
+
+
+ +
+
+ +
+
+ {{/each}} +
+
+
+
+
\ No newline at end of file diff --git a/templates/items/computer-sheet.html b/templates/items/computer-sheet.html new file mode 100644 index 0000000..d688b47 --- /dev/null +++ b/templates/items/computer-sheet.html @@ -0,0 +1,65 @@ +
+
+ +
+
+
+ + {{> systems/mgt2/templates/items/parts/sheet-physical-item.html }} +
+
+ + +
+
+ + +
+
+
+
+
+ +
+ {{#if hadContainer}} +
+ + +
+ {{/if}} +
+
+ + +
+
+
+
{{ localize 'MGT2.Items.Options' }}
+
{{ localize 'MGT2.Items.Description' }}
+
+
+ {{#each system.options as |option i| }} +
+
+
+ +
+
+ +
+
+ {{/each}} +
+
+
+ {{> systems/mgt2/templates/items/parts/sheet-configuration.html }} +
+
+
+
\ No newline at end of file diff --git a/templates/items/contact-sheet.html b/templates/items/contact-sheet.html new file mode 100644 index 0000000..2febbcb --- /dev/null +++ b/templates/items/contact-sheet.html @@ -0,0 +1,84 @@ +
+
+
+
+ +
+ + + +
+
+ + + +
+
+ + +
+
+
+ +
+
+ + +
+ {{#if settings.useGender}} +
+ + +
+ {{/if}} + {{#if settings.usePronouns}} +
+ + +
+ {{/if}} +
+ +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ {{editor system.description.value target="system.description" button=true editable=true}} +
+
+ {{editor system.notes target="system.notes" button=true editable=true}} +
+
+
+
\ No newline at end of file diff --git a/templates/items/container-sheet.html b/templates/items/container-sheet.html new file mode 100644 index 0000000..071b9dd --- /dev/null +++ b/templates/items/container-sheet.html @@ -0,0 +1,55 @@ +
+
+
+
+ + {{#if system.locked}} +
+ +
+ {{/if}} +
+ + +
+
+
+ + +
+
+ + +
+
+
+
+
+ +
+ {{#if isGM}} +
+ +
+ {{/if}} +
+
+ + +
+
+
+ {{#if isGM}} +
+ + +
+ {{/if}} +
+
+
+
\ No newline at end of file diff --git a/templates/items/disease-sheet.html b/templates/items/disease-sheet.html new file mode 100644 index 0000000..84e366c --- /dev/null +++ b/templates/items/disease-sheet.html @@ -0,0 +1,45 @@ +
+
+ {{#if (eq system.subType "disease")}} + + {{else if (eq system.subType "poison")}} + + {{else}} + + {{/if}} +
+
+
+ +
+ + +
+
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+
\ No newline at end of file diff --git a/templates/items/equipment-sheet.html b/templates/items/equipment-sheet.html new file mode 100644 index 0000000..8be9cec --- /dev/null +++ b/templates/items/equipment-sheet.html @@ -0,0 +1,57 @@ +
+
+ {{#if (eq system.subType "augment")}} + + {{else if (eq system.subType "trinket")}} + + {{else if (eq system.subType "clothing")}} + + {{else}} + + {{/if}} +
+
+
+ +
+ + +
+ {{> systems/mgt2/templates/items/parts/sheet-physical-item.html }} +
+
+ + +
+
+ + +
+
+
+
+
+ +
+ {{#if hadContainer}} +
+ + +
+ {{/if}} +
+
+
+ {{> systems/mgt2/templates/items/parts/sheet-configuration.html }} +
+
+
+
\ No newline at end of file diff --git a/templates/items/item-sheet.html b/templates/items/item-sheet.html new file mode 100644 index 0000000..bcd905a --- /dev/null +++ b/templates/items/item-sheet.html @@ -0,0 +1,60 @@ +
+
+ {{#if (eq system.subType "loot")}} + + {{else}} + + {{/if}} +
+
+
+ +
+ + +
+ {{> systems/mgt2/templates/items/parts/sheet-physical-item.html }} +
+
+ + +
+
+ + +
+
+
+ {{#if hadContainer}} +
+ {{#if (eq system.subType "software")}} +
+ + +
+ {{/if}} +
+ + +
+
+ {{/if}} + {{#if (eq system.subType "software")}} +
+ + +
+ {{/if}} +
+
+
+
\ No newline at end of file diff --git a/templates/items/parts/sheet-configuration.html b/templates/items/parts/sheet-configuration.html new file mode 100644 index 0000000..22511a2 --- /dev/null +++ b/templates/items/parts/sheet-configuration.html @@ -0,0 +1,23 @@ +
+
+ + +
+
+ + +
+
+ + +
+
\ No newline at end of file diff --git a/templates/items/parts/sheet-physical-item.html b/templates/items/parts/sheet-physical-item.html new file mode 100644 index 0000000..27354f6 --- /dev/null +++ b/templates/items/parts/sheet-physical-item.html @@ -0,0 +1,21 @@ +
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
\ No newline at end of file diff --git a/templates/items/species-sheet.html b/templates/items/species-sheet.html new file mode 100644 index 0000000..8d107c5 --- /dev/null +++ b/templates/items/species-sheet.html @@ -0,0 +1,15 @@ +
+
+
+
+ +
+
+ +
+ + +
+
+
+
\ No newline at end of file diff --git a/templates/items/talent-sheet.html b/templates/items/talent-sheet.html new file mode 100644 index 0000000..f3a78ca --- /dev/null +++ b/templates/items/talent-sheet.html @@ -0,0 +1,68 @@ +
+
+ {{#if (eq system.subType "skill")}} + + {{else if (eq system.subType "psionic")}} + + {{/if}} +
+
+
+ +
+ + +
+
+
+ + {{#if (eq system.subType "skill")}} +
+
+ + +
+
+ + +
+
+ {{else if (eq system.subType "psionic")}} +
+
+ + +
+
+ + +
+
+ + +
+
+ {{/if}} + +
+ +
+
+ {{#if (eq system.subType "skill")}} +
+ +
+ {{/if}} + {{> systems/mgt2/templates/items/parts/sheet-configuration.html }} +
+
+
+
\ No newline at end of file diff --git a/templates/items/weapon-sheet.html b/templates/items/weapon-sheet.html new file mode 100644 index 0000000..08ac4e1 --- /dev/null +++ b/templates/items/weapon-sheet.html @@ -0,0 +1,89 @@ +
+
+
+
+ + {{> systems/mgt2/templates/items/parts/sheet-physical-item.html }} +
+
+ + +
+
+ + +
+
+
+
+
+ +
+ {{#if hadContainer}} +
+ + +
+ {{/if}} +
+
+
+ +
+ {{#unless system.range.isMelee}} +
+ +
+ + +
+
+ {{/unless}} +
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
{{ localize 'MGT2.Items.Trait' }}
+
{{ localize 'MGT2.Items.Description' }}
+
+
+ {{#each system.traits as |trait i| }} +
+
+
+ +
+
+ +
+
+ {{/each}} +
+
+
+ {{> systems/mgt2/templates/items/parts/sheet-configuration.html }} +
+
+
+
\ No newline at end of file diff --git a/templates/roll-prompt.html b/templates/roll-prompt.html new file mode 100644 index 0000000..05a6c5f --- /dev/null +++ b/templates/roll-prompt.html @@ -0,0 +1,50 @@ +
+
+ + +
+
+ + +
+
+ + +
+
+ {{ localize 'MGT2.RollPrompt.States' }} +
+ + +
+
+
+ + +
+ {{#if showDifficulty}} +
+ + +
+ {{/if}} +
+ + +
+
\ No newline at end of file