From 0f2f8a1fb6aee3513e754a4d394f3446d08ac2b3 Mon Sep 17 00:00:00 2001 From: Kakeman89 Date: Tue, 1 Sep 2020 12:13:00 -0400 Subject: [PATCH] Cleaning up some stuff --- README.md.bak | 9 - lang/en.json | 343 ++--- lang/en.json.bak | 597 -------- less/apps.less | 2 +- module/actor/entity.js | 4 +- module/actor/sheets/base.js | 2 +- module/actor/sheets/character.js | 2 +- module/actor/sheets/npc.js | 2 +- module/apps/actor-flags.js | 8 +- module/combat.js | 2 +- module/config.js | 14 +- module/config.js.bak | 839 ----------- module/item/entity.js.bak | 920 ------------ module/item/sheet.js | 2 +- sw5e.css.bak | 1467 -------------------- sw5e.js.bak | 206 --- template.json.bak | 488 ------- templates/actors/parts/actor-castbook.html | 123 -- templates/items/species.html.bak | 120 -- ui/parchment.jpg | Bin 37349 -> 0 bytes 20 files changed, 191 insertions(+), 4959 deletions(-) delete mode 100644 README.md.bak delete mode 100644 lang/en.json.bak delete mode 100644 module/config.js.bak delete mode 100644 module/item/entity.js.bak delete mode 100644 sw5e.css.bak delete mode 100644 sw5e.js.bak delete mode 100644 template.json.bak delete mode 100644 templates/actors/parts/actor-castbook.html delete mode 100644 templates/items/species.html.bak delete mode 100644 ui/parchment.jpg diff --git a/README.md.bak b/README.md.bak deleted file mode 100644 index 936a4572..00000000 --- a/README.md.bak +++ /dev/null @@ -1,9 +0,0 @@ -# sw5e -SW5E Foundry VTT System - -For easy install - -In the Foundry Configuration and Setup window go to the Game Systems tab, click on the "Install System" button, and -place the following link into the Manifest URL at the bottom - -https://raw.githubusercontent.com/unrealkakeman89/sw5e/master/system.json diff --git a/lang/en.json b/lang/en.json index a443fc79..7b5572c2 100644 --- a/lang/en.json +++ b/lang/en.json @@ -151,18 +151,18 @@ "SW5E.DamRes": "Damage Resistances", "SW5E.DamVuln": "Damage Vulnerabilities", "SW5E.Damage": "Damage", - "SW5E.DamageAcid": "Acid", - "SW5E.DamageCold": "Cold", - "SW5E.DamageEnergy": "Energy", - "SW5E.DamageFire": "Fire", - "SW5E.DamageForce": "Force", - "SW5E.DamageIon": "ION", - "SW5E.DamageKinetic": "Kinetic", - "SW5E.DamageLightning": "Lightning", - "SW5E.DamageNecrotic": "Necrotic", - "SW5E.DamagePoison": "Poison", - "SW5E.DamagePsychic": "Psychic", - "SW5E.DamageSonic": "Sonic", +"SW5E.DamageAcid": "Acid", +"SW5E.DamageCold": "Cold", +"SW5E.DamageEnergy": "Energy", +"SW5E.DamageFire": "Fire", +"SW5E.DamageForce": "Force", +"SW5E.DamageIon": "Ion", +"SW5E.DamageKinetic": "Kinetic", +"SW5E.DamageLightning": "Lightning", +"SW5E.DamageNecrotic": "Necrotic", +"SW5E.DamagePoison": "Poison", +"SW5E.DamagePsychic": "Psychic", +"SW5E.DamageSonic": "Sonic", "SW5E.Day": "Day", "SW5E.DeathSave": "Death Saves", "SW5E.Default": "Default", @@ -283,106 +283,106 @@ "SW5E.JackOfAllTrades": "Jack of all Trades", "SW5E.LairAct": "Lair Action", "SW5E.Languages": "Languages", - "SW5E.LanguagesAleena": "Aleena", - "SW5E.LanguagesAntarian": "Antarian", - "SW5E.LanguagesAnzellan": "Anzellan", - "SW5E.LanguagesAqualish": "Aqualish", - "SW5E.LanguagesArdennian": "Ardennian", - "SW5E.LanguagesBalosur": "Balosur", - "SW5E.LanguagesBarabel": "Barabel", - "SW5E.LanguagesBasic": "Basic", - "SW5E.LanguagesBesalisk": "Besalisk", - "SW5E.LanguagesBinary": "Binary", - "SW5E.LanguagesBith": "Bith", - "SW5E.LanguagesBocce": "Bocce", - "SW5E.LanguagesBothese": "Bothese", - "SW5E.LanguagesCatharese": "Catharese", - "SW5E.LanguagesCerean": "Cerean", - "SW5E.LanguagesChadra-Fan": "Chadra-Fan", - "SW5E.LanguagesChagri": "Chagri", - "SW5E.LanguagesCheunh": "Cheunh", - "SW5E.LanguagesChevin": "Chevin", - "SW5E.LanguagesChironan": "Chironan", - "SW5E.LanguagesClawdite": "Clawdite", - "SW5E.LanguagesCodruese": "Codruese", - "SW5E.LanguagesColicoid": "Colicoid", - "SW5E.LanguagesDashadi": "Dashadi", - "SW5E.LanguagesDefel": "Defel", - "SW5E.LanguagesDevaronese": "Devaronese", - "SW5E.LanguagesDosh": "Dosh", - "SW5E.LanguagesDraethos": "Draethos", - "SW5E.LanguagesDug": "Dug", - "SW5E.LanguagesDurese": "Durese", - "SW5E.LanguagesEwokese": "Ewokese", - "SW5E.LanguagesFalleen": "Falleen", - "SW5E.LanguagesFelucianese": "Felucianese", - "SW5E.LanguagesGamorrese": "Gamorrese", - "SW5E.LanguagesGand": "Gand", - "SW5E.LanguagesGeonosian": "Geonosian", - "SW5E.LanguagesGivin": "Givin", - "SW5E.LanguagesGran": "Gran", - "SW5E.LanguagesGungan": "Gungan", - "SW5E.LanguagesHapan": "Hapan", - "SW5E.LanguagesHarchese": "Harchese", - "SW5E.LanguagesHerglese": "Herglese", - "SW5E.LanguagesHonoghran": "Honoghran", - "SW5E.LanguagesHuttese": "Huttese", - "SW5E.LanguagesIktotchese": "Iktotchese", - "SW5E.LanguagesIthorese": "Ithorese", - "SW5E.LanguagesJawaese": "Jawaese", - "SW5E.LanguagesKaleesh": "Kaleesh", - "SW5E.LanguagesKaminoan": "Kaminoan", - "SW5E.LanguagesKarkaran": "Karkaran", - "SW5E.LanguagesKelDor": "Kel Dor", - "SW5E.LanguagesKharan": "Kharan", - "SW5E.LanguagesKillik": "Killik", - "SW5E.LanguagesKlatooinian": "Klatooinian", - "SW5E.LanguagesKubazian": "Kubazian", - "SW5E.LanguagesKushiban": "Kushiban", - "SW5E.LanguagesKyuzo": "Kyuzo", - "SW5E.LanguagesLannik": "Lannik", - "SW5E.LanguagesLasat": "Lasat", - "SW5E.LanguagesLowickese": "Lowickese", - "SW5E.LanguagesMandoa": "Mando'a", - "SW5E.LanguagesMiralukese": "Miralukese", - "SW5E.LanguagesMirialan": "Mirialan", - "SW5E.LanguagesMonCal": "Mon Cal", - "SW5E.LanguagesMustafarian": "Mustafarian", - "SW5E.LanguagesMuun": "Muun", - "SW5E.LanguagesNautila": "Nautila", - "SW5E.LanguagesOrtolan": "Ortolan", - "SW5E.LanguagesPakPak": "Pak Pak", - "SW5E.LanguagesPyke": "Pyke", - "SW5E.LanguagesQuarrenese": "Quarrenese", - "SW5E.LanguagesRakata": "Rakata", - "SW5E.LanguagesRattataki": "Rattataki", - "SW5E.LanguagesRishii": "Rishii", - "SW5E.LanguagesRodese": "Rodese", - "SW5E.LanguagesSelkatha": "Selkatha", - "SW5E.LanguagesSemblan": "Semblan", - "SW5E.LanguagesShyriiwook": "Shyriiwook", - "SW5E.LanguagesShistavanen": "Shistavanen", - "SW5E.LanguagesSith": "Sith", - "SW5E.LanguagesSquibbian": "Squibbian", - "SW5E.LanguagesSriluurian": "Sriluurian", - "SW5E.LanguagesSsi-ruuvi": "Ssi-ruuvi", - "SW5E.LanguagesSullustese": "Sullustese", - "SW5E.LanguagesTalzzi": "Talzzi", - "SW5E.LanguagesThisspiasian": "Thisspiasian", - "SW5E.LanguagesTogorese": "Togorese", - "SW5E.LanguagesTogruti": "Togruti", - "SW5E.LanguagesToydarian": "Toydarian", - "SW5E.LanguagesTusken": "Tusken", - "SW5E.LanguagesTwileki": "Twi'leki", - "SW5E.LanguagesUgnaught": "Ugnaught", - "SW5E.LanguagesUmbaran": "Umbaran", - "SW5E.LanguagesUtapese": "Utapese", - "SW5E.LanguagesVerpine": "Verpine", - "SW5E.LanguagesVong": "Vong", - "SW5E.LanguagesVoss": "Voss", - "SW5E.LanguagesYevethan": "Yevethan", - "SW5E.LanguagesZabraki": "Zabraki", - "SW5E.LanguagesZygerrian": "Zygerrian", +"SW5E.LanguagesAleena": "Aleena", +"SW5E.LanguagesAntarian": "Antarian", +"SW5E.LanguagesAnzellan": "Anzellan", +"SW5E.LanguagesAqualish": "Aqualish", +"SW5E.LanguagesArdennian": "Ardennian", +"SW5E.LanguagesBalosur": "Balosur", +"SW5E.LanguagesBarabel": "Barabel", +"SW5E.LanguagesBasic": "Basic", +"SW5E.LanguagesBesalisk": "Besalisk", +"SW5E.LanguagesBinary": "Binary", +"SW5E.LanguagesBith": "Bith", +"SW5E.LanguagesBocce": "Bocce", +"SW5E.LanguagesBothese": "Bothese", +"SW5E.LanguagesCatharese": "Catharese", +"SW5E.LanguagesCerean": "Cerean", +"SW5E.LanguagesChadra-Fan": "Chadra-Fan", +"SW5E.LanguagesChagri": "Chagri", +"SW5E.LanguagesCheunh": "Cheunh", +"SW5E.LanguagesChevin": "Chevin", +"SW5E.LanguagesChironan": "Chironan", +"SW5E.LanguagesClawdite": "Clawdite", +"SW5E.LanguagesCodruese": "Codruese", +"SW5E.LanguagesColicoid": "Colicoid", +"SW5E.LanguagesDashadi": "Dashadi", +"SW5E.LanguagesDefel": "Defel", +"SW5E.LanguagesDevaronese": "Devaronese", +"SW5E.LanguagesDosh": "Dosh", +"SW5E.LanguagesDraethos": "Draethos", +"SW5E.LanguagesDug": "Dug", +"SW5E.LanguagesDurese": "Durese", +"SW5E.LanguagesEwokese": "Ewokese", +"SW5E.LanguagesFalleen": "Falleen", +"SW5E.LanguagesFelucianese": "Felucianese", +"SW5E.LanguagesGamorrese": "Gamorrese", +"SW5E.LanguagesGand": "Gand", +"SW5E.LanguagesGeonosian": "Geonosian", +"SW5E.LanguagesGivin": "Givin", +"SW5E.LanguagesGran": "Gran", +"SW5E.LanguagesGungan": "Gungan", +"SW5E.LanguagesHapan": "Hapan", +"SW5E.LanguagesHarchese": "Harchese", +"SW5E.LanguagesHerglese": "Herglese", +"SW5E.LanguagesHonoghran": "Honoghran", +"SW5E.LanguagesHuttese": "Huttese", +"SW5E.LanguagesIktotchese": "Iktotchese", +"SW5E.LanguagesIthorese": "Ithorese", +"SW5E.LanguagesJawaese": "Jawaese", +"SW5E.LanguagesKaleesh": "Kaleesh", +"SW5E.LanguagesKaminoan": "Kaminoan", +"SW5E.LanguagesKarkaran": "Karkaran", +"SW5E.LanguagesKelDor": "Kel Dor", +"SW5E.LanguagesKharan": "Kharan", +"SW5E.LanguagesKillik": "Killik", +"SW5E.LanguagesKlatooinian": "Klatooinian", +"SW5E.LanguagesKubazian": "Kubazian", +"SW5E.LanguagesKushiban": "Kushiban", +"SW5E.LanguagesKyuzo": "Kyuzo", +"SW5E.LanguagesLannik": "Lannik", +"SW5E.LanguagesLasat": "Lasat", +"SW5E.LanguagesLowickese": "Lowickese", +"SW5E.LanguagesMandoa": "Mando'a", +"SW5E.LanguagesMiralukese": "Miralukese", +"SW5E.LanguagesMirialan": "Mirialan", +"SW5E.LanguagesMonCal": "Mon Cal", +"SW5E.LanguagesMustafarian": "Mustafarian", +"SW5E.LanguagesMuun": "Muun", +"SW5E.LanguagesNautila": "Nautila", +"SW5E.LanguagesOrtolan": "Ortolan", +"SW5E.LanguagesPakPak": "Pak Pak", +"SW5E.LanguagesPyke": "Pyke", +"SW5E.LanguagesQuarrenese": "Quarrenese", +"SW5E.LanguagesRakata": "Rakata", +"SW5E.LanguagesRattataki": "Rattataki", +"SW5E.LanguagesRishii": "Rishii", +"SW5E.LanguagesRodese": "Rodese", +"SW5E.LanguagesSelkatha": "Selkatha", +"SW5E.LanguagesSemblan": "Semblan", +"SW5E.LanguagesShyriiwook": "Shyriiwook", +"SW5E.LanguagesShistavanen": "Shistavanen", +"SW5E.LanguagesSith": "Sith", +"SW5E.LanguagesSquibbian": "Squibbian", +"SW5E.LanguagesSriluurian": "Sriluurian", +"SW5E.LanguagesSsi-ruuvi": "Ssi-ruuvi", +"SW5E.LanguagesSullustese": "Sullustese", +"SW5E.LanguagesTalzzi": "Talzzi", +"SW5E.LanguagesThisspiasian": "Thisspiasian", +"SW5E.LanguagesTogorese": "Togorese", +"SW5E.LanguagesTogruti": "Togruti", +"SW5E.LanguagesToydarian": "Toydarian", +"SW5E.LanguagesTusken": "Tusken", +"SW5E.LanguagesTwileki": "Twi'leki", +"SW5E.LanguagesUgnaught": "Ugnaught", +"SW5E.LanguagesUmbaran": "Umbaran", +"SW5E.LanguagesUtapese": "Utapese", +"SW5E.LanguagesVerpine": "Verpine", +"SW5E.LanguagesVong": "Vong", +"SW5E.LanguagesVoss": "Voss", +"SW5E.LanguagesYevethan": "Yevethan", +"SW5E.LanguagesZabraki": "Zabraki", +"SW5E.LanguagesZygerrian": "Zygerrian", "SW5E.LegAct": "Legd. Actions", "SW5E.LegRes": "Legd. Resistance", "SW5E.Level": "Level", @@ -540,6 +540,7 @@ "SW5E.TargetCreature": "Creature", "SW5E.TargetCube": "Cube", "SW5E.TargetCylinder": "Cylinder", +"SW5E.TargetDroid": "Droid", "SW5E.TargetEnemy": "Enemy", "SW5E.TargetLine": "Line", "SW5E.TargetObject": "Object", @@ -549,7 +550,7 @@ "SW5E.TargetSphere": "Sphere", "SW5E.TargetSquare": "Square", "SW5E.TargetWall": "Wall", -"SW5E.TargetDroid": "Droid", +"SW5E.TargetWeapon": "Weapon" "SW5E.Temp": "Temp", "SW5E.TimeDay": "Days", "SW5E.TimeHour": "Hours", @@ -560,34 +561,34 @@ "SW5E.TimeRound": "Rounds", "SW5E.TimeTurn": "Turns", "SW5E.TimeYear": "Years", - "SW5E.ToolArmormech": "Armormech's Tools", - "SW5E.ToolArmstech": "Armstech's Tools", - "SW5E.ToolArtificer": "Artificer's Tools", - "SW5E.ToolArtist": "Artist's Tools", - "SW5E.ToolAstrotech": "Astrotech's Tools", - "SW5E.ToolBiotech": "Biotech's Tools", - "SW5E.ToolConstructor": "Constructor's Tools", - "SW5E.ToolCybertech": "Cybertech's Tools", - "SW5E.ToolJeweler": "Jeweler's Tools", - "SW5E.ToolSurveyor": "Surveyor's Tools", - "SW5E.ToolSynthweaver": "Synthweavers's Tools", - "SW5E.ToolTinker": "Tinker's Tools", - "SW5E.ToolAntitoxkit": "Antitoxkit", - "SW5E.ToolArchaeologistKit": "Archaeologist Kit", - "SW5E.ToolAudiotechKit": "Audiotech's Kit", - "SW5E.ToolBioanalysisKit": "Bioanalysis Kit", - "SW5E.ToolBrewerKit": "Brewer's Kit", - "SW5E.ToolChefKit": "Chef's Kit", - "SW5E.ToolDemolitionKit": "Demolition Kit", - "SW5E.ToolDisguiseKit": "Disguise Kit", - "SW5E.ToolForgeryKit": "Forgery Kit", - "SW5E.ToolMechanicKit": "Mechanic's Kit", - "SW5E.ToolMunitionsKit": "Munitions Kit", - "SW5E.ToolPoisonKit": "Poisoner's Kit", - "SW5E.ToolScavengingKit": "Scavenging Kit", - "SW5E.ToolSecurityKit": "Security Kit", - "SW5E.ToolSlicerKit": "Slicer's Kit", - "SW5E.ToolSpiceKit": "Spicer's Kit", +"SW5E.ToolArmormech": "Armormech's Tools", +"SW5E.ToolArmstech": "Armstech's Tools", +"SW5E.ToolArtificer": "Artificer's Tools", +"SW5E.ToolArtist": "Artist's Tools", +"SW5E.ToolAstrotech": "Astrotech's Tools", +"SW5E.ToolBiotech": "Biotech's Tools", +"SW5E.ToolConstructor": "Constructor's Tools", +"SW5E.ToolCybertech": "Cybertech's Tools", +"SW5E.ToolJeweler": "Jeweler's Tools", +"SW5E.ToolSurveyor": "Surveyor's Tools", +"SW5E.ToolSynthweaver": "Synthweavers's Tools", +"SW5E.ToolTinker": "Tinker's Tools", +"SW5E.ToolAntitoxkit": "Antitoxkit", +"SW5E.ToolArchaeologistKit": "Archaeologist Kit", +"SW5E.ToolAudiotechKit": "Audiotech's Kit", +"SW5E.ToolBioanalysisKit": "Bioanalysis Kit", +"SW5E.ToolBrewerKit": "Brewer's Kit", +"SW5E.ToolChefKit": "Chef's Kit", +"SW5E.ToolDemolitionKit": "Demolition Kit", +"SW5E.ToolDisguiseKit": "Disguise Kit", +"SW5E.ToolForgeryKit": "Forgery Kit", +"SW5E.ToolMechanicKit": "Mechanic's Kit", +"SW5E.ToolMunitionsKit": "Munitions Kit", +"SW5E.ToolPoisonKit": "Poisoner's Kit", +"SW5E.ToolScavengingKit": "Scavenging Kit", +"SW5E.ToolSecurityKit": "Security Kit", +"SW5E.ToolSlicerKit": "Slicer's Kit", +"SW5E.ToolSpiceKit": "Spicer's Kit", "SW5E.ToolGamingSet": "Gaming Set", "SW5E.ToolMusicalInstrument": "Musical Instrument", "SW5E.ToolVehicle": "Vehicle (Land or Water)", @@ -611,36 +612,36 @@ "SW5E.WeaponMartialB": "Martial Blaster", "SW5E.WeaponMartialLW": "Martial Lightweapon", "SW5E.WeaponNatural": "Natural", - "SW5E.WeaponPropertiesAmm": "Ammunition", - "SW5E.WeaponPropertiesBur": "Burst", - "SW5E.WeaponPropertiesDef": "Defensive", - "SW5E.WeaponPropertiesDex": "Dexterity Rqmt.", - "SW5E.WeaponPropertiesDrm": "Disarming", - "SW5E.WeaponPropertiesDgd": "Disguised", - "SW5E.WeaponPropertiesDis": "Disintegrate", - "SW5E.WeaponPropertiesDpt": "Disruptive", - "SW5E.WeaponPropertiesDou": "Double", - "SW5E.WeaponPropertiesFin": "Finesse", - "SW5E.WeaponPropertiesFix": "Fixed", - "SW5E.WeaponPropertiesFoc": "Focus", - "SW5E.WeaponPropertiesHvy": "Heavy", - "SW5E.WeaponPropertiesHid": "Hidden", - "SW5E.WeaponPropertiesKen": "Keen", - "SW5E.WeaponPropertiesLgt": "Light", - "SW5E.WeaponPropertiesLum": "Luminous", - "SW5E.WeaponPropertiesPic": "Piercing", - "SW5E.WeaponPropertiesRan": "Range", - "SW5E.WeaponPropertiesRap": "Rapid", - "SW5E.WeaponPropertiesRch": "Reach", - "SW5E.WeaponPropertiesRel": "Reload", - "SW5E.WeaponPropertiesRet": "Returning", - "SW5E.WeaponPropertiesShk": "Shocking", - "SW5E.WeaponPropertiesSpc": "Special", - "SW5E.WeaponPropertiesStr": "Strength Rqmt.", - "SW5E.WeaponPropertiesThr": "Thrown", - "SW5E.WeaponPropertiesTwo": "Two-Handed", - "SW5E.WeaponPropertiesVer": "Versatile", - "SW5E.WeaponPropertiesVic": "Vicious", +"SW5E.WeaponPropertiesAmm": "Ammunition", +"SW5E.WeaponPropertiesBur": "Burst", +"SW5E.WeaponPropertiesDef": "Defensive", +"SW5E.WeaponPropertiesDex": "Dexterity Rqmt.", +"SW5E.WeaponPropertiesDrm": "Disarming", +"SW5E.WeaponPropertiesDgd": "Disguised", +"SW5E.WeaponPropertiesDis": "Disintegrate", +"SW5E.WeaponPropertiesDpt": "Disruptive", +"SW5E.WeaponPropertiesDou": "Double", +"SW5E.WeaponPropertiesFin": "Finesse", +"SW5E.WeaponPropertiesFix": "Fixed", +"SW5E.WeaponPropertiesFoc": "Focus", +"SW5E.WeaponPropertiesHvy": "Heavy", +"SW5E.WeaponPropertiesHid": "Hidden", +"SW5E.WeaponPropertiesKen": "Keen", +"SW5E.WeaponPropertiesLgt": "Light", +"SW5E.WeaponPropertiesLum": "Luminous", +"SW5E.WeaponPropertiesPic": "Piercing", +"SW5E.WeaponPropertiesRan": "Range", +"SW5E.WeaponPropertiesRap": "Rapid", +"SW5E.WeaponPropertiesRch": "Reach", +"SW5E.WeaponPropertiesRel": "Reload", +"SW5E.WeaponPropertiesRet": "Returning", +"SW5E.WeaponPropertiesShk": "Shocking", +"SW5E.WeaponPropertiesSpc": "Special", +"SW5E.WeaponPropertiesStr": "Strength Rqmt.", +"SW5E.WeaponPropertiesThr": "Thrown", +"SW5E.WeaponPropertiesTwo": "Two-Handed", +"SW5E.WeaponPropertiesVer": "Versatile", +"SW5E.WeaponPropertiesVic": "Vicious", "SW5E.WeaponSimpleVW": "Simple Vibroweapon", "SW5E.WeaponSimpleProficiency": "Simple Weapons", "SW5E.WeaponSimpleB": "Simple Blaster", diff --git a/lang/en.json.bak b/lang/en.json.bak deleted file mode 100644 index 17618def..00000000 --- a/lang/en.json.bak +++ /dev/null @@ -1,597 +0,0 @@ -{ -"Star Wars 5th Edition": "Star Wars 5th Edition", -"SW5E.title": "Star Wars 5th Edition", -"SW5E.AbbreviationCR": "CR", -"SW5E.AbbreviationConc": "Conc.", -"SW5E.AbbreviationDC": "DC", -"SW5E.AbbreviationLR": "LR", -"SW5E.AbbreviationLbs": "lbs.", -"SW5E.AbbreviationSR": "SR", -"SW5E.Ability": "Ability", -"SW5E.AbilityCha": "Charisma", -"SW5E.AbilityCon": "Constitution", -"SW5E.AbilityDex": "Dexterity", -"SW5E.AbilityInt": "Intelligence", -"SW5E.AbilityModifier": "Ability Modifier", -"SW5E.AbilityStr": "Strength", -"SW5E.AbilityUseCantUse": "You are not currently able to use this ability!", -"SW5E.AbilityUseCharged": "charged", -"SW5E.AbilityUseConsume": "Consume Available Usage?", -"SW5E.AbilityUseDepleted": "depleted", -"SW5E.AbilityUseHint": "Configure how you would like to use the", -"SW5E.AbilityUseRechargeHint": "This ability uses a recharge mechanic and is currently", -"SW5E.AbilityUseWarnEnd": "available uses per", -"SW5E.AbilityUseWarnStart": "This ability has", -"SW5E.AbilityWis": "Wisdom", -"SW5E.Action": "Action", -"SW5E.ActionAbil": "Ability Check", -"SW5E.ActionHeal": "Healing", -"SW5E.ActionMPAK": "Melee Power Attack", -"SW5E.ActionMWAK": "Melee Weapon Attack", -"SW5E.ActionOther": "Other", -"SW5E.ActionRPAK": "Ranged Power Attack", -"SW5E.ActionRWAK": "Ranged Weapon Attack", -"SW5E.ActionSave": "Saving Throw", -"SW5E.ActionUtil": "Utility", -"SW5E.Add": "Add", -"SW5E.Advantage": "Advantage", -"SW5E.Alignment": "Alignment", -"SW5E.AlignmentCD": "Chaotic Dark", -"SW5E.AlignmentCL": "Chaotic Light", -"SW5E.AlignmentCN": "Chaotic Neutral", -"SW5E.AlignmentLD": "Lawful Dark", -"SW5E.AlignmentLL": "Lawful Light", -"SW5E.AlignmentLN": "Lawful Neutral", -"SW5E.AlignmentND": "Neutral Dark", -"SW5E.AlignmentNL": "Neutral Light", -"SW5E.AlignmentBN": "Balenced Neutral", -"SW5E.ArmorClass": "Armor Class", -"SW5E.ArmorProperties": "Armor Properties", -"SW5E.ArmorProperAbsorptive": "Absorptive", -"SW5E.ArmorProperAgile": "Agile", -"SW5E.ArmorProperAnchor": "Anchor", -"SW5E.ArmorProperAvoidant": "Avoidant", -"SW5E.ArmorProperBarbed": "Barbed", -"SW5E.ArmorProperCharging": "Charging", -"SW5E.ArmorProperConcealing": "Concealing", -"SW5E.ArmorProperCumbersome": "Cumbersome", -"SW5E.ArmorProperGauntleted": "Gauntleted", -"SW5E.ArmorProperImbalanced": "Imbalanced", -"SW5E.ArmorProperImpermeable": "Impermeable", -"SW5E.ArmorProperInsulated": "Insulated", -"SW5E.ArmorProperInterlocking": "Interlocking", -"SW5E.ArmorProperLambent": "Lambent", -"SW5E.ArmorProperLightweight": "Lightweight", -"SW5E.ArmorProperMagnetic": "Magnetic", -"SW5E.ArmorProperObscured": "Obscured", -"SW5E.ArmorProperPowered": "Powered", -"SW5E.ArmorProperReactive": "Reactive", -"SW5E.ArmorProperRegulated": "Regulated", -"SW5E.ArmorProperReinforced": "Reinforced", -"SW5E.ArmorProperResponsive": "Responsive", -"SW5E.ArmorProperRigid": "Rigid", -"SW5E.ArmorProperSilent": "Silent", -"SW5E.ArmorProperSpiked": "Spiked", -"SW5E.ArmorProperSteadfast": "Steadfast", -"SW5E.ArmorProperVersatile": "Versatile", -"SW5E.Attack": "Attack", -"SW5E.Attributes": "Attributes", -"SW5E.Attuned": "Attuned", -"SW5E.Background": "Background", -"SW5E.Biography": "Biography", -"SW5E.BonusAbilityCheck": "Global Ability Check Bonus", -"SW5E.BonusAbilitySave": "Global Saving Throw Bonus", -"SW5E.BonusAbilitySkill": "Global Skill Check Bonus", -"SW5E.BonusAction": "Bonus Action", -"SW5E.BonusMSAttack": "Melee Power Attack Bonus", -"SW5E.BonusMSDamage": "Melee Power Damage Bonus", -"SW5E.BonusMWAttack": "Melee Weapon Attack Bonus", -"SW5E.BonusMWDamage": "Melee Weapon Damage Bonus", -"SW5E.BonusRSAttack": "Ranged Power Attack Bonus", -"SW5E.BonusRSDamage": "Ranged Power Damage Bonus", -"SW5E.BonusRWAttack": "Ranged Weapon Attack Bonus", -"SW5E.BonusRWDamage": "Ranged Weapon Damage Bonus", -"SW5E.BonusSaveForm": "Update Bonuses", -"SW5E.BonusPowerDC": "Global Power DC Bonus", -"SW5E.BonusTitle": "Configure Actor Bonuses", -"SW5E.Bonuses": "Global Bonuses", -"SW5E.BonusesHint": "Define global bonuses as formulas which are added to certain rolls. For example: 1d4 + 2", -"SW5E.BonusesInstructions": "Configure character bonuses which are added to the appropriate dice roll", -"SW5E.ChallengeRating": "Challenge Rating", -"SW5E.Charged": "Charged", -"SW5E.Charges": "Charges", -"SW5E.ChatContextDamage": "Apply Damage", -"SW5E.ChatContextHealing": "Apply Healing", -"SW5E.ChatContextDoubleDamage": "Apply Double Damage", -"SW5E.ChatContextHalfDamage": "Apply Half Damage", -"SW5E.ChatFlavor": "Chat Message Flavor", -"SW5E.ClassLevels": "Class Levels", -"SW5E.ClassName": "Class Name", -"SW5E.ClassSkillsNumber": "Number of Starting Skills", -"SW5E.ClassSkillsChosen": "Chosen Class Skills", -"SW5E.ComponentMaterial": "Material", -"SW5E.ComponentSomatic": "Somatic", -"SW5E.ComponentVerbal": "Verbal", -"SW5E.ConBlinded": "Blinded", -"SW5E.ConCharmed": "Charmed", -"SW5E.ConDeafened": "Deafened", -"SW5E.ConExhaustion": "Exhaustion", -"SW5E.ConFrightened": "Frightened", -"SW5E.ConGrappled": "Grappled", -"SW5E.ConImm": "Condition Immunities", -"SW5E.ConIncapacitated": "Incapacitated", -"SW5E.ConInvisible": "Invisible", -"SW5E.ConParalyzed": "Paralyzed", -"SW5E.ConPetrified": "Petrified", -"SW5E.ConPoisoned": "Poisoned", -"SW5E.ConProne": "Prone", -"SW5E.ConRestrained": "Restrained", -"SW5E.ConShocked": "Shocked", -"SW5E.ConStunned": "Stunned", -"SW5E.ConUnconscious": "Unconscious", -"SW5E.Concentration": "Concentration", -"SW5E.ConsumableFood": "Food", -"SW5E.ConsumablePoison": "Poison", -"SW5E.ConsumableAdrenal": "Adrenal", -"SW5E.ConsumableExplosive": "Explosive", -"SW5E.ConsumableMedpac": "Medpac", -"SW5E.ConsumableTrinket": "Trinket", -"SW5E.ConsumableTechnology": "Technology", -"SW5E.ConsumableAmmunition": "Ammunition", -"SW5E.Consumed": "Consumed", -"SW5E.CostGP": "Cost (GP)", -"SW5E.Critical": "Critical", -"SW5E.CriticalHit": "Critical Hit", -"SW5E.Currency": "Currency", -"SW5E.CurrencyConvert": "Convert All Currency", -"SW5E.CurrencyConvertHint": "Convert all carried currency to the highest possible denomination to reduce the amount of coinage carried by the character. Be wary, this action cannot be undone.", -"SW5E.CurrencyGC": "Credits", -"SW5E.DamImm": "Damage Immunities", -"SW5E.DamRes": "Damage Resistances", -"SW5E.DamVuln": "Damage Vulnerabilities", -"SW5E.Damage": "Damage", - "SW5E.DamageAcid": "Acid", - "SW5E.DamageCold": "Cold", - "SW5E.DamageEnergy": "Energy", - "SW5E.DamageFire": "Fire", - "SW5E.DamageForce": "Force", - "SW5E.DamageIon": "ION", - "SW5E.DamageKinetic": "Kinetic", - "SW5E.DamageLightning": "Lightning", - "SW5E.DamageNecrotic": "Necrotic", - "SW5E.DamagePoison": "Poison", - "SW5E.DamagePsychic": "Psychic", - "SW5E.DamageSonic": "Sonic", -"SW5E.Day": "Day", -"SW5E.DeathSave": "Death Saves", -"SW5E.Default": "Default", -"SW5E.DefaultAbilityCheck": "Default Ability Check", -"SW5E.Description": "Description", -"SW5E.Details": "Details", -"SW5E.Disadvantage": "Disadvantage", -"SW5E.DistAny": "Any", -"SW5E.DistFt": "Feet", -"SW5E.DistMi": "Miles", -"SW5E.DistSelf": "Self", -"SW5E.DistTouch": "Touch", -"SW5E.Duration": "Duration", -"SW5E.EquipmentBonus": "Magical Bonus", -"SW5E.EquipmentClothing": "Clothing", -"SW5E.EquipmentHeavy": "Heavy Armor", -"SW5E.EquipmentLight": "Light Armor", -"SW5E.EquipmentMedium": "Medium Armor", -"SW5E.EquipmentNatural": "Natural Armor", -"SW5E.EquipmentShield": "Shield", -"SW5E.EquipmentShieldProficiency": "Shields", -"SW5E.EquipmentTrinket": "Trinket", -"SW5E.Equipped": "Equipped", -"SW5E.Exhaustion": "Exhaustion", -"SW5E.Expertise": "Expertise", -"SW5E.FeatureActionRecharge": "Action Recharge", - -"SW5E.ItemTypeClass": "Class", -"SW5E.ItemTypeClassPl": "Class Levels", -"SW5E.ItemTypeConsumable": "Consumable", -"SW5E.ItemTypeConsumablePl": "Consumables", -"SW5E.ItemTypeContainer": "Container", -"SW5E.ItemTypeContainerPl": "Containers", -"SW5E.ItemTypeEquipment": "Equipment", -"SW5E.ItemTypeEquipmentPl": "Equipment", -"SW5E.ItemTypeLoot": "Loot", -"SW5E.ItemTypeLootPl": "Loot", -"SW5E.ItemTypeSpecies": "Species", -"SW5E.ItemTypeSpeciesPl": "Species", -"SW5E.ItemTypeTool": "Tool", -"SW5E.ItemTypeToolPl": "Tools", -"SW5E.ItemTypePower": "Power", -"SW5E.ItemTypePowerPl": "Powers", -"SW5E.ItemTypeWeapon": "Weapon", -"SW5E.ItemTypeWeaponPl": "Weapons", - -"SW5E.FeatureActive": "Active Abilities", -"SW5E.FeatureAdd": "Create Feature", -"SW5E.FeatureAttack": "Feature Attack", -"SW5E.FeaturePassive": "Passive Abilities", -"SW5E.FeatureRechargeOn": "Recharge On", -"SW5E.FeatureRechargeResult": "1d6 Result", -"SW5E.FeatureUsage": "Feature Usage", -"SW5E.Features": "Features", -"SW5E.Filter": "Filter", -"SW5E.FilterNoPowers": "No powers found for this set of filters.", -"SW5E.NoPowerLevels": "This character has no powercaster levels, but you may add powers manually.", -"SW5E.FlagsInstructions": "Configure character features and traits which fine-tune behaviors of the SW5e system.", -"SW5E.FlagsSave": "Update Special Traits", -"SW5E.FlagsTitle": "Configure Special Traits", -"SW5E.Flat": "Flat", -"SW5E.Formula": "Formula", -"SW5E.GrantedAbilities": "Granted Abilities", -"SW5E.HalfProficient": "Half Proficient", -"SW5E.Healing": "Healing", -"SW5E.HealingTemp": "Healing (Temporary)", -"SW5E.Health": "Health", -"SW5E.HealthFormula": "Health Formula", -"SW5E.HitDice": "Hit Dice", -"SW5E.HitDiceUsed": "Hit Dice Used", -"SW5E.Identified": "Identified", -"SW5E.Initiative": "Initiative", -"SW5E.Inspiration": "Inspiration", -"SW5E.Inventory": "Inventory", -"SW5E.ItemActionType": "Action Type", -"SW5E.ItemActivationCondition": "Activation Condition", -"SW5E.ItemActivationCost": "Activation Cost", -"SW5E.ItemAttackBonus": "Attack Roll Bonus", -"SW5E.ItemConsumableActivation": "Consumable Activation", -"SW5E.ItemConsumableDetails": "Consumable Details", - -"SW5E.ItemConsumableStatus": "Consumable Status", -"SW5E.ItemConsumableType": "Consumable Type", -"SW5E.ItemConsumableUsage": "Consumable Usage", -"SW5E.ItemConsumeOnUse": "Consume on Use", -"SW5E.ItemContainerCapacity": "Capacity", -"SW5E.ItemContainerCapacityItems": "Items", -"SW5E.ItemContainerCapacityType": "Capacity Type", -"SW5E.ItemContainerCapacityWeight": "Weight", -"SW5E.ItemContainerDetails": "Container Details", - -"SW5E.ItemContainerProperties": "Container Properties", -"SW5E.ItemContainerWeightless": "Weightless Contents", -"SW5E.ItemCreate": "Create Item", -"SW5E.ItemDelete": "Delete Item", -"SW5E.ItemDestroyEmpty": "Destroy on Empty", -"SW5E.ItemEdit": "Edit Item", -"SW5E.ItemEquipmentAction": "Equipment Action", -"SW5E.ItemEquipmentDetails": "Equipment Details", -"SW5E.ItemEquipmentDexMod": "Max. Dexterity Modifier", - -"SW5E.ItemEquipmentStatus": "Equipment Status", -"SW5E.ItemEquipmentStealthDisav": "Imposes Stealth Disadvantage", -"SW5E.ItemEquipmentType": "Equipment Type", -"SW5E.ItemEquipmentUsage": "Equipment Usage", - -"SW5E.ItemName": "Item Name", -"SW5E.ItemRequiredStr": "Required Strength", -"SW5E.ItemToolProficiency": "Tool Proficiency", - -"SW5E.ItemWeaponAttack": "Weapon Attack", -"SW5E.ItemWeaponDetails": "Weapon Details", -"SW5E.ItemWeaponProperties": "Weapon Properties", - -"SW5E.ItemWeaponStatus": "Weapon Status", -"SW5E.ItemWeaponType": "Weapon Type", -"SW5E.ItemWeaponUsage": "Weapon Usage", -"SW5E.JackOfAllTrades": "Jack of all Trades", -"SW5E.LairAct": "Lair Action", -"SW5E.Languages": "Languages", - "SW5E.LanguagesBasic": "Basic", - "SW5E.LanguagesBinary": "Binary", - "SW5E.LanguagesBith": "Bith", - "SW5E.LanguagesBocce": "Bocce", - "SW5E.LanguagesBothese": "Bothese", - "SW5E.LanguagesCartharese": "Catharese", - "SW5E.LanguagesCheunh": "Cheunh", - "SW5E.LanguagesDurese": "Durese", - "SW5E.LanguagesDug": "Dug", - "SW5E.LanguagesEwokese": "Ewokese", - "SW5E.LanguagesGamorrese": "Gamorrese", - "SW5E.LanguagesGeonosian": "Geonosian", - "SW5E.LanguagesHapan": "Hapan", - "SW5E.LanguagesHuttese": "Huttese", - "SW5E.LanguagesJawaese": "Jawaese", - "SW5E.LanguagesKaleesh": "Kaleesh", - "SW5E.LanguagesKaminoan": "Kaminoan", - "SW5E.LanguagesKelDor": "Kel Dor", - "SW5E.LanguagesMandoa": "Mando'a", - "SW5E.LanguagesMonCal": "Mon Cal", - "SW5E.LanguagesPakPak": "Pak Pak", - "SW5E.LanguagesRodese": "Rodese", - "SW5E.LanguagesSith": "Sith", - "SW5E.LanguagesTogruti": "Togruti", - "SW5E.LanguagesDosh": "Dosh", - "SW5E.LanguagesTwileki": "Twi'leki", - "SW5E.LanguagesTusken": "Tusken", - "SW5E.LanguagesShyriiwook": "Shyriiwook", - "SW5E.LanguagesZabraki": "Zabraki", - "SW5E.LanguagesVong": "Vong", -"SW5E.LegAct": "Legd. Actions", -"SW5E.LegRes": "Legd. Resistance", -"SW5E.Level": "Level", -"SW5E.LevelScaling": "Level Scaling", -"SW5E.LimitedUses": "Limited Uses", -"SW5E.LongRest": "Long Rest", -"SW5E.Max": "Max", -"SW5E.Modifier": "Modifier", -"SW5E.Name": "Character Name", -"SW5E.NoCharges": "No Charges", -"SW5E.None": "None", -"SW5E.Normal": "Normal", -"SW5E.NotProficient": "Not Proficient", -"SW5E.OtherFormula": "Other Formula", -"SW5E.PlaceTemplate": "Place Measured Template", -"SW5E.Polymorph": "Polymorph", -"SW5E.PolymorphAcceptSettings": "Custom Settings", -"SW5E.PolymorphKeepBio": "Keep biography", -"SW5E.PolymorphKeepClass": "Keep proficiency bonus (leaves class items in sheet)", -"SW5E.PolymorphKeepFeats": "Keep features", -"SW5E.PolymorphKeepItems": "Keep equipment", -"SW5E.PolymorphKeepMental": "Keep mental ability scores (Int, Wis, Cha)", -"SW5E.PolymorphKeepPhysical": "Keep physical ability scores (Str, Dex, Con)", -"SW5E.PolymorphKeepSaves": "Keep saving throw proficiencies", -"SW5E.PolymorphKeepSkills": "Keep skill proficiencies", -"SW5E.PolymorphKeepPowers": "Keep powers", -"SW5E.PolymorphKeepVision": "Keep vision (character and token)", -"SW5E.PolymorphMergeSaves": "Merge saving throw proficiencies (take the highest)", -"SW5E.PolymorphMergeSkills": "Merge skill proficiencies (take the highest)", -"SW5E.PolymorphPromptTitle": "Transforming Actor", -"SW5E.PolymorphRestoreTransformation": "Restore Transformation", -"SW5E.PolymorphTmpClass": "Temporary Class", -"SW5E.PolymorphTokens": "Transform all linked tokens?", -"SW5E.PolymorphWildShape": "Wild Shape", - "SW5E.Concentrated": "Concentrate", -"SW5E.Price": "Price", -"SW5E.Proficiency": "Proficiency", -"SW5E.Proficient": "Proficient", -"SW5E.Quantity": "Quantity", -"SW5E.Species": "Species", -"SW5E.Range": "Range", -"SW5E.Rarity": "Rarity", -"SW5E.Reaction": "Reaction", -"SW5E.RequiredMaterials": "Required Materials", -"SW5E.Requirements": "Requirements", -"SW5E.ResourcePrimary": "Resource 1", -"SW5E.ResourceSecondary": "Resource 2", -"SW5E.ResourceTertiary": "Resource 3", -"SW5E.RestL": "L. Rest", -"SW5E.RestS": "S. Rest", -"SW5E.Ritual": "Ritual", -"SW5E.Roll": "Roll", -"SW5E.RollExample": "e.g. +1d4", -"SW5E.RollMode": "Roll Mode", -"SW5E.RollSituationalBonus": "Situational Bonus?", -"SW5E.Save": "Save", -"SW5E.ScalingFormula": "Scaling Formula", -"SW5E.SchoolLgt": "Light", -"SW5E.SchoolUni": "Universal", -"SW5E.SchoolDrk": "Dark", -"SW5E.SchoolTec": "Tech", -"SW5E.SchoolEnh": "Enhancement", -"SW5E.SenseBS": "Blindsight", -"SW5E.SenseDV": "Darkvision", -"SW5E.SenseTR": "Truesight", -"SW5E.SenseTS": "Tremorsense", -"SW5E.Senses": "Senses", -"SW5E.ShortRest": "Short Rest", -"SW5E.ShortRestHint": "Take a short rest? On a short rest you may spend remaining Hit Dice and recover primary or secondary resources.", -"SW5E.ShortRestNoHD": "No Hit Dice remaining", -"SW5E.ShortRestSelect": "Select Dice to Roll", -"SW5E.Size": "Size", -"SW5E.SizeGargantuan": "Gargantuan", -"SW5E.SizeHuge": "Huge", -"SW5E.SizeLarge": "Large", -"SW5E.SizeMedium": "Medium", -"SW5E.SizeSmall": "Small", -"SW5E.SizeTiny": "Tiny", -"SW5E.SkillAcr": "Acrobatics", -"SW5E.SkillAni": "Animal Handling", -"SW5E.SkillAth": "Athletics", -"SW5E.SkillDec": "Deception", -"SW5E.SkillIns": "Insight", -"SW5E.SkillInv": "Investigation", -"SW5E.SkillItm": "Intimidation", -"SW5E.SkillLor": "Lore", -"SW5E.SkillMed": "Medicine", -"SW5E.SkillNat": "Nature", -"SW5E.SkillPer": "Persuasion", -"SW5E.SkillPrc": "Perception", -"SW5E.SkillPrf": "Performance", -"SW5E.SkillPil": "Piloting", -"SW5E.SkillSlt": "Sleight of Hand", -"SW5E.SkillSte": "Stealth", -"SW5E.SkillSur": "Survival", -"SW5E.SkillTec": "Technology", -"SW5E.Slots": "Slots", -"SW5E.Source": "Source", -"SW5E.Special": "Special", -"SW5E.SpecialTraits": "Special Traits", -"SW5E.Speed": "Speed", -"SW5E.SpeedSpecial": "Special Movement", -"SW5E.PowerAbility": "Powercasting Ability", -"SW5E.PowerAdd": "Add Power", -"SW5E.PowerAtWill": "At-Will", -"SW5E.PowerCastConsume": "Consume Power Slot?", -"SW5E.PowerCastHint": "Configure how you would like to cast the", -"SW5E.PowerCastNoSlots": "You have no available power slots to cast this power", -"SW5E.PowerCastUpcast": "Cast at Level", -"SW5E.PowercasterLevel": "Powercaster Level", -"SW5E.PowerCastingHeader": "Power Casting", -"SW5E.Powercasting": "Powercasting", -"SW5E.PowerComponents": "Power Components", -"SW5E.PowerCreate": "Create Power", -"SW5E.PowerDC": "Power DC", -"SW5E.PowerDetails": "Power Details", -"SW5E.PowerEffects": "Power Effects", -"SW5E.PowerLevel": "Power Level", -"SW5E.PowerLevel0": "At-Will", -"SW5E.PowerLevel1": "1st Level", -"SW5E.PowerLevel2": "2nd Level", -"SW5E.PowerLevel3": "3rd Level", -"SW5E.PowerLevel4": "4th Level", -"SW5E.PowerLevel5": "5th Level", -"SW5E.PowerLevel6": "6th Level", -"SW5E.PowerLevel7": "7th Level", -"SW5E.PowerLevel8": "8th Level", -"SW5E.PowerLevel9": "9th Level", -"SW5E.PowerLevelPact": "Pact Slot", -"SW5E.PowerMaterials": "Powercasting Materials", -"SW5E.PowerName": "Power Name", -"SW5E.PowerNone": "None", -"SW5E.PowerPrepAtWill": "At-Will", -"SW5E.PowerPrepInnate": "Innate Powercasting", -"SW5E.PowerPrepPrepared": "Prepared", -"SW5E.PowerPrepAlways": "Always Prepared", -"SW5E.PowerConcentrationMode": "Power Concentration Mode", -"SW5E.PowerConcentrating": "Concentrating", -"SW5E.PowerProgArt": "Artificer", -"SW5E.PowerProgFull": "Full Caster", -"SW5E.PowerProgOverride": "Override slots", -"SW5E.PowerProgression": "Power Progression", -"SW5E.PowerSchool": "Power School", -"SW5E.PowerTarget": "Power Target", -"SW5E.PowerUnprepared": "Unprepared", -"SW5E.PowerUsage": "Power Usage", -"SW5E.Powerbook": "Powerbook", -"SW5E.SpeciesTraits": "Species Traits", -"SW5E.SubclassName": "Subclass Name", -"SW5E.Supply": "Supply", -"SW5E.Target": "Target", -"SW5E.TargetAlly": "Ally", -"SW5E.TargetCone": "Cone", -"SW5E.TargetCreature": "Creature", -"SW5E.TargetCube": "Cube", -"SW5E.TargetCylinder": "Cylinder", -"SW5E.TargetEnemy": "Enemy", -"SW5E.TargetLine": "Line", -"SW5E.TargetObject": "Object", -"SW5E.TargetRadius": "Radius", -"SW5E.TargetSelf": "Self", -"SW5E.TargetSpace": "Space", -"SW5E.TargetSphere": "Sphere", -"SW5E.TargetSquare": "Square", -"SW5E.TargetWall": "Wall", - "SW5E.TargetDroid": "Droid", -"SW5E.Temp": "Temp", -"SW5E.TimeDay": "Days", -"SW5E.TimeHour": "Hours", -"SW5E.TimeInst": "Instantaneous", -"SW5E.TimeMinute": "Minutes", -"SW5E.TimeMonth": "Months", -"SW5E.TimePerm": "Permanent", -"SW5E.TimeRound": "Rounds", -"SW5E.TimeTurn": "Turns", -"SW5E.TimeYear": "Years", - "SW5E.ToolArmormech": "Armormech's Tools", - "SW5E.ToolArmstech": "Armstech's Tools", - "SW5E.ToolArtificer": "Artificer's Tools", - "SW5E.ToolArtist": "Artist's Tools", - "SW5E.ToolAstrotech": "Astrotech's Tools", - "SW5E.ToolBiotech": "Biotech's Tools", - "SW5E.ToolConstructor": "Constructor's Tools", - "SW5E.ToolCybertech": "Cybertech's Tools", - "SW5E.ToolJeweler": "Jeweler's Tools", - "SW5E.ToolSurveyor": "Surveyor's Tools", - "SW5E.ToolSynthweaver": "Synthweavers's Tools", - "SW5E.ToolTinker": "Tinker's Tools", - "SW5E.ToolAntitoxkit": "Antitoxkit", - "SW5E.ToolArchaeologistKit": "Archaeologist Kit", - "SW5E.ToolAudiotechKit": "Audiotech's Kit", - "SW5E.ToolBioanalysisKit": "Bioanalysis Kit", - "SW5E.ToolBrewerKit": "Brewer's Kit", - "SW5E.ToolChefKit": "Chef's Kit", - "SW5E.ToolDemolitionKit": "Demolition Kit", - "SW5E.ToolDisguiseKit": "Disguise Kit", - "SW5E.ToolForgeryKit": "Forgery Kit", - "SW5E.ToolMechanicKit": "Mechanic's Kit", - "SW5E.ToolMunitionsKit": "Munitions Kit", - "SW5E.ToolPoisonKit": "Poisoner's Kit", - "SW5E.ToolScavengingKit": "Scavenging Kit", - "SW5E.ToolSecurityKit": "Security Kit", - "SW5E.ToolSlicerKit": "Slicer's Kit", - "SW5E.ToolSpiceKit": "Spicer's Kit", -"SW5E.ToolGamingSet": "Gaming Set", -"SW5E.ToolMusicalInstrument": "Musical Instrument", -"SW5E.ToolVehicle": "Vehicle (Land or Water)", -"SW5E.TraitArmorProf": "Armor Proficiencies", -"SW5E.TraitSelectorSpecial": "Special (Split with Semi-Colon)", -"SW5E.TraitToolProf": "Tool Proficiencies", -"SW5E.TraitWeaponProf": "Weapon Proficiencies", -"SW5E.Type": "Type", -"SW5E.Unequipped": "Not Equipped", -"SW5E.Unlimited": "Unlimited", -"SW5E.Usage": "Usage", -"SW5E.Use": "Use", -"SW5E.Uses": "Uses", -"SW5E.Versatile": "Versatile", -"SW5E.VersatileDamage": "Versatile Damage", -"SW5E.VsDC": "vs DC.", -"SW5E.WeaponAmmo": "Ammunition", -"SW5E.WeaponImprov": "Improvised", -"SW5E.WeaponMartialVW": "Martial Vibroweapon", -"SW5E.WeaponMartialProficiency": "Martial Weapons", -"SW5E.WeaponMartialB": "Martial Blaster", -"SW5E.WeaponMartialLW": "Martial Lightweapon", -"SW5E.WeaponNatural": "Natural", - "SW5E.WeaponPropertiesAmm": "Ammunition", - "SW5E.WeaponPropertiesBur": "Burst", - "SW5E.WeaponPropertiesDef": "Defensive", - "SW5E.WeaponPropertiesDex": "Dexterity Rqmt.", - "SW5E.WeaponPropertiesDrm": "Disarming", - "SW5E.WeaponPropertiesDgd": "Disguised", - "SW5E.WeaponPropertiesDis": "Disintegrate", - "SW5E.WeaponPropertiesDpt": "Disruptive", - "SW5E.WeaponPropertiesDou": "Double", - "SW5E.WeaponPropertiesFin": "Finesse", - "SW5E.WeaponPropertiesFix": "Fixed", - "SW5E.WeaponPropertiesFoc": "Focus", - "SW5E.WeaponPropertiesHvy": "Heavy", - "SW5E.WeaponPropertiesHid": "Hidden", - "SW5E.WeaponPropertiesKen": "Keen", - "SW5E.WeaponPropertiesLgt": "Light", - "SW5E.WeaponPropertiesLum": "Luminous", - "SW5E.WeaponPropertiesPic": "Piercing", - "SW5E.WeaponPropertiesRan": "Range", - "SW5E.WeaponPropertiesRap": "Rapid", - "SW5E.WeaponPropertiesRch": "Reach", - "SW5E.WeaponPropertiesRel": "Reload", - "SW5E.WeaponPropertiesRet": "Returning", - "SW5E.WeaponPropertiesShk": "Shocking", - "SW5E.WeaponPropertiesSpc": "Special", - "SW5E.WeaponPropertiesStr": "Strength Rqmt.", - "SW5E.WeaponPropertiesThr": "Thrown", - "SW5E.WeaponPropertiesTwo": "Two-Handed", - "SW5E.WeaponPropertiesVer": "Versatile", - "SW5E.WeaponPropertiesVic": "Vicious", -"SW5E.WeaponSimpleVW": "Simple Vibroweapon", -"SW5E.WeaponSimpleProficiency": "Simple Weapons", -"SW5E.WeaponSimpleB": "Simple Blaster", -"SW5E.WeaponSimpleLW": "Simple Lightweapon", -"SW5E.Weight": "Weight", -"SW5E.available": "available", -"SW5E.description": "A comprehensive game system for running games of Dungeons & Dragons 5th Edition in the Foundry VTT environment.", -"SW5E.of": "of", -"SW5E.power": "power", -"SETTINGS.5eAllowPolymorphingL": "Allow players to polymorph their own actors.", -"SETTINGS.5eAllowPolymorphingN": "Allow Polymorphing", -"SETTINGS.5eAutoCollapseCardL": "Automatically collapse Item Card descriptions in the Chat Log", -"SETTINGS.5eAutoCollapseCardN": "Collapse Item Cards in Chat", -"SETTINGS.5eAutoPowerTemplateL": "When a power is cast, defaults to begin the process to create the corresponding Measured Template if any (requires TRUSTED or higher player role)", -"SETTINGS.5eAutoPowerTemplateN": "Always place Power Template", -"SETTINGS.5eCurWtL": "Carried currency affects character encumbrance following the rules on PHB pg. 143.", -"SETTINGS.5eCurWtN": "Apply Currency Weight", -"SETTINGS.5eDiagDMG": "Dungeon Master's Guide (5/10/5)", -"SETTINGS.5eDiagL": "Configure which diagonal movement rule should be used for games within this system.", -"SETTINGS.5eDiagN": "Diagonal Movement Rule", -"SETTINGS.5eDiagPHB": "Player's Handbook (5/5/5)", -"SETTINGS.5eInitTBL": "Append the raw Dexterity ability score to break ties in Initiative.", -"SETTINGS.5eInitTBN": "Initiative Dexterity Tiebreaker", -"SETTINGS.5eNoExpL": "Remove experience bars from character sheets.", -"SETTINGS.5eNoExpN": "Disable Experience Tracking" -} diff --git a/less/apps.less b/less/apps.less index 31c3a70c..ef575d1e 100644 --- a/less/apps.less +++ b/less/apps.less @@ -5,7 +5,7 @@ @detailsHeight: 40px; /* ----------------------------------------- */ -/* All D&D5e Apps */ +/* All SW5e Apps */ /* ----------------------------------------- */ .sw5e { diff --git a/module/actor/entity.js b/module/actor/entity.js index 7778b824..732cbde1 100644 --- a/module/actor/entity.js +++ b/module/actor/entity.js @@ -6,7 +6,7 @@ import {SW5E} from '../config.js'; /** - * Extend the base Actor class to implement additional logic specialized for D&D5e. + * Extend the base Actor class to implement additional logic specialized for SW5e. */ export class Actor5e extends Actor { @@ -1042,7 +1042,7 @@ export class Actor5e extends Actor { /* -------------------------------------------- */ /** - * Add additional system-specific sidebar directory context menu options for D&D5e Actor entities + * Add additional system-specific sidebar directory context menu options for SW5e Actor entities * @param {jQuery} html The sidebar HTML * @param {Array} entryOptions The default array of context menu options */ diff --git a/module/actor/sheets/base.js b/module/actor/sheets/base.js index f89aecea..ce4f9471 100644 --- a/module/actor/sheets/base.js +++ b/module/actor/sheets/base.js @@ -3,7 +3,7 @@ import {ActorSheetFlags} from "../../apps/actor-flags.js"; import {SW5E} from '../../config.js'; /** - * Extend the basic ActorSheet class to do all the D&D5e things! + * Extend the basic ActorSheet class to do all the SW5e things! * This sheet is an Abstract layer which is not used. * * @type {ActorSheet} diff --git a/module/actor/sheets/character.js b/module/actor/sheets/character.js index 121cbd85..404d31ca 100644 --- a/module/actor/sheets/character.js +++ b/module/actor/sheets/character.js @@ -1,7 +1,7 @@ import { ActorSheet5e } from "./base.js"; /** - * An Actor sheet for player character type actors in the D&D5E system. + * An Actor sheet for player character type actors in the SW5E system. * Extends the base ActorSheet5e class. * @type {ActorSheet5e} */ diff --git a/module/actor/sheets/npc.js b/module/actor/sheets/npc.js index 9046bccb..45edc74d 100644 --- a/module/actor/sheets/npc.js +++ b/module/actor/sheets/npc.js @@ -1,7 +1,7 @@ import { ActorSheet5e } from "../sheets/base.js"; /** - * An Actor sheet for NPC type characters in the D&D5E system. + * An Actor sheet for NPC type characters in the SW5E system. * Extends the base ActorSheet5e class. * @type {ActorSheet5e} */ diff --git a/module/apps/actor-flags.js b/module/apps/actor-flags.js index 1e35d0e7..1fa35486 100644 --- a/module/apps/actor-flags.js +++ b/module/apps/actor-flags.js @@ -68,10 +68,10 @@ export class ActorSheetFlags extends BaseEntitySheet { {name: "data.bonuses.mwak.damage", label: "SW5E.BonusMWDamage"}, {name: "data.bonuses.rwak.attack", label: "SW5E.BonusRWAttack"}, {name: "data.bonuses.rwak.damage", label: "SW5E.BonusRWDamage"}, - {name: "data.bonuses.msak.attack", label: "SW5E.BonusMSAttack"}, - {name: "data.bonuses.msak.damage", label: "SW5E.BonusMSDamage"}, - {name: "data.bonuses.rsak.attack", label: "SW5E.BonusRSAttack"}, - {name: "data.bonuses.rsak.damage", label: "SW5E.BonusRSDamage"}, + {name: "data.bonuses.mpak.attack", label: "SW5E.BonusMSAttack"}, + {name: "data.bonuses.mpak.damage", label: "SW5E.BonusMSDamage"}, + {name: "data.bonuses.rpak.attack", label: "SW5E.BonusRSAttack"}, + {name: "data.bonuses.rpak.damage", label: "SW5E.BonusRSDamage"}, {name: "data.bonuses.abilities.check", label: "SW5E.BonusAbilityCheck"}, {name: "data.bonuses.abilities.save", label: "SW5E.BonusAbilitySave"}, {name: "data.bonuses.abilities.skill", label: "SW5E.BonusAbilitySkill"}, diff --git a/module/combat.js b/module/combat.js index 06b2ae0b..55d863db 100644 --- a/module/combat.js +++ b/module/combat.js @@ -1,6 +1,6 @@ /** - * Override the default Initiative formula to customize special behaviors of the D&D5e system. + * Override the default Initiative formula to customize special behaviors of the SW5e system. * Apply advantage, proficiency, or bonuses where appropriate * Apply the dexterity score as a decimal tiebreaker if requested * See Combat._getInitiativeFormula for more detail. diff --git a/module/config.js b/module/config.js index 8d34a027..303bec37 100644 --- a/module/config.js +++ b/module/config.js @@ -1,4 +1,4 @@ -// Namespace D&D5e Configuration Values +// Namespace SW5e Configuration Values export const SW5E = {}; // ASCII Artwork @@ -86,7 +86,7 @@ SW5E.toolProficiencies = { /* -------------------------------------------- */ /** - * This Object defines the various lengths of time which can occur in D&D5e + * This Object defines the various lengths of time which can occur in SW5e * @type {Object} */ SW5E.timePeriods = { @@ -258,7 +258,7 @@ SW5E.damageTypes = { "necrotic": "SW5E.DamageNecrotic", "poison": "SW5E.DamagePoison", "psychic": "SW5E.DamagePsychic", - "Sonic": "SW5E.DamageSonic" + "sonic": "SW5E.DamageSonic" }; /* -------------------------------------------- */ @@ -321,7 +321,7 @@ SW5E.encumbrance = { /* -------------------------------------------- */ /** - * This Object defines the types of single or area targets which can be applied in D&D5e + * This Object defines the types of single or area targets which can be applied in SW5e * @type {Object} */ SW5E.targetTypes = { @@ -378,7 +378,7 @@ SW5E.healingTypes = { /** - * Enumerate the denominations of hit dice which can apply to classes in the D&D5E system + * Enumerate the denominations of hit dice which can apply to classes in the SW5E system * @type {Array.} */ SW5E.hitDieTypes = ["d6", "d8", "d10", "d12"]; @@ -401,7 +401,7 @@ SW5E.senses = { /* -------------------------------------------- */ /** - * The set of skill which can be trained in D&D5e + * The set of skill which can be trained in SW5e * @type {Object} */ SW5E.skills = { @@ -422,7 +422,7 @@ SW5E.skills = { "slt": "SW5E.SkillSlt", "ste": "SW5E.SkillSte", "sur": "SW5E.SkillSur", - "tec": "SW5E.SkillTec", + "tec": "SW5E.SkillTec" }; diff --git a/module/config.js.bak b/module/config.js.bak deleted file mode 100644 index 11d50a1a..00000000 --- a/module/config.js.bak +++ /dev/null @@ -1,839 +0,0 @@ -// Namespace D&D5e Configuration Values -export const SW5E = {}; - -// ASCII Artwork -SW5E.ASCII = `_______________________________ - _ - | | - ___| |_ __ _ _ ____ ____ _ _ __ ___ -/ __| __/ _\ | |__\ \ /\ / / _\ | |__/ __| -\__ \ || (_) | | \ V V / (_) | | \__ \ -|___/\__\__/_|_| \_/\_/ \__/_|_| |___/ -_______________________________`; - - -/** - * The set of Ability Scores used within the system - * @type {Object} - */ -SW5E.abilities = { - "str": "SW5E.AbilityStr", - "dex": "SW5E.AbilityDex", - "con": "SW5E.AbilityCon", - "int": "SW5E.AbilityInt", - "wis": "SW5E.AbilityWis", - "cha": "SW5E.AbilityCha" -}; - -/* -------------------------------------------- */ - -/** - * Character alignment options - * @type {Object} - */ -SW5E.alignments = { - 'll': "SW5E.AlignmentLL", - 'nl': "SW5E.AlignmentNL", - 'cl': "SW5E.AlignmentCL", - 'lb': "SW5E.AlignmentLB", - 'bn': "SW5E.AlignmentBN", - 'cb': "SW5E.AlignmentCB", - 'ld': "SW5E.AlignmentLD", - 'nd': "SW5E.AlignmentND", - 'cd': "SW5E.AlignmentCD" -}; - - -SW5E.weaponProficiencies = { - "sim": "SW5E.WeaponSimpleProficiency", - "bla": "SW5E.WeaponBlasterProficiency" -}; - -SW5E.toolProficiencies = { - "armor": "SW5E.ToolArmormech", - "arms": "SW5E.ToolArmstech", - "arti": "SW5E.ToolArtificer", - "art": "SW5E.ToolArtist", - "astro": "SW5E.ToolAstrotech", - "bio": "SW5E.ToolBiotech", - "con": "SW5E.ToolConstructor", - "cyb": "SW5E.ToolCybertech", - "jew": "SW5E.ToolJeweler", - "sur": "SW5E.ToolSurveyor", - "syn": "SW5E.ToolSynthweaver", - "tin": "SW5E.ToolTinker", - "ant": "SW5E.ToolAntitoxkit", - "arc": "SW5E.ToolArchaeologistKit", - "aud": "SW5E.ToolAudiotechKit", - "bioa": "SW5E.ToolBioanalysisKit", - "brew": "SW5E.ToolBrewerKit", - "chef": "SW5E.ToolChefKit", - "demo": "SW5E.ToolDemolitionKit", - "disg": "SW5E.ToolDisguiseKit", - "forg": "SW5E.ToolForgeryKit", - "mech": "SW5E.ToolMechanicKit", - "game": "SW5E.ToolGamingSet", - "poi": "SW5E.ToolPoisonKit", - "scav": "SW5E.ToolScavengingKit", - "secur": "SW5E.ToolSecurityKit", - "slic": "SW5E.ToolSlicerKit", - "spice": "SW5E.ToolSpiceKit", - "music": "SW5E.ToolMusicalInstrument", - "vehicle": "SW5E.ToolVehicle" -}; - - -/* -------------------------------------------- */ - -/** - * This Object defines the various lengths of time which can occur in D&D5e - * @type {Object} - */ -SW5E.timePeriods = { - "inst": "SW5E.TimeInst", - "turn": "SW5E.TimeTurn", - "round": "SW5E.TimeRound", - "minute": "SW5E.TimeMinute", - "hour": "SW5E.TimeHour", - "day": "SW5E.TimeDay", - "month": "SW5E.TimeMonth", - "year": "SW5E.TimeYear", - "perm": "SW5E.TimePerm", - "spec": "SW5E.Special" -}; - - -/* -------------------------------------------- */ - -/** - * This describes the ways that an ability can be activated - * @type {Object} - */ -SW5E.abilityActivationTypes = { - "none": "SW5E.None", - "action": "SW5E.Action", - "bonus": "SW5E.BonusAction", - "reaction": "SW5E.Reaction", - "minute": SW5E.timePeriods.minute, - "hour": SW5E.timePeriods.hour, - "day": SW5E.timePeriods.day, - "special": SW5E.timePeriods.spec, - "legendary": "SW5E.LegAct", - "lair": "SW5E.LairAct" -}; - -/* -------------------------------------------- */ - -// Creature Sizes -SW5E.actorSizes = { - "tiny": "SW5E.SizeTiny", - "sm": "SW5E.SizeSmall", - "med": "SW5E.SizeMedium", - "lg": "SW5E.SizeLarge", - "huge": "SW5E.SizeHuge", - "grg": "SW5E.SizeGargantuan" -}; - -SW5E.tokenSizes = { - "tiny": 1, - "sm": 1, - "med": 1, - "lg": 2, - "huge": 3, - "grg": 4 -}; - -/* -------------------------------------------- */ - -/** - * Classification types for item action types - * @type {Object} - */ -SW5E.itemActionTypes = { - "mwak": "SW5E.ActionMWAK", - "rwak": "SW5E.ActionRWAK", - "mpak": "SW5E.ActionMPAK", - "rpak": "SW5E.ActionRPAK", - "save": "SW5E.ActionSave", - "heal": "SW5E.ActionHeal", - "abil": "SW5E.ActionAbil", - "util": "SW5E.ActionUtil", - "other": "SW5E.ActionOther" -}; - -/* -------------------------------------------- */ - -SW5E.itemCapacityTypes = { - "items": "SW5E.ItemContainerCapacityItems", - "weight": "SW5E.ItemContainerCapacityWeight" -}; - -/* -------------------------------------------- */ - -/** - * Enumerate the lengths of time over which an item can have limited use ability - * @type {Object} - */ -SW5E.limitedUsePeriods = { - "sr": "SW5E.ShortRest", - "lr": "SW5E.LongRest", - "day": "SW5E.Day", - "charges": "SW5E.Charges" -}; - - -/* -------------------------------------------- */ - -/** - * The set of equipment types for armor, clothing, and other objects which can ber worn by the character - * @type {Object} - */ -SW5E.equipmentTypes = { - "light": "SW5E.EquipmentLight", - "medium": "SW5E.EquipmentMedium", - "heavy": "SW5E.EquipmentHeavy", - "bonus": "SW5E.EquipmentBonus", - "natural": "SW5E.EquipmentNatural", - "shield": "SW5E.EquipmentShield", - "clothing": "SW5E.EquipmentClothing", - "trinket": "SW5E.EquipmentTrinket" -}; - - -/* -------------------------------------------- */ - -/** - * The set of Armor Proficiencies which a character may have - * @type {Object} - */ -SW5E.armorProficiencies = { - "lgt": SW5E.equipmentTypes.light, - "med": SW5E.equipmentTypes.medium, - "hvy": SW5E.equipmentTypes.heavy, - "shl": "SW5E.EquipmentShieldProficiency" -}; - - -/* -------------------------------------------- */ - -/** - * Enumerate the valid consumable types which are recognized by the system - * @type {Object} - */ -SW5E.consumableTypes = { - "adrenal": "SW5E.ConsumableAdrenal", - "poison": "SW5E.ConsumablePoison", - "explosive": "SW5E.ConsumableExplosive", - "food": "SW5E.ConsumableFood", - "medpac": "SW5E.ConsumableMedpac", - "technology": "SW5E.ConsumableTechnology", - "ammunition": "SW5E.ConsumableAmmunition", - "trinket": "SW5E.ConsumableTrinket" -}; - - -/* -------------------------------------------- */ - -/** - * The valid currency denominations supported by the 5e system - * @type {Object} - */ -SW5E.currencies = { - "CR": "SW5E.CurrencyCR", - }; - -/* -------------------------------------------- */ - - -// Damage Types -SW5E.damageTypes = { - "acid": "SW5E.DamageAcid", - "cold": "SW5E.DamageCold", - "energy": "SW5E.DamageEnergy", - "fire": "SW5E.DamageFire", - "force": "SW5E.DamageForce", - "ion": "SW5E.DamageIon", - "kinetic": "SW5E.DamageKinetic", - "lightning": "SW5E.DamageLightning", - "necrotic": "SW5E.DamageNecrotic", - "poison": "SW5E.DamagePoison", - "psychic": "SW5E.DamagePsychic", - "Sonic": "SW5E.DamageSonic" -}; - -/* -------------------------------------------- */ - -// armor Types -SW5E.armorpropertiesTypes = { -"Absorptive": "SW5E.ArmorProperAbsorptive", -"Agile": "SW5E.ArmorProperAgile", -"Anchor": "SW5E.ArmorProperAnchor", -"Avoidant": "SW5E.ArmorProperAvoidant", -"Barbed": "SW5E.ArmorProperBarbed", -"Charging": "SW5E.ArmorProperCharging", -"Concealing": "SW5E.ArmorProperConcealing", -"Cumbersome": "SW5E.ArmorProperCumbersome", -"Gauntleted": "SW5E.ArmorProperGauntleted", -"Imbalanced": "SW5E.ArmorProperImbalanced", -"Impermeable": "SW5E.ArmorProperImpermeable", -"Insulated": "SW5E.ArmorProperInsulated", -"Interlocking": "SW5E.ArmorProperInterlocking", -"Lambent": "SW5E.ArmorProperLambent", -"Lightweight": "SW5E.ArmorProperLightweight", -"Magnetic": "SW5E.ArmorProperMagnetic", -"Obscured": "SW5E.ArmorProperObscured", -"Powered": "SW5E.ArmorProperPowered", -"Reactive": "SW5E.ArmorProperReactive", -"Regulated": "SW5E.ArmorProperRegulated", -"Reinforced": "SW5E.ArmorProperReinforced", -"Responsive": "SW5E.ArmorProperResponsive", -"Rigid": "SW5E.ArmorProperRigid", -"Silent": "SW5E.ArmorProperSilent", -"Spiked": "SW5E.ArmorProperSpiked", -"Steadfast": "SW5E.ArmorProperSteadfast", -"Versatile": "SW5E.ArmorProperVersatile" -}; - -/* -------------------------------------------- */ - -SW5E.distanceUnits = { - "none": "SW5E.None", - "self": "SW5E.DistSelf", - "touch": "SW5E.DistTouch", - "ft": "SW5E.DistFt", - "mi": "SW5E.DistMi", - "spec": "SW5E.Special", - "any": "SW5E.DistAny" -}; - -/* -------------------------------------------- */ - - -/** - * Configure aspects of encumbrance calculation so that it could be configured by modules - * @type {Object} - */ -SW5E.encumbrance = { - currencyPerWeight: 50, - strMultiplier: 15 -}; - -/* -------------------------------------------- */ - -/** - * This Object defines the types of single or area targets which can be applied in D&D5e - * @type {Object} - */ -SW5E.targetTypes = { - "none": "SW5E.None", - "self": "SW5E.TargetSelf", - "creature": "SW5E.TargetCreature", - "droid": "SW5E.TargetDroid", - "ally": "SW5E.TargetAlly", - "enemy": "SW5E.TargetEnemy", - "object": "SW5E.TargetObject", - "space": "SW5E.TargetSpace", - "radius": "SW5E.TargetRadius", - "sphere": "SW5E.TargetSphere", - "cylinder": "SW5E.TargetCylinder", - "cone": "SW5E.TargetCone", - "square": "SW5E.TargetSquare", - "cube": "SW5E.TargetCube", - "line": "SW5E.TargetLine", - "wall": "SW5E.TargetWall", -}; - - -/* -------------------------------------------- */ - - -/** - * Map the subset of target types which produce a template area of effect - * The keys are SW5E target types and the values are MeasuredTemplate shape types - * @type {Object} - */ -SW5E.areaTargetTypes = { - cone: "cone", - cube: "rect", - cylinder: "circle", - line: "ray", - radius: "circle", - sphere: "circle", - square: "rect", - wall: "ray" -}; - - -/* -------------------------------------------- */ - -// Healing Types -SW5E.healingTypes = { - "healing": "SW5E.Healing", - "temphp": "SW5E.HealingTemp" -}; - - -/* -------------------------------------------- */ - - -/** - * Enumerate the denominations of hit dice which can apply to classes in the D&D5E system - * @type {Array.} - */ -SW5E.hitDieTypes = ["d6", "d8", "d10", "d12"]; - - -/* -------------------------------------------- */ - -/** - * Character senses options - * @type {Object} - */ -SW5E.senses = { - "bs": "SW5E.SenseBS", - "dv": "SW5E.SenseDV", - "ts": "SW5E.SenseTS", - "tr": "SW5E.SenseTR" -}; - - -/* -------------------------------------------- */ - -/** - * The set of skill which can be trained in D&D5e - * @type {Object} - */ -SW5E.skills = { - "acr": "SW5E.SkillAcr", - "ani": "SW5E.SkillAni", - "ath": "SW5E.SkillAth", - "dec": "SW5E.SkillDec", - "ins": "SW5E.SkillIns", - "itm": "SW5E.SkillItm", - "inv": "SW5E.SkillInv", - "lor": "SW5E.SkillLor", - "med": "SW5E.SkillMed", - "nat": "SW5E.SkillNat", - "prc": "SW5E.SkillPrc", - "prf": "SW5E.SkillPrf", - "per": "SW5E.SkillPer", - "pil": "SW5E.SkillPil", - "slt": "SW5E.SkillSlt", - "ste": "SW5E.SkillSte", - "sur": "SW5E.SkillSur", - "tec": "SW5E.SkillTec", -}; - - -/* -------------------------------------------- */ - -SW5E.powerPreparationModes = { - "always": "SW5E.PowerPrepAlways", - "atwill": "SW5E.PowerPrepAtWill", - "innate": "SW5E.PowerPrepInnate", - "prepared": "SW5E.PowerPrepPrepared" -}; - -SW5E.powerUpcastModes = ["always"]; - - -SW5E.powerProgression = { - "none": "SW5E.PowerNone", - "full": "SW5E.PowerProgFull", - "artificer": "SW5E.PowerProgArt" -}; - -/* -------------------------------------------- */ - -/** - * The available choices for how power damage scaling may be computed - * @type {Object} - */ -SW5E.powerScalingModes = { - "none": "SW5E.PowerNone", - "atwill": "SW5E.PowerAtWill", - "level": "SW5E.PowerLevel" -}; - -/* -------------------------------------------- */ - -// Weapon Types -SW5E.weaponTypes = { - "simpleVW": "SW5E.WeaponSimpleVW", - "simpleB": "SW5E.WeaponSimpleB", - "simpleLW": "SW5E.WeaponSimpleLW", - "martialVW": "SW5E.WeaponMartialVW", - "martialB": "SW5E.WeaponMartialB", - "martialLW": "SW5E.WeaponMartialLW", - "natural": "SW5E.WeaponNatural", - "improv": "SW5E.WeaponImprov", - "ammo": "SW5E.WeaponAmmo" -}; - - -/* -------------------------------------------- */ - -/** - * Define the set of weapon property flags which can exist on a weapon - * @type {Object} - */ -SW5E.weaponProperties = { - "amm": "SW5E.WeaponPropertiesAmm", - "bur": "SW5E.WeaponPropertiesBur", - "def": "SW5E.WeaponPropertiesDef", - "dex": "SW5E.WeaponPropertiesDex", - "drm": "SW5E.WeaponPropertiesDrm", - "dgd": "SW5E.WeaponPropertiesDgd", - "dis": "SW5E.WeaponPropertiesDis", - "dpt": "SW5E.WeaponPropertiesDpt", - "dou": "SW5E.WeaponPropertiesDou", - "hvy": "SW5E.WeaponPropertiesHvy", - "hid": "SW5E.WeaponPropertiesHid", - "fin": "SW5E.WeaponPropertiesFin", - "fix": "SW5E.WeaponPropertiesFix", - "foc": "SW5E.WeaponPropertiesFoc", - "ken": "SW5E.WeaponPropertiesKen", - "lgt": "SW5E.WeaponPropertiesLgt", - "lum": "SW5E.WeaponPropertiesLum", - "pic": "SW5E.WeaponPropertiesPic", - "rap": "SW5E.WeaponPropertiesRap", - "rch": "SW5E.WeaponPropertiesRch", - "rel": "SW5E.WeaponPropertiesRel", - "ret": "SW5E.WeaponPropertiesRet", - "shk": "SW5E.WeaponPropertiesShk", - "spc": "SW5E.WeaponPropertiesSpc", - "str": "SW5E.WeaponPropertiesStr", - "thr": "SW5E.WeaponPropertiesThr", - "two": "SW5E.WeaponPropertiesTwo", - "ver": "SW5E.WeaponPropertiesVer", - "vic": "SW5E.WeaponPropertiesVic" -}; - - -// Power Components -SW5E.powerComponents = { - "V": "SW5E.ComponentVerbal", - "S": "SW5E.ComponentSomatic", - "M": "SW5E.ComponentMaterial" -}; - -// Power Schools -SW5E.powerSchools = { - "lgt": "SW5E.SchoolLgt", - "uni": "SW5E.SchoolUni", - "drk": "SW5E.SchoolDrk", - "tec": "SW5E.SchoolTec", - "enh": "SW5E.SchoolEnh" -}; - - -// Power Levels -SW5E.powerLevels = { - 0: "SW5E.PowerLevel0", - 1: "SW5E.PowerLevel1", - 2: "SW5E.PowerLevel2", - 3: "SW5E.PowerLevel3", - 4: "SW5E.PowerLevel4", - 5: "SW5E.PowerLevel5", - 6: "SW5E.PowerLevel6", - 7: "SW5E.PowerLevel7", - 8: "SW5E.PowerLevel8", - 9: "SW5E.PowerLevel9" -}; - -/** - * Define the standard slot progression by character level. - * The entries of this array represent the power slot progression for a full power-caster. - * @type {Array[]} - */ -SW5E.SPELL_SLOT_TABLE = [ - [2], - [3], - [4, 2], - [4, 3], - [4, 3, 2], - [4, 3, 3], - [4, 3, 3, 1], - [4, 3, 3, 2], - [4, 3, 3, 3, 1], - [4, 3, 3, 3, 2], - [4, 3, 3, 3, 2, 1], - [4, 3, 3, 3, 2, 1], - [4, 3, 3, 3, 2, 1, 1], - [4, 3, 3, 3, 2, 1, 1], - [4, 3, 3, 3, 2, 1, 1, 1], - [4, 3, 3, 3, 2, 1, 1, 1], - [4, 3, 3, 3, 2, 1, 1, 1, 1], - [4, 3, 3, 3, 3, 1, 1, 1, 1], - [4, 3, 3, 3, 3, 2, 1, 1, 1], - [4, 3, 3, 3, 3, 2, 2, 1, 1] -]; - -/* -------------------------------------------- */ - -// Polymorph options. -SW5E.polymorphSettings = { - keepPhysical: 'SW5E.PolymorphKeepPhysical', - keepMental: 'SW5E.PolymorphKeepMental', - keepSaves: 'SW5E.PolymorphKeepSaves', - keepSkills: 'SW5E.PolymorphKeepSkills', - mergeSaves: 'SW5E.PolymorphMergeSaves', - mergeSkills: 'SW5E.PolymorphMergeSkills', - keepClass: 'SW5E.PolymorphKeepClass', - keepFeats: 'SW5E.PolymorphKeepFeats', - keepPowers: 'SW5E.PolymorphKeepPowers', - keepItems: 'SW5E.PolymorphKeepItems', - keepBio: 'SW5E.PolymorphKeepBio', - keepVision: 'SW5E.PolymorphKeepVision' -}; - -/* -------------------------------------------- */ - -/** - * Skill, ability, and tool proficiency levels - * Each level provides a proficiency multiplier - * @type {Object} - */ -SW5E.proficiencyLevels = { - 0: "SW5E.NotProficient", - 1: "SW5E.Proficient", - 0.5: "SW5E.HalfProficient", - 2: "SW5E.Expertise" -}; - -/* -------------------------------------------- */ - - -// Condition Types -SW5E.conditionTypes = { - "blinded": "SW5E.ConBlinded", - "charmed": "SW5E.ConCharmed", - "deafened": "SW5E.ConDeafened", - "exhaustion": "SW5E.ConExhaustion", - "frightened": "SW5E.ConFrightened", - "grappled": "SW5E.ConGrappled", - "incapacitated": "SW5E.ConIncapacitated", - "invisible": "SW5E.ConInvisible", - "paralyzed": "SW5E.ConParalyzed", - "petrified": "SW5E.ConPetrified", - "poisoned": "SW5E.ConPoisoned", - "prone": "SW5E.ConProne", - "restrained": "SW5E.ConRestrained", - "shocked": "SW5E.ConShocked", - "stunned": "SW5E.ConStunned", - "unconscious": "SW5E.ConUnconscious" -}; - -// Languages -SW5E.languages = { - "aleena": "SW5E.LanguagesAleena", - "antarian": "SW5E.LanguagesAntarian", - "anzellan": "SW5E.LanguagesAnzellan", - "aqualish": "SW5E.LanguagesAqualish", - "ardennian": "SW5E.LanguagesArdennian", - "balosur": "SW5E.LanguagesBalosur", - "barabel": "SW5E.LanguagesBarabel", - "basic": "SW5E.LanguagesBasic", -"besalisk": "SW5E.LanguagesBesalisk", - "binary": "SW5E.LanguagesBinary", - "bith": "SW5E.LanguagesBith", - "bocce": "SW5E.LanguagesBocce", - "bothese": "SW5E.LanguagesBothese", - "catharese": "SW5E.LanguagesCartharese", - "cerean": "SW5E.LanguagesCerean", - "chadra-fan": "SW5E.LanguagesChadra-Fan", - "chagri": "SW5E.LanguagesChagri", - "cheunh": "SW5E.LanguagesCheunh", - "chevin": "SW5E.LanguagesChevin", - "chironan": "SW5E.LanguagesChironan", - "clawdite": "SW5E.LanguagesClawdite", - "codruese": "SW5E.LanguagesCodruese", - "colicoid": "SW5E.LanguagesColicoid", - "dashadi": "SW5E.LanguagesDashadi", - "defel": "SW5E.LanguagesDefel", - "devaronese": "SW5E.LanguagesDevaronese", - "dosh": "SW5E.LanguagesDosh", - "draethos": "SW5E.LanguagesDraethos", - "durese": "SW5E.LanguagesDurese", - "dug": "SW5E.LanguagesDug", - "ewokese": "SW5E.LanguagesEwokese", - "falleen": "SW5E.LanguagesFalleen", - "felucianese": "SW5E.LanguagesFelucianese", - "gamorrese": "SW5E.LanguagesGamorrese", - "gand": "SW5E.LanguagesGand", - "geonosian": "SW5E.LanguagesGeonosian", - "givin": "SW5E.LanguagesGivin", - "gran": "SW5E.LanguagesGran", - "gungan": "SW5E.LanguagesGungan", - "hapan": "SW5E.LanguagesHapan", - "harchese": "SW5E.LanguagesHarchese", - "herglese": "SW5E.LanguagesHerglese", - "honoghran": "SW5E.LanguagesHonoghran", - "huttese": "SW5E.LanguagesHuttese", - "iktotchese": "SW5E.LanguagesIktotchese", - "ithorese": "SW5E.LanguagesIthorese", - "jawaese": "SW5E.LanguagesJawaese", - "kaleesh": "SW5E.LanguagesKaleesh", - "kaminoan": "SW5E.LanguagesKaminoan", - "karkaran": "SW5E.LanguagesKarkaran", - "keldor": "SW5E.LanguagesKelDor", - "kharan": "SW5E.LanguagesKharan", - "killik": "SW5E.LanguagesKillik", - "klatooinian": "SW5E.LanguagesKlatooinian", - "kubazian": "SW5E.LanguagesKubazian", - "kushiban": "SW5E.LanguagesKushiban", - "kyuzo": "SW5E.LanguagesKyuzo", - "lannik": "SW5E.LanguagesLannik", - "lasat": "SW5E.LanguagesLasat", - "lowickese": "SW5E.LanguagesLowickese", - "mandoa": "SW5E.LanguagesMandoa", - "miralukese": "SW5E.LanguagesMiralukese", - "mirialan": "SW5E.LanguagesMirialan", - "moncal": "SW5E.LanguagesMonCal", - "mustafarian": "SW5E.LanguagesMustafarian", - "muun": "SW5E.LanguagesMuun", - "nautila": "SW5E.LanguagesNautila", - "ortolan": "SW5E.LanguagesOrtolan", - "pakpak": "SW5E.LanguagesPakPak", - "pyke": "SW5E.LanguagesPyke", - "quarrenese": "SW5E.LanguagesQuarrenese", - "rakata": "SW5E.LanguagesRakata", - "rattataki": "SW5E.LanguagesRattataki", - "rishii": "SW5E.LanguagesRishii", - "rodese": "SW5E.LanguagesRodese", - "selkatha": "SW5E.LanguagesSelkatha", - "semblan": "SW5E.LanguagesSemblan", - "shistavanen": "SW5E.LanguagesShistavanen", - "shyriiwook": "SW5E.LanguagesShyriiwook", - "sith": "SW5E.LanguagesSith", - "squibbian": "SW5E.LanguagesSquibbian", - "sriluurian": "SW5E.LanguagesSriluurian", - "ssi-ruuvi": "SW5E.LanguagesSsi-ruuvi", - "sullustese": "SW5E.LanguagesSullustese", - "talzzi": "SW5E.LanguagesTalzzi", - "thisspiasian": "SW5E.LanguagesThisspiasian", - "togorese": "SW5E.LanguagesTogorese", - "togruti": "SW5E.LanguagesTogruti", - "toydarian": "SW5E.LanguagesToydarian", - - "tusken": "SW5E.LanguagesTusken", - "twi'leki": "SW5E.LanguagesTwileki", - "ugnaught": "SW5E.LanguagesUgnaught", - "umbaran": "SW5E.LanguagesUmbaran", - "utapese": "SW5E.LanguagesUtapese", - "verpine": "SW5E.LanguagesVerpine", - "vong": "SW5E.LanguagesVong", - "voss": "SW5E.LanguagesVoss", - "yevethan": "SW5E.LanguagesYevethan", - "zabraki": "SW5E.LanguagesZabraki", - "zygerrian": "SW5E.LanguagesZygerrian" -}; - -// Character Level XP Requirements -SW5E.CHARACTER_EXP_LEVELS = [ - 0, 300, 900, 2700, 6500, 14000, 23000, 34000, 48000, 64000, 85000, 100000, - 120000, 140000, 165000, 195000, 225000, 265000, 305000, 355000] -; - -// Challenge Rating XP Levels -SW5E.CR_EXP_LEVELS = [ - 10, 200, 450, 700, 1100, 1800, 2300, 2900, 3900, 5000, 5900, 7200, 8400, 10000, 11500, 13000, 15000, 18000, - 20000, 22000, 25000, 33000, 41000, 50000, 62000, 75000, 90000, 105000, 120000, 135000, 155000 -]; - -// Configure Optional Character Flags -SW5E.characterFlags = { - "detailOriented": { - name: "Detail Oriented", - hint: "You have advantage on Intelligence (Investigation) checks within 5 feet.", - section: "Racial Traits", - type: Boolean - }, - "keenSenses": { - name: "Keen Hearing and Smell", - hint: "You have advantage on Wisdom (Perception) checks that involve hearing or smell.", - section: "Racial Traits", - type: Boolean - }, - "naturallyStealthy": { - name: "Naturally Stealthy", - hint: "You can attempt to hide even when you are obscured only by a creature that is your size or larger than you.", - section: "Racial Traits", - type: Boolean - }, - "nimbleEscape": { - name: "Nimble Escape", - hint: "You can take the Disengage or Hide action as a bonus action.", - section: "Racial Traits", - type: Boolean - }, - "powerfulBuild": { - name: "Powerful Build", - hint: "You count as one size larger when determining your carrying capacity and the weight you can push, drag, or lift.", - section: "Racial Traits", - type: Boolean - }, - "programmer": { - name: "Programmer", - hint: "Whenever you make an Intelligence (Technology) check related to computers, you are considered to have expertise in the Technology skill.", - section: "Racial Traits", - type: Boolean - }, - "techResistance": { - name: "Tech Resistance", - hint: "You have advantage on Dexterity and Intelligence saving throws against tech powers.", - section: "Racial Traits", - type: Boolean - }, - "unarmedCombatant": { - name: "Unarmed Combatant", - hint: "Your unarmed strikes deal 1d4 kinetic damage. You can use your choice of your Strength or Dexterity modifier for the attack and damage rolls. You must use the same modifier for both rolls.", - section: "Racial Traits", - type: Boolean - }, - "undersized": { - name: "Undersized", - hint: "You can’t use heavy shields, martial weapons with the two-handed property unless it also has the light property, and if a martial weapon has the versatile property, you can only wield it in two hands.", - section: "Racial Traits", - type: Boolean - }, - "initiativeAdv": { - name: "Advantage on Initiative", - hint: "Provided by feats or magical items.", - section: "Feats", - type: Boolean - }, - "initiativeAlert": { - name: "Alert Feat", - hint: "Provides +5 to Initiative.", - section: "Feats", - type: Boolean - }, - "jackOfAllTrades": { - name: "Jack of All Trades", - hint: "Half-Proficiency to Ability Checks in which you are not already Proficient.", - section: "Feats", - type: Boolean - }, - "observantFeat": { - name: "Observant Feat", - hint: "Provides a +5 to passive Perception and Investigation.", - skills: ['prc','inv'], - section: "Feats", - type: Boolean - }, - "remarkableAthlete": { - name: "Remarkable Athlete.", - hint: "Half-Proficiency (rounded-up) to physical Ability Checks and Initiative.", - abilities: ['str','dex','con'], - section: "Feats", - type: Boolean - }, - "weaponCriticalThreshold": { - name: "Critical Hit Threshold", - hint: "Allow for expanded critical range; for example Improved or Superior Critical", - section: "Feats", - type: Number, - placeholder: 20 - } -}; diff --git a/module/item/entity.js.bak b/module/item/entity.js.bak deleted file mode 100644 index 9a570689..00000000 --- a/module/item/entity.js.bak +++ /dev/null @@ -1,920 +0,0 @@ -import { Dice5e } from "../dice.js"; -import { AbilityUseDialog } from "../apps/ability-use-dialog.js"; -import { AbilityTemplate } from "../pixi/ability-template.js"; - -/** - * Override and extend the basic :class:`Item` implementation - */ -export class Item5e extends Item { - - /* -------------------------------------------- */ - /* Item Properties */ - /* -------------------------------------------- */ - - /** - * Determine which ability score modifier is used by this item - * @type {string|null} - */ - get abilityMod() { - const itemData = this.data.data; - if (!("ability" in itemData)) return null; - - // Case 1 - defined directly by the item - if ( itemData.ability ) return itemData.ability; - - // Case 2 - inferred from a parent actor - else if ( this.actor ) { - const actorData = this.actor.data.data; - if ( this.data.type === "power" ) return actorData.attributes.powercasting || "int"; - else if ( this.data.type === "tool" ) return "int"; - else return "str"; - } - - // Case 3 - unknown - return null - } - - /* -------------------------------------------- */ - - /** - * Does the Item implement an attack roll as part of its usage - * @type {boolean} - */ - get hasAttack() { - return ["mwak", "rwak", "mpak", "rpak"].includes(this.data.data.actionType); - } - - /* -------------------------------------------- */ - - /** - * Does the Item implement a damage roll as part of its usage - * @type {boolean} - */ - get hasDamage() { - return !!(this.data.data.damage && this.data.data.damage.parts.length); - } - - /* -------------------------------------------- */ - - /** - * Does the Item implement a versatile damage roll as part of its usage - * @type {boolean} - */ - get isVersatile() { - return !!(this.hasDamage && this.data.data.damage.versatile); - } - - /* -------------------------------------------- */ - - /** - * Does the item provide an amount of healing instead of conventional damage? - * @return {boolean} - */ - get isHealing() { - return (this.data.data.actionType === "heal") && this.data.data.damage.parts.length; - } - - /* -------------------------------------------- */ - - /** - * Does the Item implement a saving throw as part of its usage - * @type {boolean} - */ - get hasSave() { - return !!(this.data.data.save && this.data.data.save.ability); - } - - /* -------------------------------------------- */ - - /** - * Does the Item have a target - * @type {boolean} - */ - get hasTarget() { - const target = this.data.data.target; - return target && !["none",""].includes(target.type); - } - - /* -------------------------------------------- */ - - /** - * Does the Item have an area of effect target - * @type {boolean} - */ - get hasAreaTarget() { - const target = this.data.data.target; - return target && (target.type in CONFIG.SW5E.areaTargetTypes); - } - - /* -------------------------------------------- */ - - /** - * A flag for whether this Item is limited in it's ability to be used by charges or by recharge. - * @type {boolean} - */ - get hasLimitedUses() { - let chg = this.data.data.recharge || {}; - let uses = this.data.data.uses || {}; - return !!chg.value || (!!uses.per && (uses.max > 0)); - } - - /* -------------------------------------------- */ - /* Data Preparation */ - /* -------------------------------------------- */ - - /** - * Augment the basic Item data model with additional dynamic data. - */ - prepareData() { - super.prepareData(); - - // Get the Item's data - const itemData = this.data; - const actorData = this.actor ? this.actor.data : {}; - const data = itemData.data; - const C = CONFIG.SW5E; - const labels = {}; - - // Classes - if ( itemData.type === "class" ) { - data.levels = Math.clamped(data.levels, 1, 20); - } - - // Power Level, School, and Components - if ( itemData.type === "power" ) { - labels.level = C.powerLevels[data.level]; - labels.school = C.powerSchools[data.school]; - labels.components = Object.entries(data.components).reduce((arr, c) => { - if ( c[1] !== true ) return arr; - arr.push(c[0].titleCase().slice(0, 1)); - return arr; - }, []); - } - - // Feat Items - else if ( itemData.type === "feat" ) { - const act = data.activation; - if ( act && (act.type === C.abilityActivationTypes.legendary) ) labels.featType = "Legendary Action"; - else if ( act && (act.type === C.abilityActivationTypes.lair) ) labels.featType = "Lair Action"; - else if ( act && act.type ) labels.featType = data.damage.length ? "Attack" : "Action"; - else labels.featType = "Passive"; - } - - // Species Items - else if ( itemData.type === "species" ) { - - } - // Equipment Items - else if ( itemData.type === "equipment" ) { - labels.armor = data.armor.value ? `${data.armor.value} AC` : ""; - } - - // Activated Items - if ( data.hasOwnProperty("activation") ) { - - // Ability Activation Label - let act = data.activation || {}; - if ( act ) labels.activation = [act.cost, C.abilityActivationTypes[act.type]].filterJoin(" "); - - // Target Label - let tgt = data.target || {}; - if (["none", "touch", "self"].includes(tgt.units)) tgt.value = null; - if (["none", "self"].includes(tgt.type)) { - tgt.value = null; - tgt.units = null; - } - labels.target = [tgt.value, C.distanceUnits[tgt.units], C.targetTypes[tgt.type]].filterJoin(" "); - - // Range Label - let rng = data.range || {}; - if (["none", "touch", "self"].includes(rng.units) || (rng.value === 0)) { - rng.value = null; - rng.long = null; - } - labels.range = [rng.value, rng.long ? `/ ${rng.long}` : null, C.distanceUnits[rng.units]].filterJoin(" "); - - // Duration Label - let dur = data.duration || {}; - if (["inst", "perm"].includes(dur.units)) dur.value = null; - labels.duration = [dur.value, C.timePeriods[dur.units]].filterJoin(" "); - - // Recharge Label - let chg = data.recharge || {}; - labels.recharge = `Recharge [${chg.value}${parseInt(chg.value) < 6 ? "+" : ""}]`; - } - - // Item Actions - if ( data.hasOwnProperty("actionType") ) { - - // Save DC - let save = data.save || {}; - if ( !save.ability ) save.dc = null; - else if ( this.isOwned ) { // Actor owned items - if ( save.scaling === "power" ) save.dc = actorData.data.attributes.powerdc; - else if ( save.scaling !== "flat" ) save.dc = this.actor.getPowerDC(save.scaling); - } else { // Un-owned items - if ( save.scaling !== "flat" ) save.dc = null; - } - labels.save = save.ability ? `DC ${save.dc || ""} ${C.abilities[save.ability]}` : ""; - - // Damage - let dam = data.damage || {}; - if ( dam.parts ) { - labels.damage = dam.parts.map(d => d[0]).join(" + ").replace(/\+ -/g, "- "); - labels.damageTypes = dam.parts.map(d => C.damageTypes[d[1]]).join(", "); - } - } - - // Assign labels - this.labels = labels; - } - - /* -------------------------------------------- */ - - /** - * Roll the item to Chat, creating a chat card which contains follow up attack or damage roll options - * @return {Promise} - */ - async roll({configureDialog=true}={}) { - - // Basic template rendering data - const token = this.actor.token; - const templateData = { - actor: this.actor, - tokenId: token ? `${token.scene._id}.${token.id}` : null, - item: this.data, - data: this.getChatData(), - labels: this.labels, - hasAttack: this.hasAttack, - isHealing: this.isHealing, - hasDamage: this.hasDamage, - isVersatile: this.isVersatile, - isPower: this.data.type === "power", - hasSave: this.hasSave, - hasAreaTarget: this.hasAreaTarget - }; - - // For feature items, optionally show an ability usage dialog - if (this.data.type === "feat") { - let configured = await this._rollFeat(configureDialog); - if ( configured === false ) return; - } - - // Render the chat card template - const templateType = ["tool", "consumable"].includes(this.data.type) ? this.data.type : "item"; - const template = `systems/sw5e/templates/chat/${templateType}-card.html`; - const html = await renderTemplate(template, templateData); - - // Basic chat message data - const chatData = { - user: game.user._id, - type: CONST.CHAT_MESSAGE_TYPES.OTHER, - content: html, - speaker: { - actor: this.actor._id, - token: this.actor.token, - alias: this.actor.name - } - }; - - // Toggle default roll mode - let rollMode = game.settings.get("core", "rollMode"); - if ( ["gmroll", "blindroll"].includes(rollMode) ) chatData["whisper"] = ChatMessage.getWhisperIDs("GM"); - if ( rollMode === "blindroll" ) chatData["blind"] = true; - - // Create the chat message - return ChatMessage.create(chatData); - } - - /* -------------------------------------------- */ - - /** - * Additional rolling steps when rolling a feat-type item - * @private - * @return {boolean} whether the roll should be prevented - */ - async _rollFeat(configureDialog) { - if ( this.data.type !== "feat" ) throw new Error("Wrong Item type"); - - // Configure whether to consume a limited use or to place a template - const usesRecharge = !!this.data.data.recharge.value; - const uses = this.data.data.uses; - let usesCharges = !!uses.per && (uses.max > 0); - let placeTemplate = false; - let consume = usesRecharge || usesCharges; - - // Determine whether the feat uses charges - configureDialog = configureDialog && (consume || this.hasAreaTarget); - if ( configureDialog ) { - const usage = await AbilityUseDialog.create(this); - if ( usage === null ) return false; - consume = Boolean(usage.get("consume")); - placeTemplate = Boolean(usage.get("placeTemplate")); - } - - // Update Item data - const current = getProperty(this.data, "data.uses.value") || 0; - if ( consume && usesRecharge ) { - await this.update({"data.recharge.charged": false}); - } - else if ( consume && usesCharges ) { - await this.update({"data.uses.value": Math.max(current - 1, 0)}); - } - - // Maybe initiate template placement workflow - if ( this.hasAreaTarget && placeTemplate ) { - const template = AbilityTemplate.fromItem(this); - if ( template ) template.drawPreview(event); - if ( this.owner && this.owner.sheet ) this.owner.sheet.minimize(); - } - return true; - } - - /* -------------------------------------------- */ - /* Chat Cards */ - /* -------------------------------------------- */ - - /** - * Prepare an object of chat data used to display a card for the Item in the chat log - * @param {Object} htmlOptions Options used by the TextEditor.enrichHTML function - * @return {Object} An object of chat data to render - */ - getChatData(htmlOptions) { - const data = duplicate(this.data.data); - const labels = this.labels; - - // Rich text description - data.description.value = TextEditor.enrichHTML(data.description.value, htmlOptions); - - // Item type specific properties - const props = []; - const fn = this[`_${this.data.type}ChatData`]; - if ( fn ) fn.bind(this)(data, labels, props); - - // General equipment properties - if ( data.hasOwnProperty("equipped") && !["loot", "tool"].includes(this.data.type) ) { - props.push( - data.equipped ? "Equipped" : "Not Equipped", - data.proficient ? "Proficient": "Not Proficient", - ); - } - - // Ability activation properties - if ( data.hasOwnProperty("activation") ) { - props.push( - labels.target, - labels.activation, - labels.range, - labels.duration - ); - } - - // Filter properties and return - data.properties = props.filter(p => !!p); - return data; - } - - /* -------------------------------------------- */ - - /** - * Prepare chat card data for equipment type items - * @private - */ - _equipmentChatData(data, labels, props) { - props.push( - CONFIG.SW5E.equipmentTypes[data.armor.type], - labels.armor || null, - data.stealth.value ? "Stealth Disadvantage" : null, - ); - } - - /* -------------------------------------------- */ - - /** - * Prepare chat card data for weapon type items - * @private - */ - _weaponChatData(data, labels, props) { - props.push( - CONFIG.SW5E.weaponTypes[data.weaponType], - ); - } - - /* -------------------------------------------- */ - - /** - * Prepare chat card data for consumable type items - * @private - */ - _consumableChatData(data, labels, props) { - props.push( - CONFIG.SW5E.consumableTypes[data.consumableType], - data.uses.value + "/" + data.uses.max + " Charges" - ); - data.hasCharges = data.uses.value >= 0; - } - - /* -------------------------------------------- */ - - /** - * Prepare chat card data for tool type items - * @private - */ - _toolChatData(data, labels, props) { - props.push( - CONFIG.SW5E.abilities[data.ability] || null, - CONFIG.SW5E.proficiencyLevels[data.proficient || 0] - ); - } - - /* -------------------------------------------- */ - - /** - * Prepare chat card data for tool type items - * @private - */ - _lootChatData(data, labels, props) { - props.push( - "Loot", - data.weight ? data.weight + " lbs." : null - ); - } - - /* -------------------------------------------- */ - - /** - * Render a chat card for Power type data - * @return {Object} - * @private - */ - _powerChatData(data, labels, props) { - props.push( - labels.level, - labels.components, - ); - } - - /* -------------------------------------------- */ - - /** - * Prepare chat card data for items of the "Feat" type - * @private - */ - _featChatData(data, labels, props) { - props.push(data.requirements); - } - - /* -------------------------------------------- */ - /* Item Rolls - Attack, Damage, Saves, Checks */ - /* -------------------------------------------- */ - - /** - * Place an attack roll using an item (weapon, feat, power, or equipment) - * Rely upon the Dice5e.d20Roll logic for the core implementation - * - * @return {Promise.} A Promise which resolves to the created Roll instance - */ - rollAttack(options={}) { - const itemData = this.data.data; - const actorData = this.actor.data.data; - const flags = this.actor.data.flags.sw5e || {}; - if ( !this.hasAttack ) { - throw new Error("You may not place an Attack Roll with this Item."); - } - const rollData = this.getRollData(); - - // Define Roll bonuses - const parts = [`@mod`]; - if ( (this.data.type !== "weapon") || itemData.proficient ) { - parts.push("@prof"); - } - - // Attack Bonus - const actorBonus = actorData.bonuses[itemData.actionType] || {}; - if ( itemData.attackBonus || actorBonus.attack ) { - parts.push("@atk"); - rollData["atk"] = [itemData.attackBonus, actorBonus.attack].filterJoin(" + "); - } - - // Compose roll options - const rollConfig = { - event: options.event, - parts: parts, - actor: this.actor, - data: rollData, - title: `${this.name} - Attack Roll`, - speaker: ChatMessage.getSpeaker({actor: this.actor}), - dialogOptions: { - width: 400, - top: options.event ? options.event.clientY - 80 : null, - left: window.innerWidth - 710 - } - }; - - // Expanded weapon critical threshold - if (( this.data.type === "weapon" ) && flags.weaponCriticalThreshold) { - rollConfig.critical = parseInt(flags.weaponCriticalThreshold); - } - - // Elven Accuracy - if ( ["weapon", "power"].includes(this.data.type) ) { - if (flags.elvenAccuracy && ["dex", "int", "wis", "cha"].includes(this.abilityMod)) { - rollConfig.elvenAccuracy = true; - } - } - - // Apply Halfling Lucky - if ( flags.halflingLucky ) rollConfig.halflingLucky = true; - - // Invoke the d20 roll helper - return Dice5e.d20Roll(rollConfig); - } - - /* -------------------------------------------- */ - - /** - * Place a damage roll using an item (weapon, feat, power, or equipment) - * Rely upon the Dice5e.damageRoll logic for the core implementation - * - * @return {Promise.} A Promise which resolves to the created Roll instance - */ - rollDamage({event, powerLevel=null, versatile=false}={}) { - const itemData = this.data.data; - const actorData = this.actor.data.data; - if ( !this.hasDamage ) { - throw new Error("You may not make a Damage Roll with this Item."); - } - const rollData = this.getRollData(); - if ( powerLevel ) rollData.item.level = powerLevel; - - // Define Roll parts - const parts = itemData.damage.parts.map(d => d[0]); - if ( versatile && itemData.damage.versatile ) parts[0] = itemData.damage.versatile; - if ( (this.data.type === "power") ) { - if ( (itemData.scaling.mode === "atwill") ) { - const lvl = this.actor.data.type === "character" ? actorData.details.level : actorData.details.powerLevel; - this._scaleAtWillDamage(parts, lvl, itemData.scaling.formula ); - } else if ( powerLevel && (itemData.scaling.mode === "level") && itemData.scaling.formula ) { - this._scalePowerDamage(parts, itemData.level, powerLevel, itemData.scaling.formula ); - } - } - - // Define Roll Data - const actorBonus = actorData.bonuses[itemData.actionType] || {}; - if ( actorBonus.damage && parseInt(actorBonus.damage) !== 0 ) { - parts.push("@dmg"); - rollData["dmg"] = actorBonus.damage; - } - - // Call the roll helper utility - const title = `${this.name} - Damage Roll`; - const flavor = this.labels.damageTypes.length ? `${title} (${this.labels.damageTypes})` : title; - return Dice5e.damageRoll({ - event: event, - parts: parts, - actor: this.actor, - data: rollData, - title: title, - flavor: flavor, - speaker: ChatMessage.getSpeaker({actor: this.actor}), - dialogOptions: { - width: 400, - top: event ? event.clientY - 80 : null, - left: window.innerWidth - 710 - } - }); - } - - /* -------------------------------------------- */ - - /** - * Adjust an at-will damage formula to scale it for higher level characters and monsters - * @private - */ - _scaleAtWillDamage(parts, level, scale) { - const add = Math.floor((level + 1) / 6); - if ( add === 0 ) return; - if ( scale && (scale !== parts[0]) ) { - parts[0] = parts[0] + " + " + scale.replace(new RegExp(Roll.diceRgx, "g"), (match, nd, d) => `${add}d${d}`); - } else { - parts[0] = parts[0].replace(new RegExp(Roll.diceRgx, "g"), (match, nd, d) => `${parseInt(nd)+add}d${d}`); - } - } - - /* -------------------------------------------- */ - - /** - * Adjust the power damage formula to scale it for power level up-casting - * @param {Array} parts The original damage parts - * @param {number} baseLevel The default power level - * @param {number} powerLevel The casted power level - * @param {string} formula The scaling formula - * @private - */ - _scalePowerDamage(parts, baseLevel, powerLevel, formula) { - const upcastLevels = Math.max(powerLevel - baseLevel, 0); - if ( upcastLevels === 0 ) return parts; - const bonus = new Roll(formula).alter(0, upcastLevels); - parts.push(bonus.formula); - return parts; - } - - /* -------------------------------------------- */ - - /** - * Place an attack roll using an item (weapon, feat, power, or equipment) - * Rely upon the Dice5e.d20Roll logic for the core implementation - * - * @return {Promise.} A Promise which resolves to the created Roll instance - */ - async rollFormula(options={}) { - if ( !this.data.data.formula ) { - throw new Error("This Item does not have a formula to roll!"); - } - - // Define Roll Data - const rollData = this.getRollData(); - const title = `${this.name} - Other Formula`; - - // Invoke the roll and submit it to chat - const roll = new Roll(rollData.item.formula, rollData).roll(); - roll.toMessage({ - speaker: ChatMessage.getSpeaker({actor: this.actor}), - flavor: this.data.data.chatFlavor || title, - rollMode: game.settings.get("core", "rollMode") - }); - return roll; - } - - /* -------------------------------------------- */ - - /** - * Use a consumable item, deducting from the quantity or charges of the item. - * - * @return {Promise.} A Promise which resolves to the created Roll instance or null - */ - async rollConsumable(options={}) { - const itemData = this.data.data; - - // Dispatch a damage roll - let roll = null; - if ( itemData.damage.parts.length ) { - roll = await this.rollDamage(options); - } - - // Dispatch an other formula - if ( itemData.formula ) { - roll = await this.rollFormula(options); - } - - // Deduct consumed charges from the item - if ( itemData.uses.autoUse ) { - let q = itemData.quantity; - let c = itemData.uses.value; - - // Deduct an item quantity - if ( c <= 1 && q > 1 ) { - await this.update({ - 'data.quantity': Math.max(q - 1, 0), - 'data.uses.value': itemData.uses.max - }); - } - - // Optionally destroy the item - else if ( c <= 1 && q <= 1 && itemData.uses.autoDestroy ) { - await this.actor.deleteOwnedItem(this.id); - } - - // Deduct the remaining charges - else { - await this.update({'data.uses.value': Math.max(c - 1, 0)}); - } - } - return roll; - } - - /* -------------------------------------------- */ - - /** - * Perform an ability recharge test for an item which uses the d6 recharge mechanic - * @prarm {Object} options - * - * @return {Promise.} A Promise which resolves to the created Roll instance - */ - async rollRecharge(options={}) { - const data = this.data.data; - if ( !data.recharge.value ) return; - - // Roll the check - const roll = new Roll("1d6").roll(); - const success = roll.total >= parseInt(data.recharge.value); - - // Display a Chat Message - const promises = [roll.toMessage({ - flavor: `${this.name} recharge check - ${success ? "success!" : "failure!"}`, - speaker: ChatMessage.getSpeaker({actor: this.actor, token: this.actor.token}) - })]; - - // Update the Item data - if ( success ) promises.push(this.update({"data.recharge.charged": true})); - return Promise.all(promises).then(() => roll); - } - - /* -------------------------------------------- */ - - /** - * Roll a Tool Check - * Rely upon the Dice5e.d20Roll logic for the core implementation - * - * @return {Promise.} A Promise which resolves to the created Roll instance - */ - rollToolCheck(options={}) { - if ( this.type !== "tool" ) throw "Wrong item type!"; - - // Prepare roll data - let rollData = this.getRollData(); - const parts = [`@mod`, "@prof"]; - const title = `${this.name} - Tool Check`; - - // Call the roll helper utility - return Dice5e.d20Roll({ - event: options.event, - parts: parts, - data: rollData, - template: "systems/sw5e/templates/chat/tool-roll-dialog.html", - title: title, - speaker: ChatMessage.getSpeaker({actor: this.actor}), - flavor: `${this.name} - Tool Check`, - dialogOptions: { - width: 400, - top: options.event ? options.event.clientY - 80 : null, - left: window.innerWidth - 710, - }, - halflingLucky: this.actor.getFlag("sw5e", "halflingLucky" ) || false - }); - } - - /* -------------------------------------------- */ - - /** - * Prepare a data object which is passed to any Roll formulas which are created related to this Item - * @private - */ - getRollData() { - if ( !this.actor ) return null; - const rollData = this.actor.getRollData(); - rollData.item = duplicate(this.data.data); - - // Include an ability score modifier if one exists - const abl = this.abilityMod; - if ( abl ) { - const ability = rollData.abilities[abl]; - rollData["mod"] = ability.mod || 0; - } - - // Include a proficiency score - const prof = "proficient" in rollData.item ? (rollData.item.proficient || 0) : 1; - rollData["prof"] = Math.floor(prof * rollData.attributes.prof); - return rollData; - } - - /* -------------------------------------------- */ - /* Chat Message Helpers */ - /* -------------------------------------------- */ - - static chatListeners(html) { - html.on('click', '.card-buttons button', this._onChatCardAction.bind(this)); - html.on('click', '.item-name', this._onChatCardToggleContent.bind(this)); - } - - /* -------------------------------------------- */ - - /** - * Handle execution of a chat card action via a click event on one of the card buttons - * @param {Event} event The originating click event - * @returns {Promise} A promise which resolves once the handler workflow is complete - * @private - */ - static async _onChatCardAction(event) { - event.preventDefault(); - - // Extract card data - const button = event.currentTarget; - button.disabled = true; - const card = button.closest(".chat-card"); - const messageId = card.closest(".message").dataset.messageId; - const message = game.messages.get(messageId); - const action = button.dataset.action; - - // Validate permission to proceed with the roll - const isTargetted = action === "save"; - if ( !( isTargetted || game.user.isGM || message.isAuthor ) ) return; - - // Get the Actor from a synthetic Token - const actor = this._getChatCardActor(card); - if ( !actor ) return; - - // Get the Item - const item = actor.getOwnedItem(card.dataset.itemId); - if ( !item ) { - return ui.notifications.error(`The requested item ${card.dataset.itemId} no longer exists on Actor ${actor.name}`) - } - const powerLevel = parseInt(card.dataset.powerLevel) || null; - - // Get card targets - let targets = []; - if ( isTargetted ) { - targets = this._getChatCardTargets(card); - if ( !targets.length ) { - ui.notifications.warn(`You must have one or more controlled Tokens in order to use this option.`); - return button.disabled = false; - } - } - - // Attack and Damage Rolls - if ( action === "attack" ) await item.rollAttack({event}); - else if ( action === "damage" ) await item.rollDamage({event, powerLevel}); - else if ( action === "versatile" ) await item.rollDamage({event, powerLevel, versatile: true}); - else if ( action === "formula" ) await item.rollFormula({event}); - - // Saving Throws for card targets - else if ( action === "save" ) { - for ( let t of targets ) { - await t.rollAbilitySave(button.dataset.ability, {event}); - } - } - - // Consumable usage - else if ( action === "consume" ) await item.rollConsumable({event}); - - // Tool usage - else if ( action === "toolCheck" ) await item.rollToolCheck({event}); - - // Power Template Creation - else if ( action === "placeTemplate") { - const template = AbilityTemplate.fromItem(item); - if ( template ) template.drawPreview(event); - } - - // Re-enable the button - button.disabled = false; - } - - /* -------------------------------------------- */ - - /** - * Handle toggling the visibility of chat card content when the name is clicked - * @param {Event} event The originating click event - * @private - */ - static _onChatCardToggleContent(event) { - event.preventDefault(); - const header = event.currentTarget; - const card = header.closest(".chat-card"); - const content = card.querySelector(".card-content"); - content.style.display = content.style.display === "none" ? "block" : "none"; - } - - /* -------------------------------------------- */ - - /** - * Get the Actor which is the author of a chat card - * @param {HTMLElement} card The chat card being used - * @return {Actor|null} The Actor entity or null - * @private - */ - static _getChatCardActor(card) { - - // Case 1 - a synthetic actor from a Token - const tokenKey = card.dataset.tokenId; - if (tokenKey) { - const [sceneId, tokenId] = tokenKey.split("."); - const scene = game.scenes.get(sceneId); - if (!scene) return null; - const tokenData = scene.getEmbeddedEntity("Token", tokenId); - if (!tokenData) return null; - const token = new Token(tokenData); - return token.actor; - } - - // Case 2 - use Actor ID directory - const actorId = card.dataset.actorId; - return game.actors.get(actorId) || null; - } - - /* -------------------------------------------- */ - - /** - * Get the Actor which is the author of a chat card - * @param {HTMLElement} card The chat card being used - * @return {Array.} An Array of Actor entities, if any - * @private - */ - static _getChatCardTargets(card) { - const character = game.user.character; - const controlled = canvas.tokens.controlled; - const targets = controlled.reduce((arr, t) => t.actor ? arr.concat([t.actor]) : arr, []); - if ( character && (controlled.length === 0) ) targets.push(character); - return targets; - } -} diff --git a/module/item/sheet.js b/module/item/sheet.js index 53960b89..7ccd5c80 100644 --- a/module/item/sheet.js +++ b/module/item/sheet.js @@ -2,7 +2,7 @@ import { TraitSelector } from "../apps/trait-selector.js"; /** - * Override and extend the core ItemSheet implementation to handle D&D5E specific item types + * Override and extend the core ItemSheet implementation to handle SW5E specific item types * @type {ItemSheet} */ export class ItemSheet5e extends ItemSheet { diff --git a/sw5e.css.bak b/sw5e.css.bak deleted file mode 100644 index 0a5abd4c..00000000 --- a/sw5e.css.bak +++ /dev/null @@ -1,1467 +0,0 @@ -/* Deprecated vars */ -/* ----------------------------------------- */ -/* Fonts */ -/* ----------------------------------------- */ - -/* russo-one-regular - latin */ -@font-face { - font-family: 'Russo One'; - font-style: normal; - font-weight: 400; - src: url('./fonts/RussoOne.ttf'); -} -/* bungee-inline-regular - latin */ -@font-face { - font-family: 'Bungee Inline'; - font-style: normal; - font-weight: 400; - src: url('./fonts/BungeeInline.ttf'); -} -/* open-sans-regular - latin */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: url('./fonts/OpenSans-Regular.ttf'); -} -/* ----------------------------------------- */ -/* Sheet Styles */ -/* ----------------------------------------- */ -/* ----------------------------------------- */ -/* Flexbox */ -/* ----------------------------------------- */ -.flexrow { - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: flex-start; -} -.flexrow > * { - flex: 1; -} -.flexrow .flex1 { - flex: 1; -} -.flexrow .flex2 { - flex: 2; -} -.flexrow .flex3 { - flex: 3; -} -.flexrow .flex4 { - flex: 4; -} -.flexcol { - display: flex; - flex-direction: column; - flex-wrap: nowrap; -} -.flexcol > * { - flex: 1; -} -.flexcol .flex1 { - flex: 1; -} -.flexcol .flex2 { - flex: 2; -} -.flexcol .flex3 { - flex: 3; -} -.flexcol .flex4 { - flex: 4; -} -/* ----------------------------------------- */ -/* All SW5e Apps */ -/* ----------------------------------------- */ -.sw5e { - /* ----------------------------------------- */ - /* Element Styles */ - /* ----------------------------------------- */ - /* Form Groups */ - /* Tags */ -} -.sw5e .window-content { - background: url("ui/parchment.jpg") repeat; - font-size: 13px; - color: #191813; -} -.sw5e input[type="text"] -.sw5e select { - height: calc(100% - 2px); - border: 1px solid #7a7971; - background: rgba(0, 0, 0, 0.05); - color: #191813; -} -.sw5e input[type="text"]:hover, -.sw5e input[type="text"]:focus { - border: 1px solid #111; - box-shadow: 0 0 8px red; -} -.sw5e input:disabled, -.sw5e select:disabled, -.sw5e textarea:disabled { - color: #4b4a44; -} -.sw5e input:disabled:hover, -.sw5e select:disabled:hover, -.sw5e textarea:disabled:hover, -.sw5e input:disabled:focus, -.sw5e select:disabled:focus, -.sw5e textarea:disabled:focus { - box-shadow: none !important; - border: 1px solid transparent !important; - outline: none !important; -} -.sw5e button { - background: rgba(0, 0, 0, 0.1); - border: 2px groove #eeede0; -} -.sw5e label.checkbox { - flex: auto; - margin: 0; - line-height: 20px; - font-size: 10px; - text-align: right; -} -.sw5e label.checkbox input[type="checkbox"] { - height: auto; - margin: 0 5px 0; - position: relative; - top: 3px; -} -.sw5e .form-group label { - flex: 2; - color: #4b4a44; - font-weight: bold; -} -.sw5e .form-group .form-fields { - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: flex-start; -} -.sw5e .form-group .form-fields > * { - flex: 1; -} -.sw5e .form-group .form-fields .flex1 { - flex: 1; -} -.sw5e .form-group .form-fields .flex2 { - flex: 2; -} -.sw5e .form-group .form-fields .flex3 { - flex: 3; -} -.sw5e .form-group .form-fields .flex4 { - flex: 4; -} -.sw5e .form-group .form-fields > * { - margin: 0 3px 0 0; -} -.sw5e .form-group .form-fields > *:last-child { - margin-right: 0; -} -.sw5e .form-group.stacked label { - flex: 0 0 100%; - margin: 0; -} -.sw5e .form-group.stacked label.checkbox { - flex: auto; - text-align: left; -} -.sw5e .form-header { - margin: 0 0 0.25em 0; - padding: 0 2px; - font-family: "Russo One"; - font-size: 8px; - font-size: 12px; - border-top: 2px groove #eeede0; - border-bottom: 2px groove #eeede0; -} -.sw5e .tag { - display: inline-block; - margin: 0 2px 0 0; - padding: 0 3px; - font-size: 10px; - line-height: 16px; - border: 1px solid #999; - border-radius: 3px; - background: rgba(0, 0, 0, 0.05); -} -/* ----------------------------------------- */ -/* Entity Sheets Specifically */ -/* ----------------------------------------- */ -.sw5e.sheet { - /* ----------------------------------------- */ - /* Element Styles */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* TinyMCE */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Sheet Header */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Sheet Navigation */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Sheet Body */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* List Filters */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Trait Lists */ - /* ----------------------------------------- */ -} -.sw5e.sheet .window-content { - overflow-y: hidden; - padding: 5px; - background: url("ui/parchment.jpg") repeat; - font-size: 13px; - color: #191813; -} -.sw5e.sheet .window-content form { - height: 100%; - overflow: hidden; -} -.sw5e.sheet .window-content .tab { - height: 100%; - overflow-y: auto; - align-content: flex-start; -} -.sw5e.sheet input[type="text"] { - background: none; - border: 1px solid transparent; -} -.sw5e.sheet input[type="text"]:hover, -.sw5e.sheet input[type="text"]:focus { - border: 1px solid #111; -} -.sw5e.sheet select { - flex: 1; - font-size: 12px; - height: 22px; - background: transparent; -} -.sw5e.sheet .editable .rollable:hover { - color: #000; - text-shadow: 0 0 10px red; - cursor: pointer; -} -.sw5e.sheet .editor { - height: 100%; -} -.sw5e.sheet .editor .tox-toolbar-overlord, -.sw5e.sheet .editor .tox-toolbar__primary { - background: none; -} -.sw5e.sheet .sheet-header { - flex: 0 0 100px; - border-bottom: 2px groove #eeede0; - font-family: "Russo One"; - font-size: 14px; - /* Character Name */ - /* Profile Image */ - /* Header Summary Details */ -} -.sw5e.sheet .sheet-header h1 { - flex: 2; - border-bottom: none; - height: 60px; - margin: 0; - padding: 5px; -} -.sw5e.sheet .sheet-header h1 input { - height: 50px; - font-size: 1.05vw; - text-transform: uppercase; -} -.sw5e.sheet .sheet-header img.profile { - flex: 0 0 100px; - max-width: 100px; - height: 100px; - object-fit: cover; - border: none; - border-right: 2px groove #eeede0; -} -.sw5e.sheet .sheet-header .summary { - flex: 0 0 100%; - height: 40px; - margin: 0; - padding: 0; - list-style: none; - border-top: 2px groove #eeede0; - border-bottom: none; -} -.sw5e.sheet .sheet-header .summary li { - width: 33.33%; - float: left; - height: 34px; - margin: 2px 0; - padding: 0 3px; - border-right: 2px groove #eeede0; - line-height: 34px; - color: #4b4a44; -} -.sw5e.sheet .sheet-header .summary li:last-child { - border-right: none; -} -.sw5e.sheet .sheet-navigation { - flex: 0 0 30px; - margin-bottom: 5px; - font-family: "Russo One"; - font-size: 12px; -} -.sw5e.sheet .sheet-navigation .item { - height: 30px; - line-height: 32px; - margin: 0 24px; - border-bottom: 3px solid #b5b3a4; -} -.sw5e.sheet .sheet-navigation .item.active { - border-bottom: 3px solid #44191A; -} -.sw5e.sheet .sheet-body { - flex: 1; - overflow: hidden; - font-family: "Open Sans"; -} -.sw5e.sheet .sheet-body h2 { - font-family: "Russo One"; - font-size: 18px; - text-transform: uppercase; - color: #c40f0f; -} -.sw5e.sheet .sheet-body th { - font-family: "Russo One"; - text-transform: uppercase; -} -.sw5e.sheet .filter-list { - list-style: none; - margin: 0; - padding: 0; - line-height: 16px; -} -.sw5e.sheet .filter-list .filter-title { - flex: 3; -} -.sw5e.sheet .filter-list .filter-item { - text-align: center; - font-size: 12px; - margin: 0 6px; - border-bottom: 3px solid #b5b3a4; - white-space: nowrap; -} -.sw5e.sheet .filter-list .filter-item:hover { - text-shadow: 0 0 4px red; - border-bottom: 3px solid #7a7971; -} -.sw5e.sheet .filter-list .filter-item.active { - border-bottom: 3px solid #44191A; -} -.sw5e.sheet .trait-selector { - flex: 0 0 16px; - padding: 2px 0; - color: #999; - font-size: 10px; -} -.sw5e.sheet .traits-list { - line-height: 20px; - list-style: none; - margin: 0; - padding: 0; - text-align: right; -} -/* ----------------------------------------- */ -/* Trait Selector -/* ----------------------------------------- */ -#trait-selector .trait-list { - list-style: none; - margin: 0; - padding: 0; -} -#trait-selector input[type="text"] { - height: 24px; - margin: 2px; -} -.sw5e.sheet.actor { - /* ----------------------------------------- */ - /* Sheet Header */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* General Styles */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Attributes */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Ability Scores */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Skills */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Statuses */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Traits */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Inventory Lists */ - /* ----------------------------------------- */ - /* Inventory List Filters */ - /* ----------------------------------------- */ - /* Powerbook */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* TinyMCE */ - /* ----------------------------------------- */ -} -.sw5e.sheet.actor .sheet-header .charlevel { - flex: 0 0 160px; - height: 60px; - margin: 0; - padding: 5px; - text-align: right; -} -.sw5e.sheet.actor .sheet-header .charlevel .level { - width: 100%; - height: 30px; - font-size: 18px; - line-height: 30px; -} -.sw5e.sheet.actor .sheet-header .charlevel .level label { - display: inline; - font-size: 18px; - text-align: right; -} -.sw5e.sheet.actor .sheet-header .charlevel .level input { - display: inline; - width: 36px; - font-size: 18px; - text-align: center; -} -.sw5e.sheet.actor .sheet-header .charlevel .level.noxp { - margin-top: 10px; -} -.sw5e.sheet.actor .sheet-header .charlevel .level.noxp > label { - font-size: 32px; -} -.sw5e.sheet.actor .sheet-header .charlevel .level.noxp > input { - font-size: 18px; - flex: 0 0 40px; - height: 44px; -} -.sw5e.sheet.actor .sheet-header .charlevel .experience { - width: 100%; - height: 20px; - padding-right: 5px; - font-size: 16px; - color: #4b4a44; -} -.sw5e.sheet.actor .attributes input.temphp { - width: 48%; -} -.sw5e.sheet.actor h4.box-title { - line-height: 16px; - margin: 4px 8px 2px; - font-size: 14px; - border-bottom: 1px solid #b5b3a4; -} -.sw5e.sheet.actor ul.attributes { - list-style: none; - margin: 5px 0 0; - padding: 0; -} -.sw5e.sheet.actor ul.attributes li.attribute { - height: 70px; - margin: 0 5px; - border: 2px groove #eeede0; - border-radius: 4px; - font-family: "Russo One"; - font-size: 12px; - text-align: center; -} -.sw5e.sheet.actor ul.attributes li.attribute .attribute-name { - flex: 0 0 18px; -} -.sw5e.sheet.actor ul.attributes li.attribute .attribute-value { - height: 28px; - line-height: 28px; -} -.sw5e.sheet.actor ul.attributes li.attribute .attribute-value input { - display: inline; - max-width: 80%; - height: 28px; - margin: 0; - font-size: 14px; -} -.sw5e.sheet.actor ul.attributes li.attribute .attribute-value span.sep { - display: inline; - position: relative; - top: 2px; - font-size: 28px; - color: #7a7971; -} -.sw5e.sheet.actor ul.attributes li.attribute .attribute-value.multiple input { - max-width: 33%; -} -.sw5e.sheet.actor ul.attributes li.attribute .attribute-footer { - flex: 0 0 18px; - margin-top: -1px; - line-height: 18px; - font-family: "Signika", "Palatino Linotype", serif; - font-size: 12px; -} -.sw5e.sheet.actor .ability-scores { - flex: 0 0 100%; - list-style: none; - margin: 0; - padding: 0; - font-family: "Russo One"; - font-size: 8px; -} -.sw5e.sheet.actor .ability-scores .ability { - height: 70px; - margin: 0 5px; - text-align: center; - border: 2px groove #eeede0; - border-radius: 3px; - /* Hide modifier box on hover */ -} -.sw5e.sheet.actor .ability-scores .ability input.ability-score { - height: 30px; - width: 50px; - margin: 0 auto; - line-height: 32px; - font-size: 16px; -} -.sw5e.sheet.actor .ability-scores .ability .ability-modifiers { - height: 24px; - margin: -10px 0 0; -} -.sw5e.sheet.actor .ability-scores .ability .ability-modifiers span.ability-mod, -.sw5e.sheet.actor .ability-scores .ability .ability-modifiers span.ability-save { - flex: 0 0 24px; - height: 24px; - border-top: 2px groove #eeede0; -} -.sw5e.sheet.actor .ability-scores .ability .ability-modifiers span.ability-mod { - border-right: 2px groove #eeede0; -} -.sw5e.sheet.actor .ability-scores .ability .ability-modifiers .ability-proficiency { - line-height: 30px; -} -.sw5e.sheet.actor .ability-scores .ability .ability-modifiers span.ability-save { - border-left: 2px groove #eeede0; -} -.sw5e.sheet.actor .ability-scores .ability input.ability-score:hover + .ability-modifiers { - visibility: hidden; -} -.sw5e.sheet.actor .proficiency-toggle { - color: #b5b3a4; - font-size: 12px; -} -.sw5e.sheet.actor .proficient .proficiency-toggle { - color: #4b4a44; -} -.sw5e.sheet.actor .locked .proficiency-toggle { - color: #b5b3a4; - text-shadow: none; - cursor: default; -} -.sw5e.sheet.actor ul.skills-list { - flex: 0 0 192px; - list-style: none; - margin: 5px 5px 0; - padding: 2px 2px 0; - border: 2px groove #eeede0; - border-radius: 3px; -} -.sw5e.sheet.actor ul.skills-list li.skill { - height: 22px; - padding: 3px 0; -} -.sw5e.sheet.actor ul.skills-list li.skill h4 { - flex: 1px; - margin: 0; - font-size: 11px; - line-height: 18px; -} -.sw5e.sheet.actor ul.skills-list li.skill .skill-proficiency { - flex: 0 0 16px; - line-height: 18px; -} -.sw5e.sheet.actor ul.skills-list li.skill .skill-ability { - flex: 0 0 26px; -} -.sw5e.sheet.actor ul.skills-list li.skill .skill-mod { - flex: 0 0 20px; -} -.sw5e.sheet.actor ul.skills-list li.skill .skill-passive { - flex: 0 0 26px; - text-align: center; - color: #7a7971; -} -.sw5e.sheet.actor .counters { - flex: 0 0 100%; - border-bottom: 2px groove #eeede0; - margin-bottom: 5px; -} -.sw5e.sheet.actor .counters .counter { - padding: 0 3px; - line-height: 32px; -} -.sw5e.sheet.actor .counters .counter h4 { - flex: auto; - margin: 0; - font-family: "Russo One"; - font-size: 14px; - font-size: 10px; -} -.sw5e.sheet.actor .counters .counter .counter-value { - flex: 0 0 50px; - text-align: right; -} -.sw5e.sheet.actor .counters .counter .counter-value > * { - display: inline; -} -.sw5e.sheet.actor .counters .counter input[type="text"] { - height: 20px; - max-width: 20px; - margin: 0; - padding: 0; - text-align: center; -} -.sw5e.sheet.actor .counters .counter input[type="checkbox"] { - position: relative; - margin: 0; - top: 6px; -} -.sw5e.sheet.actor .counters .counter span.sep { - margin: 0 -2px; - font-size: 12px; -} -.sw5e.sheet.actor .traits { - margin: 0 5px; -} -.sw5e.sheet.actor .traits .form-group, -.sw5e.sheet.actor .traits .form-group-stacked { - margin: 0 0 4px 0; - justify-content: space-between; -} -.sw5e.sheet.actor .traits .configure-flags { - flex: 1; -} -.sw5e.sheet.actor .traits .actor-size { - flex: 0 0 150px; -} -.sw5e.sheet.actor .traits label { - flex: 0 0 150px; - line-height: 20px; - font-weight: bold; - margin: 0; -} -.sw5e.sheet.actor .traits input { - text-align: right; -} -.sw5e.sheet.actor .traits i.fas { - float: right; - margin-right: 3px; - text-align: right; - color: #999; -} -.sw5e.sheet.actor .traits i.fas:hover { - color: #111; - text-shadow: 0 0 10px red; -} -.sw5e.sheet.actor .traits .inactive { - color: #7a7971; -} -.sw5e.sheet.actor .tab.features, -.sw5e.sheet.actor .tab.inventory, -.sw5e.sheet.actor .tab.powerbook { - overflow-y: hidden; -} -.sw5e.sheet.actor .inventory-filters { - margin: 0 8px; - flex: 0 0 20px; -} -.sw5e.sheet.actor .inventory-filters h3, -.sw5e.sheet.actor .inventory-filters .filter-title { - font-family: "Russo One"; - font-size: 10px; - color: #4b4a44; - font-size: 12px; - margin: 0; -} -.sw5e.sheet.actor .inventory-filters.powerbook-filters { - flex: 0 0 40px; -} -.sw5e.sheet.actor .inventory-filters .currency { - list-style: none; - margin: 4px 0 8px; - padding: 0; - font-size: 12px; -} -.sw5e.sheet.actor .inventory-filters .currency label { - flex: 0; - margin-left: 8px; - text-align: right; - line-height: 20px; - color: #7a7971; -} -.sw5e.sheet.actor .inventory-filters .currency input[type="text"] { - flex: 0 0 48px; - text-align: center; - margin-left: 8px; - border-bottom: 2px groove #eeede0; -} -.sw5e.sheet.actor .inventory-list { - list-style: none; - margin: 0; - padding: 0 5px; - overflow-y: auto; -} -.sw5e.sheet.actor .inventory-list .item { - line-height: 30px; - padding: 0 2px; - border-bottom: 1px solid #c9c7b8; -} -.sw5e.sheet.actor .inventory-list .item:last-child { - border-bottom: none; -} -.sw5e.sheet.actor .inventory-list .item .item-name { - cursor: pointer; - max-height: 30px; - overflow: hidden; -} -.sw5e.sheet.actor .inventory-list .item .item-name .item-image { - flex: 0 0 30px; - background-size: 30px; - margin-right: 5px; -} -.sw5e.sheet.actor .inventory-list .item .item-name h4 { - margin: 0; - white-space: nowrap; - overflow-x: hidden; -} -.sw5e.sheet.actor .inventory-list .item .item-name.rollable .item-image:hover { - background-image: url("/icons/svg/d20-black.svg") !important; -} -.sw5e.sheet.actor .inventory-list .item .item-name.rollable:hover .item-image { - background-image: url("/icons/svg/d20-grey.svg") !important; -} -.sw5e.sheet.actor .inventory-list .item .item-name i.attuned { - color: #7a7971; -} -.sw5e.sheet.actor .inventory-list .item .item-uses input { - width: 24px; - text-align: center; -} -.sw5e.sheet.actor .inventory-list .item .item-properties { - margin-top: 3px; -} -.sw5e.sheet.actor .inventory-list .item .item-recharge { - flex: 0 0 80px; - text-align: right; - font-size: 11px; - color: #7a7971; -} -.sw5e.sheet.actor .inventory-list .inventory-header { - margin: 2px 0; - padding: 0; - background: rgba(0, 0, 0, 0.05); - border: 2px groove #eeede0; - font-weight: bold; - line-height: 24px; -} -.sw5e.sheet.actor .inventory-list .inventory-header h3 { - margin: 0 -5px 0 0; - padding-left: 5px; - font-size: 13px; - font-weight: bold; -} -.sw5e.sheet.actor .inventory-list .inventory-header .item-controls a.item-create { - flex: 0 0 100%; -} -.sw5e.sheet.actor .inventory-list .item-detail { - flex: 0 0 70px; - font-size: 12px; - color: #7a7971; - text-align: center; - border-right: 1px solid #c9c7b8; -} -.sw5e.sheet.actor .inventory-list .item-detail:last-child { - border-right: none; -} -.sw5e.sheet.actor .inventory-list .item-detail.item-action { - flex: 0 0 100px; -} -.sw5e.sheet.actor .inventory-list .item-weight { - flex: 0 0 60px; - border-left: 1px solid #c9c7b8; - border-right: 1px solid #c9c7b8; -} -.sw5e.sheet.actor .inventory-list .item-list { - list-style: none; - margin: 0; - padding: 0; -} -.sw5e.sheet.actor .inventory-list .item-controls { - flex: 0 0 44px; - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: flex-start; - justify-content: flex-end; -} -.sw5e.sheet.actor .inventory-list .item-controls > * { - flex: 1; -} -.sw5e.sheet.actor .inventory-list .item-controls .flex1 { - flex: 1; -} -.sw5e.sheet.actor .inventory-list .item-controls .flex2 { - flex: 2; -} -.sw5e.sheet.actor .inventory-list .item-controls .flex3 { - flex: 3; -} -.sw5e.sheet.actor .inventory-list .item-controls .flex4 { - flex: 4; -} -.sw5e.sheet.actor .inventory-list .item-controls a { - flex: 0 0 22px; - font-size: 12px; - text-align: center; - color: #7a7971; -} -.sw5e.sheet.actor .inventory-list .item-summary { - flex: 0 0 100%; - font-size: 12px; - line-height: 16px; - padding: 0.25em 0.5em; - border-top: 1px solid #c9c7b8; -} -.sw5e.sheet.actor .powercasting-ability h3, -.sw5e.sheet.actor .pact-slots h3 { - flex: none; - margin-right: 5px; -} -.sw5e.sheet.actor .powercasting-ability input, -.sw5e.sheet.actor .pact-slots input, -.sw5e.sheet.actor .powercasting-ability span, -.sw5e.sheet.actor .pact-slots span { - flex: 0 0 32px; - text-align: center; -} -.sw5e.sheet.actor .powercasting-ability select, -.sw5e.sheet.actor .pact-slots select { - margin: 0 5px; - flex: 0 0 150px; -} -.sw5e.sheet.actor .powercasting-ability h3.power-dc, -.sw5e.sheet.actor .pact-slots h3.power-dc { - flex: 1; - text-align: right; -} -.sw5e.sheet.actor .pact-slots { - align-items: center; -} -.sw5e.sheet.actor .power-slots, -.sw5e.sheet.actor .power-comps { - flex: 0 0 72px; - padding-right: 5px; - text-align: right; - font-size: 12px; - color: #7a7971; - border-right: 1px solid #c9c7b8; -} -.sw5e.sheet.actor .power-slots input, -.sw5e.sheet.actor .power-slots span.sep { - display: inline; - max-width: 20px; - text-align: center; -} -.sw5e.sheet.actor .power-uses { - padding-right: 8px; - text-align: right !important; -} -.sw5e.sheet.actor .power-school, -.sw5e.sheet.actor .power-action, -.sw5e.sheet.actor .power-target { - flex: 0 0 100px; - font-size: 12px; - color: #7a7971; - text-align: center; - border-right: 1px solid #c9c7b8; -} -.sw5e.sheet.actor .power-component { - line-height: 14px; -} -.sw5e.sheet.actor .power-component.C, -.sw5e.sheet.actor .power-component.R { - display: inline-block; - text-align: center; - padding-top: 1px; - width: 16px; - color: #c9c7b8; - background: rgba(0, 0, 0, 0.4); - border: 1px solid transparent; - border-radius: 8px; -} -.sw5e.sheet.actor .powerbook-empty .item-controls { - flex: 1; -} -.sw5e.sheet.actor .editor { - padding: 0 8px; -} -.sw5e.sheet.item { - min-height: 520px; - min-width: 700px; - /* ----------------------------------------- */ - /* Sheet Header */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Item Details Form */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Item Actions */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Item Actions */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Loot Sheet (No Tabs) */ - /* ----------------------------------------- */ -} -.sw5e.sheet.item .sheet-header img.profile { - border: 2px solid #000; -} -.sw5e.sheet.item .sheet-header .item-subtitle { - flex: 1 0 80px; - height: 60px; - margin: 0; - padding: 5px; - text-align: right; - color: #7a7971; -} -.sw5e.sheet.item .sheet-header .item-subtitle .item-type { - font-size: 16px; - line-height: 26px; - margin: 0; -} -.sw5e.sheet.item .sheet-header .item-subtitle .item-status { - font-size: 16px; - line-height: 24px; -} -.sw5e.sheet.item .sheet-navigation { - margin-bottom: 5px; -} -.sw5e.sheet.item .sheet-navigation .item { - font-size: 14px; -} -.sw5e.sheet.item .sheet-body { - overflow: hidden; - font-family: "Open Sans"; -} -.sw5e.sheet.item .sheet-body h2 { - font-family: "Russo One"; - font-size: 18px; -} -.sw5e.sheet.item .sheet-body .tab { - padding: 0 5px; - overflow: hidden auto; -} -.sw5e.sheet.item .sheet-body .item-properties { - flex: 0 0 120px; - margin: 5px 5px 5px 0; - padding-right: 5px; - border-right: 2px groove #eeede0; -} -.sw5e.sheet.item .sheet-body .item-properties .form-group { - margin: 0; -} -.sw5e.sheet.item .sheet-body .item-properties .form-group label { - line-height: 20px; -} -.sw5e.sheet.item .sheet-body .item-properties .form-group input { - text-align: right; -} -.sw5e.sheet.item .sheet-body .item-properties .properties-list { - list-style: none; - margin: 0; - padding: 0; -} -.sw5e.sheet.item .sheet-body .item-properties .properties-list li { - margin: 3px 0; - padding: 0 2px; - background: rgba(0, 0, 0, 0.05); - border: 2px groove #eeede0; - text-align: center; - font-size: 12px; - line-height: 18px; -} -.sw5e.sheet.item .details input[type="text"], -.sw5e.sheet.item .details select { - height: 24px; - border: 1px solid #7a7971; - background: rgba(0, 0, 0, 0.05); -} -.sw5e.sheet.item .details .form-group span { - text-align: center; - line-height: 24px; -} -.sw5e.sheet.item .details .form-group.input-select select { - flex: 1.8; -} -.sw5e.sheet.item .details .form-group.input-select-select select { - flex: 1.5; -} -.sw5e.sheet.item .details .form-group.uses-per input { - flex: 1; -} -.sw5e.sheet.item .details .form-group.uses-per span { - flex: 0 0 16px; -} -.sw5e.sheet.item .details .form-group.uses-per select { - flex: 3; -} -.sw5e.sheet.item .details span.sep { - flex: 0 0 8px; -} -.sw5e.sheet.item .details .prepared { - flex: 1.3 !important; - text-align: right; - padding-right: 10px; -} -.sw5e.sheet.item .details .power-materials { - flex: 0 0 100%; - margin: 0.25em 0; - justify-content: flex-end; -} -.sw5e.sheet.item .details .power-materials label { - flex: 0 0 64px; - text-align: right; - margin-right: 5px; - font-size: 12px; - line-height: 24px; -} -.sw5e.sheet.item .details .power-materials input[type="text"] { - flex: 0 0 48px; - margin-right: 10px; -} -.sw5e.sheet.item h4.damage-header { - margin: 0; - padding: 0; - font-weight: bold; - line-height: 24px; - color: #4b4a44; -} -.sw5e.sheet.item .damage-parts { - list-style: none; - margin: 0; - padding: 0; -} -.sw5e.sheet.item .damage-parts .damage-part { - flex: 0 0 100%; - padding: 0; -} -.sw5e.sheet.item .damage-parts .damage-part input { - flex: 3; -} -.sw5e.sheet.item .damage-parts .damage-part select { - margin-left: 5px; - flex: 1; -} -.sw5e.sheet.item .damage-control { - width: 18px; - flex: 0 0 18px; - line-height: 24px; - float: right; - text-align: right; - color: #7a7971; -} - -.sw5e.sheet.item h4.armorproperties-header { - margin: 0; - padding: 0; - font-weight: bold; - line-height: 24px; - color: #4b4a44; -} -.sw5e.sheet.item .armorproperties-parts { - list-style: none; - margin: 0; - padding: 0; -} -.sw5e.sheet.item .armorproperties-parts .armorproperties-part { - flex: 0 0 100%; - padding: 0; -} -.sw5e.sheet.item .armorproperties-parts .armorproperties-part input { - flex: 3; -} -.sw5e.sheet.item .armorproperties-parts .armorproperties-part select { - margin-left: 5px; - flex: 1; -} -.sw5e.sheet.item .armorproperties-control { - width: 18px; - flex: 0 0 18px; - line-height: 24px; - float: right; - text-align: right; - color: #7a7971; - -} - -.sw5e.sheet.item h4.weaponproperties-header { - margin: 0; - padding: 0; - font-weight: bold; - line-height: 24px; - color: #4b4a44; -} -.sw5e.sheet.item .weaponproperties-parts { - list-style: none; - margin: 0; - padding: 0; -} -.sw5e.sheet.item .weaponproperties-parts .weaponproperties-part { - flex: 0 0 100%; - padding: 0; -} -.sw5e.sheet.item .weaponproperties-parts .weaponproperties-part input { - flex: 3; -} -.sw5e.sheet.item .weaponproperties-parts .weaponproperties-part select { - margin-left: 5px; - flex: 1; -} -.sw5e.sheet.item .weaponproperties-control { - width: 18px; - flex: 0 0 18px; - line-height: 24px; - float: right; - text-align: right; - color: #7a7971; -} - -.sw5e.sheet.item .recharge span { - flex: 0 0 80px; -} -.sw5e.sheet.item .recharge label.checkbox { - flex: 0 0 80px; - text-align: right; -} -.sw5e.sheet.item .weapon-properties label.checkbox { - flex: 0 0 98px; -} -.sw5e.sheet.item .loot-header { - margin-bottom: 10px; -} -/* ----------------------------------------- */ -/* Chat Cards -/* ----------------------------------------- */ -.sw5e.chat-card { - font-style: normal; - font-size: 12px; -} -.sw5e.chat-card .card-header { - padding: 3px 0; - border-top: 2px groove #FFF; - border-bottom: 2px groove #FFF; -} -.sw5e.chat-card .card-header img { - flex: 0 0 36px; - margin-right: 5px; -} -.sw5e.chat-card .card-header h3 { - flex: 1; - margin: 0; - line-height: 36px; - font-family: "Russo One"; - font-size: 10px; - color: #4b4a44; -} -.sw5e.chat-card .card-header h3:hover { - color: #111; - text-shadow: 0 0 10px red; -} -.sw5e.chat-card .card-content { - margin: 5px 0; -} -.sw5e.chat-card .card-content h3 { - font-size: 12px; - margin: 0; - font-weight: bold; -} -.sw5e.chat-card .card-content > * { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} -.sw5e.chat-card .card-buttons { - margin: 5px 0; -} -.sw5e.chat-card .card-buttons span { - display: block; - line-height: 28px; - text-align: center; - border: 1px solid #CCC; -} -.sw5e.chat-card .card-buttons button { - font-size: 12px; - height: 24px; - line-height: 20px; - margin: 2px 0; -} -.sw5e.chat-card .card-footer { - padding: 3px 0 0; - border-top: 2px groove #FFF; -} -.sw5e.chat-card .card-footer span { - border-right: 2px groove #FFF; - padding: 0 5px 0 0; - font-size: 10px; -} -.sw5e.chat-card .card-footer span:last-child { - border-right: none; - padding-right: 0; -} -.dice-roll .dice-total.success { - color: inherit; - background: #c7d0c0; - border: 1px solid #006c00; -} -.dice-roll .dice-total.failure { - color: inherit; - background: #ffdddd; - border: 1px solid #6e0000; -} -.dice-roll .dice-total.critical { - color: green; -} -.dice-roll .dice-total.fumble { - color: red; -} -/* ----------------------------------------- */ -/* Basic Structure */ -/* ----------------------------------------- */ -.sw5e.sheet.actor.character { - min-width: 680px; - min-height: 736px; - /* ----------------------------------------- */ - /* Sheet Header */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Sheet Body */ - /* ----------------------------------------- */ - /* ----------------------------------------- */ - /* Inventory */ - /* ----------------------------------------- */ - /* Encumbrance Bar */ - /* ----------------------------------------- */ - /* Item Controls */ - /* ----------------------------------------- */ -} -.sw5e.sheet.actor.character .sheet-header img.profile { - flex: 0 0 180px; - max-width: 180px; - height: 180px; -} -.sw5e.sheet.actor.character .sheet-header .charlevel { - flex: 0 0 180px; - padding: 0 5px 2px; -} -.sw5e.sheet.actor.character .sheet-header .charlevel .level { - height: 28px; -} -.sw5e.sheet.actor.character .sheet-header .charlevel .experience input[type="text"] { - width: 100px; -} -.sw5e.sheet.actor.character .sheet-header .charlevel .xpbar { - width: 100%; - flex: 0 0 8px; - background: #666; - border: 1px solid #000; - border-radius: 3px; -} -.sw5e.sheet.actor.character .sheet-header .charlevel .xpbar .bar { - height: 4px; - margin: 1px; - display: block; - background: #afebff; - border: 1px solid #000; - border-radius: 2px; -} -.sw5e.sheet.actor.character .sheet-header .summary { - border-bottom: 2px groove #eeede0; -} -.sw5e.sheet.actor.character .sheet-header .attributes { - height: 80px; - margin: 0; -} -.sw5e.sheet.actor.character .sheet-header .attributes .attribute { - height: 80px; - margin: 0; - border: none; - border-right: 2px groove #eeede0; - border-radius: 0; -} -.sw5e.sheet.actor.character .sheet-header .attributes .attribute:last-child { - border-right: none; -} -.sw5e.sheet.actor.character .sheet-header .attributes .attribute .attribute-value { - margin: 5px 0 0; - height: 32px; - line-height: 32px; -} -.sw5e.sheet.actor.character .sheet-header .attributes .attribute .attribute-name { - margin-top: 6px; -} -.sw5e.sheet.actor.character .sheet-header .attributes .attribute .attribute-footer { - margin-bottom: 2px; -} -.sw5e.sheet.actor.character .sheet-header .attributes a.rest { - border: 1px solid #b5b3a4; - border-radius: 2px; - background: rgba(0, 0, 0, 0.05); - padding: 1px 3px; - margin: 0 6px; -} -.sw5e.sheet.actor.character .sheet-header .attributes .hit-dice { - font-size: 16px; -} -.sw5e.sheet.actor.character .attributes .resource .attribute-name { - margin: 0 8px; -} -.sw5e.sheet.actor.character .attributes .resource .attribute-name input[type="text"] { - height: 20px; - margin: 2px 0 -2px; - line-height: 24px; -} -.sw5e.sheet.actor.character .attributes .resource label.checkbox { - margin: 0 3px; -} -.sw5e.sheet.actor.character .attributes .resource label.checkbox input[type="checkbox"] { - transform: scale(1.2); -} -.sw5e.sheet.actor.character .attributes .initiative .attribute-footer input { - width: 32px; -} -.sw5e.sheet.actor.character ul.skills-list { - flex: 0 0 212px; -} -.sw5e.sheet.actor.character ul.skills-list li.skill { - padding: 3px; -} -.sw5e.sheet.actor.character ul.skills-list li.skill h4 { - flex: 1px; - margin: 0; - font-size: 13px; -} -.sw5e.sheet.actor.character .counters .death-saves { - flex: 2; -} -.sw5e.sheet.actor.character .counters .death-saves .counter-value { - flex: 0 0 90px; -} -.sw5e.sheet.actor.character .item-detail.player-class { - flex: 0 0 180px; - text-align: right; - padding-right: 10px; -} -.sw5e.sheet.actor.character .encumbrance { - flex: 0 0 12px; - background: #7a7971; - margin: 1px 15px 0 1px; - border: 1px solid #191813; - border-radius: 3px; - position: relative; -} -.sw5e.sheet.actor.character .encumbrance .encumbrance-bar { - position: absolute; - top: 1px; - left: 1px; - background: #6c8aa5; - height: 8px; - border: 1px solid #cde4ff; - border-radius: 2px; -} -.sw5e.sheet.actor.character .encumbrance .encumbrance-label { - height: 10px; - padding: 0 5px; - position: absolute; - top: 0; - right: 0; - font-size: 13px; - line-height: 12px; - text-align: right; - color: #EEE; - text-shadow: 0 0 5px #000; -} -.sw5e.sheet.actor.character .encumbrance .encumbrance-breakpoint { - display: block; - position: absolute; -} -.sw5e.sheet.actor.character .encumbrance .encumbrance-breakpoint.encumbrance-33 { - left: 33%; -} -.sw5e.sheet.actor.character .encumbrance .encumbrance-breakpoint.encumbrance-66 { - left: 66%; -} -.sw5e.sheet.actor.character .encumbrance .arrow-up { - bottom: 0; - width: 0; - height: 0; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-bottom: 4px solid #666; -} -.sw5e.sheet.actor.character .encumbrance .arrow-down { - top: 0; - width: 0; - height: 0; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 4px solid #666; -} -.sw5e.sheet.actor.character .encumbrance.encumbered .arrow-up { - border-bottom: 4px solid #000; -} -.sw5e.sheet.actor.character .encumbrance.encumbered .arrow-down { - border-top: 4px solid #000; -} -.sw5e.sheet.actor.character .inventory .item-controls, -.sw5e.sheet.actor.character .powerbook .item-controls { - flex: 0 0 68px; -} -.sw5e.sheet.actor.character .inventory .item-controls .item-toggle, -.sw5e.sheet.actor.character .powerbook .item-controls .item-toggle { - color: #b5b3a4; -} -.sw5e.sheet.actor.character .inventory .item-controls .item-toggle.active, -.sw5e.sheet.actor.character .powerbook .item-controls .item-toggle.active { - color: #4b4a44; -} -.sw5e.sheet.actor.character .inventory .item-controls .item-toggle.fixed, -.sw5e.sheet.actor.character .powerbook .item-controls .item-toggle.fixed { - color: #44191A; -} -.sw5e.sheet.actor.character .inventory .item-controls .item-toggle.fixed:hover, -.sw5e.sheet.actor.character .powerbook .item-controls .item-toggle.fixed:hover { - text-shadow: none; -} -/* ----------------------------------------- */ -/* Basic Structure */ -/* ----------------------------------------- */ -.sw5e.sheet.actor.npc { - min-width: 600px; - min-height: 658px; -} diff --git a/sw5e.js.bak b/sw5e.js.bak deleted file mode 100644 index 903327f8..00000000 --- a/sw5e.js.bak +++ /dev/null @@ -1,206 +0,0 @@ -/** - * The Star Wars 5th Edition game system for Foundry Virtual Tabletop - * Author: Kakeman89 - * Software License: GNU GPLv3 - * Content License: https://media.wizards.com/2016/downloads/SW5ERD-OGL_V5.1.pdf - * Repository: https://gitlab.com/foundrynet/sw5e - * Issue Tracker: https://gitlab.com/foundrynet/sw5e/issues - */ - -// Import Modules -import { SW5E } from "./module/config.js"; -import { registerSystemSettings } from "./module/settings.js"; -import { preloadHandlebarsTemplates } from "./module/templates.js"; -import { _getInitiativeFormula } from "./module/combat.js"; -import { measureDistance, getBarAttribute } from "./module/canvas.js"; -import { Actor5e } from "./module/actor/entity.js"; -import { ActorSheet5eCharacter } from "./module/actor/sheets/character.js"; -import { Item5e } from "./module/item/entity.js"; -import { ItemSheet5e } from "./module/item/sheet.js"; -import { ActorSheet5eNPC } from "./module/actor/sheets/npc.js"; -import { Dice5e } from "./module/dice.js"; -import * as chat from "./module/chat.js"; -import * as migrations from "./module/migration.js"; - -/* -------------------------------------------- */ -/* Foundry VTT Initialization */ -/* -------------------------------------------- */ - -Hooks.once("init", function() { - console.log(`SW5e | Initializing Star Wars 5th Edition System\n${SW5E.ASCII}`); - - // Create a SW5E namespace within the game global - game.sw5e = { - Actor5e, - Dice5e, - Item5e, - migrations, - rollItemMacro - }; - - // Record Configuration Values - CONFIG.SW5E = SW5E; - CONFIG.Actor.entityClass = Actor5e; - CONFIG.Item.entityClass = Item5e; - - // Register System Settings - registerSystemSettings(); - - // Patch Core Functions - Combat.prototype._getInitiativeFormula = _getInitiativeFormula; - - // Register sheet application classes - Actors.unregisterSheet("core", ActorSheet); - Actors.registerSheet("sw5e", ActorSheet5eCharacter, { types: ["character"], makeDefault: true }); - Actors.registerSheet("sw5e", ActorSheet5eNPC, { types: ["npc"], makeDefault: true }); - Items.unregisterSheet("core", ItemSheet); - Items.registerSheet("sw5e", ItemSheet5e, {makeDefault: true}); - - // Preload Handlebars Templates - preloadHandlebarsTemplates(); -}); - - -/* -------------------------------------------- */ -/* Foundry VTT Setup */ -/* -------------------------------------------- */ - -/** - * This function runs after game data has been requested and loaded from the servers, so entities exist - */ -Hooks.once("setup", function() { - - // Localize CONFIG objects once up-front - const toLocalize = [ - "abilities", "alignments", "conditionTypes", "consumableTypes", "currencies", "damageTypes", "distanceUnits", "equipmentTypes", - "healingTypes", "itemActionTypes", "limitedUsePeriods", "senses", "skills", "powerComponents", "powerLevels", "powerPreparationModes", - "powerSchools", "powerScalingModes", "targetTypes", "timePeriods", "weaponProperties", "weaponTypes", "languages", "polymorphSettings", - "armorProficiencies", "weaponProficiencies", "toolProficiencies", "abilityActivationTypes", "actorSizes", "proficiencyLevels", "armorpropertiesTypes" - ]; - for ( let o of toLocalize ) { - CONFIG.SW5E[o] = Object.entries(CONFIG.SW5E[o]).reduce((obj, e) => { - obj[e[0]] = game.i18n.localize(e[1]); - return obj; - }, {}); - } -}); - -/* -------------------------------------------- */ - -/** - * Once the entire VTT framework is initialized, check to see if we should perform a data migration - */ -Hooks.once("ready", function() { - - // Determine whether a system migration is required and feasible - const currentVersion = game.settings.get("sw5e", "systemMigrationVersion"); - const NEEDS_MIGRATION_VERSION = 0.84; - const COMPATIBLE_MIGRATION_VERSION = 0.80; - let needMigration = (currentVersion < NEEDS_MIGRATION_VERSION) || (currentVersion === null); - const canMigrate = currentVersion >= COMPATIBLE_MIGRATION_VERSION; - - // Perform the migration - if ( needMigration && game.user.isGM ) { - if ( currentVersion && (currentVersion < COMPATIBLE_MIGRATION_VERSION) ) { - ui.notifications.error(`Your SW5E system data is from too old a Foundry version and cannot be reliably migrated to the latest version. The process will be attempted, but errors may occur.`, {permanent: true}); - } - migrations.migrateWorld(); - } - - // Wait to register hotbar drop hook on ready so that modules could register earlier if they want to - Hooks.on("hotbarDrop", (bar, data, slot) => create5eMacro(data, slot)); -}); - -/* -------------------------------------------- */ -/* Canvas Initialization */ -/* -------------------------------------------- */ - -Hooks.on("canvasInit", function() { - - // Extend Diagonal Measurement - canvas.grid.diagonalRule = game.settings.get("sw5e", "diagonalMovement"); - SquareGrid.prototype.measureDistance = measureDistance; - - // Extend Token Resource Bars - Token.prototype.getBarAttribute = getBarAttribute; -}); - - -/* -------------------------------------------- */ -/* Other Hooks */ -/* -------------------------------------------- */ - -Hooks.on("renderChatMessage", (app, html, data) => { - - // Display action buttons - chat.displayChatActionButtons(app, html, data); - - // Highlight critical success or failure die - chat.highlightCriticalSuccessFailure(app, html, data); - - // Optionally collapse the content - if (game.settings.get("sw5e", "autoCollapseItemCards")) html.find(".card-content").hide(); -}); -Hooks.on("getChatLogEntryContext", chat.addChatMessageContextOptions); -Hooks.on("renderChatLog", (app, html, data) => Item5e.chatListeners(html)); -Hooks.on('getActorDirectoryEntryContext', Actor5e.addDirectoryContextOptions); - -/* -------------------------------------------- */ -/* Hotbar Macros */ -/* -------------------------------------------- */ - -/** - * Create a Macro from an Item drop. - * Get an existing item macro if one exists, otherwise create a new one. - * @param {Object} data The dropped data - * @param {number} slot The hotbar slot to use - * @returns {Promise} - */ -async function create5eMacro(data, slot) { - if ( data.type !== "Item" ) return; - if (!( "data" in data ) ) return ui.notifications.warn("You can only create macro buttons for owned Items"); - const item = data.data; - - // Create the macro command - const command = `game.sw5e.rollItemMacro("${item.name}");`; - let macro = game.macros.entities.find(m => (m.name === item.name) && (m.command === command)); - if ( !macro ) { - macro = await Macro.create({ - name: item.name, - type: "script", - img: item.img, - command: command, - flags: {"sw5e.itemMacro": true} - }); - } - game.user.assignHotbarMacro(macro, slot); - return false; -} - -/* -------------------------------------------- */ - -/** - * Create a Macro from an Item drop. - * Get an existing item macro if one exists, otherwise create a new one. - * @param {string} itemName - * @return {Promise} - */ -function rollItemMacro(itemName) { - const speaker = ChatMessage.getSpeaker(); - let actor; - if ( speaker.token ) actor = game.actors.tokens[speaker.token]; - if ( !actor ) actor = game.actors.get(speaker.actor); - - // Get matching items - const items = actor ? actor.items.filter(i => i.name === itemName) : []; - if ( items.length > 1 ) { - ui.notifications.warn(`Your controlled Actor ${actor.name} has more than one Item with name ${itemName}. The first matched item will be chosen.`); - } else if ( items.length === 0 ) { - return ui.notifications.warn(`Your controlled Actor does not have an item named ${itemName}`); - } - const item = items[0]; - - // Trigger the item roll - if ( item.data.type === "power" ) return actor.usePower(item); - return item.roll(); -} diff --git a/template.json.bak b/template.json.bak deleted file mode 100644 index a8b4f38d..00000000 --- a/template.json.bak +++ /dev/null @@ -1,488 +0,0 @@ -{ - "Actor": { - "types": ["character", "npc"], - "templates": { - "common": { - "abilities": { - "str": { - "value": 10, - "proficient": 0 - }, - "dex": { - "value": 10, - "proficient": 0 - }, - "con": { - "value": 10, - "proficient": 0 - }, - "int": { - "value": 10, - "proficient": 0 - }, - "wis": { - "value": 10, - "proficient": 0 - }, - "cha": { - "value": 10, - "proficient": 0 - } - }, - "attributes": { - "ac": { - "min": 0 - }, - "hp": { - "value": 10, - "min": 0, - "max": 10, - "temp": 0, - "tempmax": 0 - }, - "init": { - "value": 0, - "bonus": 0 - }, - "speed": { - "value": "30 ft", - "special": "" - }, - "powercasting": "int" - }, - "details": { - "alignment": "", - "biography": { - "value": "", - "public": "" - }, - "race": "" - }, - "skills": { - "acr": { - "value": 0, - "ability": "dex" - }, - "ani": { - "value": 0, - "ability": "wis" - }, - "ath": { - "value": 0, - "ability": "str" - }, - "dec": { - "value": 0, - "ability": "cha" - }, - "ins": { - "value": 0, - "ability": "wis" - }, - "itm": { - "value": 0, - "ability": "cha" - }, - "inv": { - "value": 0, - "ability": "int" - }, - "lor": { - "value": 0, - "ability": "int" - }, - "med": { - "value": 0, - "ability": "wis" - }, - "nat": { - "value": 0, - "ability": "int" - }, - "pil": { - "value": 0, - "ability": "int" - }, - "prc": { - "value": 0, - "ability": "wis" - }, - "prf": { - "value": 0, - "ability": "cha" - }, - "per": { - "value": 0, - "ability": "cha" - }, - "slt": { - "value": 0, - "ability": "dex" - }, - "ste": { - "value": 0, - "ability": "dex" - }, - "sur": { - "value": 0, - "ability": "wis" - }, - "tec": { - "value": 0, - "ability": "int" - } - }, - "traits": { - "size": "med", - "senses": "", - "languages": { - "value": [], - "custom": "" - }, - "di": { - "value": [], - "custom": "" - }, - "dr": { - "value": [], - "custom": "" - }, - "dv": { - "value": [], - "custom": "" - }, - "ci": { - "value": [], - "custom": "" - } - }, - "currency": { - "gc": 0 - }, - "powers": { - "power1": { - "value": 0, - "max": 0, - "override": null - }, - "power2": { - "value": 0, - "max": 0, - "override": null - }, - "power3": { - "value": 0, - "max": 0, - "override": null - }, - "power4": { - "value": 0, - "max": 0, - "override": null - }, - "power5": { - "value": 0, - "max": 0, - "override": null - }, - "power6": { - "value": 0, - "max": 0, - "override": null - }, - "power7": { - "value": 0, - "max": 0, - "override": null - }, - "power8": { - "value": 0, - "max": 0, - "override": null - }, - "power9": { - "value": 0, - "max": 0, - "override": null - }, - "pact": { - "value": 0, - "max": 0, - "override": null - } - }, - "bonuses": { - "mwak": { - "attack": "", - "damage": "" - }, - "rwak": { - "attack": "", - "damage": "" - }, - "mpak": { - "attack": "", - "damage": "" - }, - "rpak": { - "attack": "", - "damage": "" - }, - "abilities": { - "check": "", - "save": "", - "skill": "" - }, - "power": { - "dc": "" - } - } - } - }, - "character": { - "templates": ["common"], - "attributes": { - "death": { - "success": 0, - "failure": 0 - }, - "exhaustion": 0, - "inspiration": 0 - }, - "details": { - "background": "", - "xp": { - "value": 0, - "min": 0, - "max": 300 - }, - "trait": "", - "ideal": "", - "bond": "", - "flaw": "" - }, - "resources": { - "primary": { - "value": 0, - "max": 0, - "sr": 0, - "lr": 0 - }, - "secondary": { - "value": 0, - "max": 0, - "sr": 0, - "lr": 0 - }, - "tertiary": { - "value": 0, - "max": 0, - "sr": 0, - "lr": 0 - } - }, - "traits": { - "weaponProf": { - "value": [], - "custom": "" - }, - "armorProf": { - "value": [], - "custom": "" - }, - "toolProf": { - "value": [], - "custom": "" - } - } - }, - "npc": { - "templates": ["common"], - "details": { - "type": "", - "environment": "", - "cr": 1, - "powerLevel": 0, - "xp": { - "value": 10 - }, - "source": "" - }, - "resources": { - "legact": { - "value": 0, - "max": 0 - }, - "legres": { - "value": 0, - "max": 0 - }, - "lair": { - "value": 0, - "initiative": 0 - } - } - } - }, - "Item": { - "types": ["weapon", "equipment", "consumable", "tool", "loot", "class", "power", "feat", "backpack"], - "templates": { - "itemDescription": { - "description": { - "value": "", - "chat": "", - "unidentified": "" - }, - "source": "" - }, - "physicalItem": { - "quantity": 1, - "weight": 0, - "price": 0, - "attuned": false, - "equipped": false, - "rarity": "", - "identified": true - }, - "activatedEffect": { - "activation": { - "type": "", - "cost": 0, - "condition": "" - }, - "duration": { - "value": null, - "units": "" - }, - "target": { - "value": null, - "units": "", - "type": "" - }, - "range": { - "value": null, - "long": null, - "units": "" - }, - "uses": { - "value": 0, - "max": 0, - "per": null - } - }, - "action": { - "ability": null, - "actionType": null, - "attackBonus": 0, - "chatFlavor": "", - "critical": null, - "damage": { - "parts": [], - "versatile": "" - }, - "formula": "", - "save": { - "ability": "", - "dc": null, - "scaling": "power" - } - } - }, - "backpack": { - "templates": ["itemDescription", "physicalItem"], - "capacity": { - "type": "weight", - "value": 0, - "weightless": false - }, - "currency": { - "gc": 0 - } - }, - "class": { - "templates": ["itemDescription"], - "levels": 1, - "subclass": "", - "hitDice": "d6", - "hitDiceUsed": 0, - "skills": { - "number": 2, - "choices": [], - "value": [] - }, - "powercasting": "none" - }, - "consumable": { - "templates": ["itemDescription", "physicalItem", "activatedEffect", "action"], - "consumableType": "potion", - "uses": { - "value": 0, - "max": 0, - "per": null, - "autoUse": true, - "autoDestroy": true - } - }, - "equipment": { - "templates": ["itemDescription", "physicalItem", "activatedEffect", "action"], - "armor": { - "type": "light", - "value": 10, - "dex": null - }, - "strength": 0, - "stealth": false, - "proficient": true - }, - "feat": { - "templates": ["itemDescription", "activatedEffect", "action"], - "requirements": "", - "recharge": { - "value": null, - "charged": false - } - }, - "loot": { - "templates": ["itemDescription", "physicalItem"] - }, - "tool": { - "templates": ["itemDescription", "physicalItem"], - "ability": "int", - "chatFlavor": "", - "proficient": 0 - }, - "power": { - "templates": ["itemDescription", "activatedEffect", "action"], - "level": 1, - "school": "", - "components": { - "value": "", - "vocal": false, - "somatic": false, - "material": false, - "ritual": false, - "concentration": false - }, - "materials": { - "value": "", - "consumed": false, - "cost": 0, - "supply": 0 - }, - "preparation": { - "mode": null, - "prepared": false - }, - "scaling": { - "mode": null, - "formula": null - } - }, - "weapon": { - "templates": ["itemDescription", "physicalItem" ,"activatedEffect", "action"], - "weaponType": "simpleM", - "properties": {}, - "proficient": true - } - } -} diff --git a/templates/actors/parts/actor-castbook.html b/templates/actors/parts/actor-castbook.html deleted file mode 100644 index 41c80f47..00000000 --- a/templates/actors/parts/actor-castbook.html +++ /dev/null @@ -1,123 +0,0 @@ -
-
-

{{localize "SW5E.CastAbility"}}

- - {{#if isNPC}} -

{{localize "SW5E.CasterLevel"}}

- - {{/if}} -

{{localize "SW5E.CastDC"}} {{data.attributes.castdc}}

-
- -
    -
  • {{localize "SW5E.Filter"}}
  • -
  • {{localize "SW5E.Action"}}
  • -
  • {{localize "SW5E.BonusAction"}}
  • -
  • {{localize "SW5E.Reaction"}}
  • -
  • {{localize "SW5E.AbbreviationConc"}}
  • -
  • {{localize "SW5E.Ritual"}}
  • -
  • {{localize "SW5E.Prepared"}}{{#if preparedCasts}} ({{preparedCasts}}){{/if}}
  • -
-
- -
    -{{#each castbook as |section|}} -
  1. -
    -

    {{section.label}}

    -
    - -
    - {{#if section.usesSlots}} - - / - - {{{section.slots}}} - {{#if ../editable}} - - - - {{/if}} - {{ else }} - {{{section.uses}}} - / - {{{section.slots}}} - {{/if}} -
    - -
    {{localize "SW5E.CastSchool"}}
    -
    {{localize "SW5E.CastUsage"}}
    -
    {{localize "SW5E.CastTarget"}}
    - -
    - {{#if section.canCreate}} - - {{localize "SW5E.Add"}} - - {{/if}} -
    -
  2. - -
      - {{#each section.casts as |item i|}} -
    1. -
      -
      -

      {{item.name}}

      - {{#if item.data.uses.value }} -
      Uses {{item.data.uses.value}} / {{item.data.uses.max}}
      - {{/if}} -
      - -
      - {{#each labels.components}} - {{this}} - {{/each}} -
      -
      {{labels.school}}
      -
      {{labels.activation}}
      -
      - {{#if labels.target}} - {{labels.target}} - {{else}}None - {{/if}} -
      - - - {{#if ../../owner}} -
      - {{#if section.canPrepare}} - - {{/if}} - - -
      - {{/if}} -
    2. - {{/each}} -
    -{{else}} - {{#if owner}} - {{#if filters.castbook.size}} -
  3. {{localize "SW5E.FilterNoCasts"}}

  4. - {{else}} -
  5. - -
  6. -
  7. {{localize "SW5E.NoCastLevels"}}

  8. - {{/if}} - {{/if}} -{{/each}} -
diff --git a/templates/items/species.html.bak b/templates/items/species.html.bak deleted file mode 100644 index d3439d18..00000000 --- a/templates/items/species.html.bak +++ /dev/null @@ -1,120 +0,0 @@ -
- - {{!-- Item Sheet Header --}} -
- - -
-

- -

- -
-

{{itemType}}

- {{itemStatus}} -
- -
    -
  • - -
  • -
-
-
- - {{!-- Item Sheet Navigation --}} - - - {{!-- Item Sheet Body --}} -
- - {{!-- Description Tab --}} - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VISUAL CHARACTERISTICS
Skin Color  
Hair Color  
Eye Color  
Distinctions 
PHYSICAL CHARACTERISTICS
Height 
Weight 
SOCIOCULTURAL CHARACTERISTICS
Homeworld 
Language 
-
-

- - {{editor content=data.description.value target="data.description.value" fontsize=12px button=true editable=editable}} -

-
-
- - {{!-- Traits Tab --}} - -
-

{{item.name}} Traits

-

As a/an {{item.name}}, you have the following special traits.
-

    - {{#each data.traits as | d t |}} -
  • {{t}}. {{{desc}}}
  • - {{/each}} -
-
-
- -
- - -
diff --git a/ui/parchment.jpg b/ui/parchment.jpg deleted file mode 100644 index 432c794acb3fe94dedea920ff230c07c1e2381fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37349 zcmeHQ30PCtwmv5l5W*Y~ENXy&%w!;tARtqaAZP>xr7DKx08vOV34&JJI)D|u4iTwh zZ3S^|wQ3z}wTjkxz}b%AY_%5aP^-4Qbxsh1dV9@%-tXP-edpM-v-VnRuf6ua*B+97 zd((cgy%q76R;UXQBt0DoL=eOpK~ZOf3KR{>q1X6BoZy)c(Jb5y)8Mwh_Fo&~8ec>Fq$VH*gUIN6~~&Pn@C-hs4w# zJd02|Uc?#ELmMzeiKrpfBY8+ZqJZ33q!7^|TBHooASzJqhy}cC=VQj}wAU%b2{VOG zeuvX|UQmAQ^>49daVi&=;$fm_EBWO%Fn}TRn6_25e_|t%!^)$;`G@p-x*?+Kt7~>ePj5 z4W=n8fif&Cj+BF`@hQ*QP|`|;6)4Jz4M5tA$8?5QsAoTCcUQN~FHF=HYjtMeI+^Sz z4CoX<5oC~7gJW%D(3TD^Gw3n%z+o0cAicz8K^e3&vXrl_5*t)0D{qrJT&+uq)ujVJbOQxT`vG0^@s;$#g?T1G{^5sDK^bwb;J zfYHlr-;eeOFX<@pfW!Dhg~rk73@d9JrY$TH-GwMZp*|NnA}9@|QfL&q6~mfNWeGv( zM5TE-^Xc(J6fWN5rU)49`SlwUe7LR|d-H|ix~a{HR=&o}w$^(}y~wR$(=@-N1z9TT zzU7999;b(1#(vv8z3EKZmHWwkYZ@!RSh)Y})dwrK95{FFVRpgzs@j!Xzd3*XQRIM} z!txm(uG)6+!j0dZ5DEpnr4c?^G3X+~1uwoc4LlgO*qhPZCgkR~>ZTeK zGhLPX@O!=t+yN^;(Z18*#PS|0>CgxRcDd7qf9^rwE*ILrMOaj#PA8;4a+|V9&Qzog zqjFZVDT~sBnmCQ@gn4N}`)+ZKHW@OmvBoIluHYJF0r?GC)iaYg8w2TStJ!UzZw&NJ zSzXie`JVPuZ@@f@rpX14i^=r>FJ$S zy%LR*lCW2m)EhFeE+=1EQjagYVHucSTc%TDpx)&txDgF-r>93HX_aLqn8qMWiY+Ts ztD=%3BoPV8;&359Q6!D$^Cf~rNrIFwh?K?)dD6uAXuO-cm+NX*hfSGAZ%}BISf|a% z*RyF>?j@T^m`*(&Qzh%PB?PFY3Y{Lq8yMsLyoH^;U;;UsfGA4+qBEj@<;+Xvx}3pr zGl^9%;`W+m&B}F|?F6-}kwjSH)rH|9WEN7Lf*1I&5o&)QXy)+Y9T}CV!(exu1aGW> zC*XzfB18DXEWR*GB#aV9gz&Ds{nx*Rf%y`JxRNyDEi2@mf~Q zbziVUvS06mW9X8kM$OZ`Py^fw~xr)n^Py;K-zj z5qwERM2H}iZ(fO+-kXNTpf30)(=IM~84#Qs1>ZZNV-@&{5DSjJ#503}kPXA9wBj;C zUjU1aM8XT>^Wfk^M#L1i4#fCVmy_ApO6wd5)sgm0-PTS(FQ5RWH?^}Ht`fMD-q*mC1PAhBF1%K z2ofouNO5Zt!kR>a*C-)uN^nmE5P`uEx4{tW!4bic!Qx;^FhIlS2lEBNd|@y@JQ(5_ zl=zXs5cC4jg`of=0S1W(#tVcyj0_0)e!L`Jq#y}GgfB=Cfn8~mn8!;JM2eE6QbAI@ zw4*b-_1ND=xheKxp9{O?u+HtW*<5SdIsHe{t~mRTm^T?EE3pV%5-t)hix99#nT#$H zE{hPbNSTZ-5-y7nut=GVE)p(_5U@y@j4l!`ix99#nT#$HE{hPbNSTZ-5-y7nut=GV zE)p(_5U@y@j4l!`ix99#nT#$HE{hPbNSTZ-5-y7nut=GVE)p(_5U@y@j4l!`ix99# znT#$HE{hPbNSTZ-5-y7nut=GVE)p(_5U@y@j4l!`ix99#nT#$HE{hPbNSTZ-5-y7n zut@oDql?*f02R}~snc>eUfO<{H4Kgw<;gP!C(F{L#93KZN}5`urNDg|B^rYcKaezR zcrM541l*Tl16O&#%@_)$zBD~E8Nbv4fx}81{L~UocRX<3_R)FMbq{AkQsf-YbHQtV zIw?zaa4iEW2YsOmj-3KM9q8h6Ln+S3uQ_1nkHu*Ue!&4-2Mz-5j?;xE8o$+moo}M! za9UNOQGpKbbE&FCh12_i{$P9=ep3cD4d|-zYOEaSvp{o;%SzNhqr`OXFV%J1-P*Jjq6=zZ^qoF184D z#K#~(JNqroCL7MjBS=o48>YAi8stRUEuqYXEJd#-?vX(fGqO0!GTnHS3Jw3DBTP7V z&qh3u-iQz4kA%SK`ADQ65{F2URAexcg$zeV!IeKnNC{l|Q;tkRrXW?wEMy+C5UE2x zK^l=Y$a-WGvJKgV>_xsojv}X!bI5l{3vvy)jkF<;kf(65hZSmvx}Y9tAJi8OLItQ8 zjYXws8k&I)M@OTDs0J-VC!y2OS*Q`ML+jBs=tgu0x)(i+Hlvr&R`eG78~TJorLZV$ zN-v5ZC5$4b#8U=RvM3`dg_LoWiInM-Ig~||2FjZtEhtEsir2I_k1PU=DG8EOml4)qTjgXTix&_ZbaXeqRzG$m~u z?OobzS{-dQZ7Xd*?F_Az)<*k_Zb$c|2hpSGGWsxjA-$YlMX#l=q;H`gpr4~(qd#IW z7;cQdj7UZbV>n|B;~mCq#!|)x#@CEy#udgxD=RAxt01cwtHD+ZD}z;))ncnpt@c=* zwz_8Z*xJ^*kF~%$**e!+V?EWn)_Se=ZtK(5H>{u9INJEyMA;0sQQ1tenQPN%v(x6J z%{7~+OebbvW(+fnIfglfxrn)*d4Tyn^S-UEt+%bjc8IOo_I=w$wx8P`vTe2fgXPQ$ zWF@jju*z6-SgTlHvo5jj+u7Oq*~QuA+8ONT*sZZ^vis5QvAv6ZsJ+ZyW&fW268o+8 zr|s`L*f{t)#5;^~nCMXJu-W0H!yQK(M?c3zM}_0Nj!PVOI9_mk=;Y$WcN*+e;xyZ7 ztHzHAwL40{&)GxiB~ zo2#>HxNEj+h3gX6uUuQ)sBV64GPh#4xo(@>&bvM7(W^&%53I+`9_xFY?(w_(Tkdi0 zn0vMR2KRIBPdqptQjf77^F6kC{LquuGqC57p5;A1?s=f+owwL;^?OVCR`pw(-ul*) z;u+|f;rWi|a?fL)4}10QHK12%uf@HZdfn;m);q5EnBFzLclW;4$E8nfA9bIaK70E7 z%yH$!bBZ~OIQuzmUY=elUS(eOUMIYsdiV7n>OIwagZB?UOdqjNflrOkKA$#jA8tB# z5_cWM3_9Sr-6C*l?J8hPLGo%yN!sr;S%-vogIrC^ERtk6!FEPPM6U3f1% zC>#s_IQ*i>MU*a@A=)SUGa@oV7qLF#RwOrabmT{o7sPC_Ts&KRNJ5t+NZym|lKc@B z5oL(l6!mMrkbYzPt?hR+x^FZV-57l(#ydt4Qy!d#>dnXqruS;$l zAR6$_fUi^NDFajHr(BTrk|||tWNoRDsgqOp4`dC@99TE-a#~=TE^TKzB|SBLLHhTD zd7k`8fHPLl{HkLzWD=p25$UlyNZAB{MH`ZRVq_gsiz)-wpL2 zS~hfFwnO%a>^0fH=OpDAb6SRl4Vygd=vTIFWvuFQS-w)E|VZ(kcB8c{Xk z{K&o|D@Gn3)pJzwsIT%I@)UWSN7F~=j9xqXnPRY_LGdtOmj6+Hn=(=Pq4KsWPF172 zg~eb->_$OMfwACbVNBtI!dpfCi)xGRs1wz7>U(2S#(Xm7_pyV=t{U53oKw7^#JXg3 z$qtRPW~^qvwzsxI+gut{T2U%%Cgq+vE!GF ze_WnjzPZAwLQ`>ULg0j%6K+gQp19&2+B?d3_D%AdG-Xojfjq znZlWiXZ}^Ksy;G{H>-Bmv)RhoNB+V8$D)6<&ncL5Vs6CTkLNMwY37}u-+%sUqmyx> z@ydeq1zT%4HPtl_7UnHHTpM2d$%o7j%RX#bl(uO5V(#L3i=WjM)ty_Cuw=tWo*&Kp z==Y_nrKdlR`*{5)y*`=s$&+R3Wf$uQ)NgI@Yp7k$SU!IF^~UVRgDb=<)~xKga@NW} zS7}zYtj<`ye@*0?HETWB&Rs`YSGMlfrz1W+^;yzq+t-JzuixOdVbm z%%NR}qYm#lB0jS1XvER2$3(}r92Xtmaw6iy){~JZx1W-n+Swf4y!&+j(|gY(o%!ah z?CjBVgU&UdAA0`cg%KB8E~+lxyi|PY-nZkwefr(|-_yUZ{=xBw+8;fCZ1^eQrwuI; zEnl@JwH~{idHK65$}6|8>aRY#HvPKY_1YVKZmhW}xVh_A@~u-pzy0&I+oiXk-l_V< z>6ef0`rrNH*SKGgwGC^#c29S&{kPfoJ?^i15dL7_L;1rWAC)|M`g`?bkH@S35dU%T zNzRiSPs^WKJzMl=z@Iz+8u-`u?Im#i;9bP4GrVw$Yl5`1dqv4BBg->(^Q)o zmx@qOD@PD@SLRbtYFs>ieHVCSW(6HLrA^_uH*QGtMrXW)xe!Gh$4%kz;^d}Vw@|oj z%n53G;Bk9*gfYv7yD(vOM0}vkm}<;&Zd}Mc>=(bbQl4ha>Umc^^ra{J?Y%W=jhK)B z(xfAW@j|DX*^MfffL=*Qk~0J|&(2nC>_*IGjmN;Hmu27%7`Q}R1Eyti zaC8B8F=MT3yg()&yJN*mP7WQeWegF_ubJIY<`S@!b_{%*KQFBjG9D>M`eq0|?6=GpZ&me z&7ejsw0x#7xRVt)P37FUn7hUo5Czk!o~wt_4*SNhzrOHgFR@)79k`{fG`R4=x8!)i z{Ie!_Q;v-I)j1X1Sv{0-$X6ziWu#8cGJ@$tBKcYyW9qb##{*yX@@R#?gxl)HX*d1y zaSWznKC4ae&ac_=BX=RVBVTJbFV(0rHZG*C!A;K_Q;)|1^+*^`+OLA{%zBJ-A`IU$K z%0qq=C%=i4-^9rui2lF-Km^}{N6nO`)h@S0d$V|A{21v}$Rsv+at%DS5yMi|?g zY`6z;6?esSz(ZzS0c@ ziwk<=DhjAw8WMiGIzYW5Dqzf+bVJU1Sp`^B;wmht-G9Z(x*?#lN*a=@USIw2a2Qxj z!&MYeyD$5TGpV3bb92SIbW!uD9lm&b=Heu#MscYoAZhB4>Xjl`EnH-FB-IoSc+gR>7X-TLo| z$sN0DV9xQ051ZFze`bIsFm2efX}u-G8W;2yvi*ns_3WW~{nC&;(d`S#pXF{j11mc} ze=4iuT0ShG$K>_Or}xjT+-cY{>B5GQJ-3XxfUn-93nU6;ERZ9DoEOO1kz6DG%U4Qb z=YaqHL}Z4&%s1hBYwL7>dFx@Wzx>aUwpm{^{FHDmB;eAiEdx`>KXC;9>Ji^Z^D3F1 z5^g24&${|CwKZ?w%w4gfUzFP#^`M^;fWOdo$&4z;`otOBdG(184Ivq)XH5o6s|s;T z-`xbhv0h)=wvX*!dezAGe|LT5+T0;p+|nJw(qwDkXN78dyC+oIdm0le9nRs^hdcmF zOPAu7wDrJGtvue;WG%06GN#DupX`L{rMtmW=4RZ|FAuz$j57I-?G*|pTdb2Y+5K~% zdjD-iLvWv#?w$_(z#fqfEUyG;IwU{i)w?~x8*&1-wCxlL2?+@qCFH;%=Mr*yC0CsP zqea;Ce;+7}{>akzf*-k8MEy1V4zI23+2)IimfL?6e%`eA!fz)PGp230_HmPgRo>B< zs^0c{YTsc+_afEb2r`kTUzhM6@b>nZ>odFT=_t+Jw$t9>Kd#L8_7?vpKA5-V`rTjc zynWJtE+AD%T*zP`2g$!RGnl@OqA=5}47!uR4r>a}$)8%y_GsAcv0Ja4f3SANoB@+0 zY~~Z8G&ZCr=;ldfmHf_zhN?{0M_$Yxt#v^g3PE+KGVx9Q6vl|cnI>UQPUUJc@1Dh%*d)z5K z(re)Z`H}qH`@IsL38mxx{p;iFf?Ai{h>&tbFJDU7J^PUuvp@30 zALHlcJJ!GJ(eNdkEnjxrwe9%*C7yGlw*>3@wH{iQ(_9yDued%h`5jNe3~Vx6uxP_Z zYxy2l^T=wZzr3LOals$Q=M3nbTPx|+c2yp9^EmtQR{4hIF>^c;H|?(WNXxl6-9N9Y zX#D{?+g~W1B%E~ppwHZpfu3_7>-=3G6jV=o+drrI