diff --git a/lang/de.json b/lang/de.json
index 54edeaf..c6cc2eb 100644
--- a/lang/de.json
+++ b/lang/de.json
@@ -12,375 +12,442 @@
"TYPES.Item.effect": "Aktiver Effekt",
"TYPES.Item.kampfkunst": "Kampfkunst",
"TYPES.Item.container": "Aufbewahrung",
+ "TYPES.Item.class": "Klasse",
- "midgard5.phase-action": "Handlungsphase",
- "midgard5.phase-movement": "Bewegungsphase",
- "midgard5.no-encounter": "Kein Kampf",
- "midgard5.encounter-not-started": "Kein aktiver Kampf",
- "midgard5.initiative": "Handlungsrang",
+ "midgard5": {
+ "phase-action": "Handlungsphase",
+ "phase-movement": "Bewegungsphase",
+ "no-encounter": "Kein Kampf",
+ "encounter-not-started": "Kein aktiver Kampf",
+ "initiative": "Initiative",
+ "actionrank": "Handlungsrang",
- "midgard5.combat-join": "Kampf Beitreten/Handlungsrang zurücksetzen",
- "midgard5.combat-ranged": "Fernangriff",
- "midgard5.combat-spell": "Zaubern (10 Sec)",
+ "combat-join": "Kampf Beitreten/Handlungsrang zurücksetzen",
+ "combat-ranged": "Fernangriff",
+ "combat-spell": "Zaubern (10 Sec)",
- "midgard5.time-duration": "Dauer",
- "midgard5.time-round": "Runde(n)",
- "midgard5.time-minute": "Minute(n)",
- "midgard5.time-hour": "Stunde(n)",
- "midgard5.time-limitless": "Unbegrenzt",
+ "time-duration": "Dauer",
+ "time-round": "Runde(n)",
+ "time-minute": "Minute(n)",
+ "time-hour": "Stunde(n)",
+ "time-limitless": "Unbegrenzt",
- "midgard5.doRoll": "Würfeln",
- "midgard5.learn": "Lernen",
+ "doRoll": "Würfeln",
+ "learn": "Lernen",
- "midgard5.label": "Bezeichnung",
- "midgard5.description": "Beschreibung",
- "midgard5.Characteristic": "Merkmal",
- "midgard5.characteristics": "Merkmale",
- "midgard5.background": "Hintergrund",
- "midgard5.attribute": "Eigenschaft",
- "midgard5.attributes": "Eigenschaften",
- "midgard5.points": "Punkte",
- "midgard5.calculated-value": "Berechneter Wert",
- "midgard5.calculated-values": "Sonstige Werte",
+ "label": "Bezeichnung",
+ "description": "Beschreibung",
+ "Characteristic": "Merkmal",
+ "characteristics": "Merkmale",
+ "background": "Hintergrund",
+ "attribute": "Eigenschaft",
+ "attributes": "Eigenschaften",
+ "points": "Punkte",
+ "calculated-value": "Berechneter Wert",
+ "calculated-values": "Werte und Boni",
- "midgard5.skill": "Fertigkeit",
- "midgard5.skill-value": "Fertigkeitswert",
- "midgard5.fw": "FW",
- "midgard5.bonus": "Bonus",
- "midgard5.bonuses": "Boni",
- "midgard5.ew": "EW",
- "midgard5.pp-short": "PP",
- "midgard5.pp": "Praxispunkte",
+ "skill": "Fertigkeit",
+ "skill-value": "Fertigkeitswert",
+ "fw": "FW",
+ "bonus": "Bonus",
+ "bonuses": "Boni",
+ "ew": "EW",
+ "pp-short": "PP",
+ "pp": "Praxispunkte",
- "midgard5.item-value": "Wert",
- "midgard5.item-quantity": "Menge",
- "midgard5.item-onbody": "Am Körper",
- "midgard5.item-ismagic": "Ist Magisch",
- "midgard5.item-wealth": "Vermögenswert",
- "midgard5.item-weight": "Gewicht",
+ "item-value": "Wert",
+ "item-quantity": "Menge",
+ "item-onbody": "Am Körper",
+ "item-ismagic": "Ist Magisch",
+ "item-wealth": "Vermögenswert",
+ "item-weight": "Gewicht",
- "midgard5.actor-lp": "Lebenspunkte",
- "midgard5.actor-lp-short": "LP",
- "midgard5.actor-ap": "Ausdauerpunkte",
- "midgard5.actor-ap-short": "AP",
- "midgard5.actor-st": "St",
- "midgard5.actor-st-long": "Stärke",
- "midgard5.actor-ko": "Ko",
- "midgard5.actor-ko-long": "Konstitution",
- "midgard5.actor-au": "Au",
- "midgard5.actor-au-long": "Aussehen",
- "midgard5.actor-gs": "Gs",
- "midgard5.actor-gs-long": "Geschicklichkeit",
- "midgard5.actor-in": "In",
- "midgard5.actor-in-long": "Intelligenz",
- "midgard5.actor-pa": "pA",
- "midgard5.actor-pa-long": "persönliche Ausstrahlung",
- "midgard5.actor-gw": "Gw",
- "midgard5.actor-gw-long": "Gewandtheit",
- "midgard5.actor-zt": "Zt",
- "midgard5.actor-zt-long": "Zaubertalent",
- "midgard5.actor-wk": "Wk",
- "midgard5.actor-wk-long": "Willenskraft",
- "midgard5.actor-git": "GiT",
- "midgard5.actor-git-long": "Gifttolleranz",
+ "actor-lp": "Lebenspunkte",
+ "actor-lp-short": "LP",
+ "actor-ap": "Ausdauerpunkte",
+ "actor-ap-short": "AP",
+ "actor-st": "St",
+ "actor-st-long": "Stärke",
+ "actor-ko": "Ko",
+ "actor-ko-long": "Konstitution",
+ "actor-au": "Au",
+ "actor-au-long": "Aussehen",
+ "actor-gs": "Gs",
+ "actor-gs-long": "Geschicklichkeit",
+ "actor-in": "In",
+ "actor-in-long": "Intelligenz",
+ "actor-pa": "pA",
+ "actor-pa-long": "persönliche Ausstrahlung",
+ "actor-gw": "Gw",
+ "actor-gw-long": "Gewandtheit",
+ "actor-zt": "Zt",
+ "actor-zt-long": "Zaubertalent",
+ "actor-wk": "Wk",
+ "actor-wk-long": "Willenskraft",
+ "actor-git": "GiT",
+ "actor-git-long": "Gifttolleranz",
- "midgard5.aktuell": "Akt.",
- "midgard5.maximum": "Max.",
- "midgard5.attrvalue": "Wert",
- "midgard5.movementRange": "Bewegungsweite",
+ "aktuell": "Akt.",
+ "maximum": "Max.",
+ "attrvalue": "Wert",
+ "movementRange": "Bewegungsweite",
- "midgard5.base_values": "Grundwerte",
- "midgard5.skills": "Fertigkeiten",
- "midgard5.gear": "Ausrüstung",
- "midgard5.spells": "Zauber",
- "midgard5.effects": "Aktive Effekte",
- "midgard5.kampfkuenste": "Kampfkünste",
- "midgard5.combat": "Kampf",
+ "base_values": "Grundwerte",
+ "skills": "Fertigkeiten",
+ "gear": "Ausrüstung",
+ "spells": "Zauber",
+ "effects": "Aktive Effekte",
+ "kampfkuenste": "Kampfkünste",
+ "combat": "Kampf",
- "midgard5.actor-name": "Figur",
- "midgard5.level": "Grad",
- "midgard5.class": "Typ",
- "midgard5.race": "Rasse",
- "midgard5.magicUsing": "Zauberkundig",
- "midgard5.gender": "Geschlecht",
- "midgard5.weight": "Gewicht",
- "midgard5.height": "Größe",
- "midgard5.shape": "Gestalt",
- "midgard5.age": "Alter",
- "midgard5.caste": "Stand",
- "midgard5.occupation": "Beruf",
- "midgard5.origin": "Heimat",
- "midgard5.faith": "Glaube",
+ "actor-name": "Figur",
+ "level": "Grad",
+ "class": "Typ",
+ "race": "Rasse",
+ "magicUsing": "Zauberkundig",
+ "gender": "Geschlecht",
+ "weight": "Gewicht",
+ "height": "Größe",
+ "shape": "Gestalt",
+ "age": "Alter",
+ "caste": "Stand",
+ "occupation": "Beruf",
+ "origin": "Heimat",
+ "faith": "Glaube",
- "midgard5.currency": "Geld",
- "midgard5.currency-gold": "Gold",
- "midgard5.currency-silver": "Silber",
- "midgard5.currency-copper": "Kupfer",
- "midgard5.currency-wealth": "Vermögen in GS",
- "midgard5.currency-available": "verfügbares Vermögen",
- "midgard5.hoard": "aktueller Hort",
- "midgard5.hoardMin": "benötigter Mindesthort",
- "midgard5.hoard-next": "Hort für nächsten Grad",
- "midgard5.hoarded": "Hort",
+ "currency": "Geld",
+ "currency-gold": "Gold",
+ "currency-silver": "Silber",
+ "currency-copper": "Kupfer",
+ "currency-wealth": "Vermögen in GS",
+ "currency-available": "verfügbares Vermögen",
+ "hoard": "aktueller Hort",
+ "hoardMin": "benötigter Mindesthort",
+ "hoard-next": "Hort für nächsten Grad",
+ "hoarded": "Hort",
- "midgard5.no-container": "Ohne",
+ "no-container": "Ohne",
- "midgard5.encumbrance": "Getragene Last",
- "midgard5.load": "Normallast",
- "midgard5.heavy-load": "Schwere Last",
- "midgard5.thrust-load": "Schublast",
- "midgard5.load-max": "Höchstlast",
- "midgard5.load-capacity": "Tragkraft",
+ "encumbrance": "Getragene Last",
+ "load": "Normallast",
+ "heavy-load": "Schwere Last",
+ "thrust-load": "Schublast",
+ "load-max": "Höchstlast",
+ "load-capacity": "Tragkraft",
- "midgard5.exp-overall": "Erfahrungsschatz",
- "midgard5.exp-available": "Erfahrungspunkte",
- "midgard5.grace": "Göttliche Gnade",
- "midgard5.destiny": "Schicksalsgunst",
- "midgard5.luckPoints": "Glückspunkte",
+ "exp-overall": "Erfahrungsschatz",
+ "exp-available": "Erfahrungspunkte",
+ "grace": "Göttliche Gnade",
+ "destiny": "Schicksalsgunst",
+ "luckPoints": "Glückspunkte",
- "midgard5.abrichten": "Abrichten",
- "midgard5.akrobatik": "Akrobatik",
- "midgard5.alchimie": "Alchimie",
- "midgard5.anfuehren": "Anführen",
- "midgard5.askese": "Askese",
- "midgard5.astrologie": "Astrologie",
- "midgard5.athletik": "Athletik",
- "midgard5.balancieren": "Balancieren",
- "midgard5.beidhaendigerKampf": "Beidhändiger Kampf",
- "midgard5.bergreiten": "Bergreiten",
- "midgard5.beredsamkeit": "Beredsamkeit",
- "midgard5.betaeuben": "Betäuben",
- "midgard5.betaeubungsgriff": "Betäubungsgriff",
- "midgard5.bootfahren": "Bootfahren",
- "midgard5.dickhaeuterLenken": "Dickhäuter lenken",
- "midgard5.ersteHilfe": "Erste Hilfe",
- "midgard5.etikette": "Etikette",
- "midgard5.fallenEntdecken": "Fallen entdecken",
- "midgard5.fallenmechanik": "Fallenmechanik",
- "midgard5.faelschen": "Fälschen",
- "midgard5.fangen": "Fangen",
- "midgard5.fechten": "Fechten",
- "midgard5.feueralchimie": "Feueralchimie",
- "midgard5.gassenwissen": "Gassenwissen",
- "midgard5.gaukeln": "Gaukeln",
- "midgard5.gelaendelauf": "Geländelauf",
- "midgard5.geraetekunde": "Gerätekunde",
- "midgard5.geschaeftssinn": "Geschäftssinn",
- "midgard5.gluecksspiel": "Glücksspiel",
- "midgard5.heilkunde": "Heilkunde",
- "midgard5.kampfInVollruestung": "Kampf in Vollrüstung",
- "midgard5.kampfInSchlachtreihe": "Kampf in Schlachtreihe",
- "midgard5.kampfkunst": "Kampfkunst",
- "midgard5.kido": "Kido",
- "midgard5.klettern": "Klettern",
- "midgard5.landeskunde": "Landeskunde",
- "midgard5.laufen": "Laufen",
- "midgard5.lesenVonZauberschrift": "Lesen von Zauberschrift",
- "midgard5.lesenVonZauberrunen": "Lesen von Zauberrunen",
- "midgard5.meditieren": "Meditieren",
- "midgard5.menschenkenntnis": "Menschenkenntnis",
- "midgard5.meucheln": "Meucheln",
- "midgard5.musizieren": "Musizieren",
- "midgard5.naturkunde": "Naturkunde",
- "midgard5.ninjutsu": "NinJutsu",
- "midgard5.orakelkunst": "Orakelkunst",
- "midgard5.pflanzenkunde": "Pflanzenkunde",
- "midgard5.raunen": "Raunen",
- "midgard5.reiten": "Reiten",
- "midgard5.reiterkampf": "Reiterkampf",
- "midgard5.rutengehen": "Rutengehen",
- "midgard5.scharfschiessen": "Scharfschießen",
- "midgard5.schiesskunst": "Schießkunst",
- "midgard5.schleichen": "Schleichen",
- "midgard5.schloesserOeffnen": "Schlösser öffnen",
- "midgard5.schmerzErtragen": "Schmerzen ertragen",
- "midgard5.schwimmen": "Schwimmen",
- "midgard5.seilkunst": "Seilkunst",
- "midgard5.selbstkontrolle": "Selbstkontrolle",
- "midgard5.singen": "Singen",
- "midgard5.skifahren": "Skifahren",
- "midgard5.spinnengang": "Spinnengang",
- "midgard5.speerfechten": "Speerfechten",
- "midgard5.spurensuche": "Spurensuche",
- "midgard5.stehlen": "Stehlen",
- "midgard5.taitschi": "TaiTschi",
- "midgard5.tarnen": "Tarnen",
- "midgard5.tanzen": "Tanzen",
- "midgard5.tauchen": "Tauchen",
- "midgard5.thaumagraphie": "Thaumagraphie",
- "midgard5.thaumalogie": "Thaumalogie",
- "midgard5.tierkunde": "Tierkunde",
- "midgard5.ueberleben": "Überleben",
- "midgard5.verfuehren": "Verführen",
- "midgard5.verhoeren": "Verhören",
- "midgard5.verstellen": "Verstellen",
- "midgard5.volkstanz": "Volkstanz",
- "midgard5.wagenlenken": "Wagenlenken",
- "midgard5.wahrsagen": "Wahrsagen",
- "midgard5.wasserkampf": "Wasserkampf",
- "midgard5.zauberkunde": "Zauberkunde",
+ "abrichten": "Abrichten",
+ "akrobatik": "Akrobatik",
+ "alchimie": "Alchimie",
+ "anfuehren": "Anführen",
+ "askese": "Askese",
+ "astrologie": "Astrologie",
+ "athletik": "Athletik",
+ "balancieren": "Balancieren",
+ "beidhaendigerKampf": "Beidhändiger Kampf",
+ "bergreiten": "Bergreiten",
+ "beredsamkeit": "Beredsamkeit",
+ "betaeuben": "Betäuben",
+ "betaeubungsgriff": "Betäubungsgriff",
+ "bootfahren": "Bootfahren",
+ "dickhaeuterLenken": "Dickhäuter lenken",
+ "ersteHilfe": "Erste Hilfe",
+ "etikette": "Etikette",
+ "fallenEntdecken": "Fallen entdecken",
+ "fallenmechanik": "Fallenmechanik",
+ "faelschen": "Fälschen",
+ "fangen": "Fangen",
+ "fechten": "Fechten",
+ "fechtkunst": "Fechtkunst",
+ "feueralchimie": "Feueralchimie",
+ "gassenwissen": "Gassenwissen",
+ "gaukeln": "Gaukeln",
+ "gelaendelauf": "Geländelauf",
+ "geraetekunde": "Gerätekunde",
+ "geschaeftssinn": "Geschäftssinn",
+ "gluecksspiel": "Glücksspiel",
+ "heilkunde": "Heilkunde",
+ "kampfInVollruestung": "Kampf in Vollrüstung",
+ "kampfInSchlachtreihe": "Kampf in Schlachtreihe",
+ "kampfkunst": "Kampfkunst",
+ "kido": "Kido",
+ "klettern": "Klettern",
+ "landeskunde": "Landeskunde",
+ "laufen": "Laufen",
+ "lesenVonZauberschrift": "Lesen von Zauberschrift",
+ "lesenVonZauberrunen": "Lesen von Zauberrunen",
+ "meditieren": "Meditieren",
+ "menschenkenntnis": "Menschenkenntnis",
+ "meucheln": "Meucheln",
+ "musizierenFloete": "Musizieren (Flöten)",
+ "musizierenBlas": "Musizieren (Blasinstrumente)",
+ "musizierenRythmus": "Musizieren (Rythmusinstrumente)",
+ "musizierenStreich": "Musizieren (Streichinstrumente)",
+ "musizierenZupf": "Musizieren (Zupfinstrumente)",
+ "naturkunde": "Naturkunde",
+ "ninjutsu": "NinJutsu",
+ "orakelkunst": "Orakelkunst",
+ "pflanzenkunde": "Pflanzenkunde",
+ "raunen": "Raunen",
+ "reiten": "Reiten",
+ "reiterkampf": "Reiterkampf",
+ "rutengehen": "Rutengehen",
+ "scharfschiessen": "Scharfschießen",
+ "schiesskunst": "Schießkunst",
+ "schleichen": "Schleichen",
+ "schloesserOeffnen": "Schlösser öffnen",
+ "schmerzErtragen": "Schmerzen ertragen",
+ "schwimmen": "Schwimmen",
+ "seilkunst": "Seilkunst",
+ "selbstkontrolle": "Selbstkontrolle",
+ "singen": "Singen",
+ "skifahren": "Skifahren",
+ "spinnengang": "Spinnengang",
+ "speerfechten": "Speerfechten",
+ "spurensuche": "Spurensuche",
+ "stehlen": "Stehlen",
+ "taitschi": "TaiTschi",
+ "tarnen": "Tarnen",
+ "tanzen": "Tanzen",
+ "tauchen": "Tauchen",
+ "thaumagraphie": "Thaumagraphie",
+ "thaumalogie": "Thaumalogie",
+ "tierkunde": "Tierkunde",
+ "ueberlebenWald": "Überleben (Wald)",
+ "ueberlebenSteppe": "Überleben (Steppe)",
+ "ueberlebenGebirge": "Überleben (Gebirge)",
+ "verfuehren": "Verführen",
+ "verhoeren": "Verhören",
+ "verstellen": "Verstellen",
+ "volkstanz": "Volkstanz",
+ "wagenlenken": "Wagenlenken",
+ "wahrsagen": "Wahrsagen",
+ "wasserkampf": "Wasserkampf",
+ "zauberkunde": "Zauberkunde",
- "midgard5.armor": "Rüstung",
- "midgard5.defense": "Abwehr",
- "midgard5.damageBonus": "Schadensbonus",
- "midgard5.damageBonus-short": "SchB",
- "midgard5.attackBonus": "Angriffsbonus",
- "midgard5.attackBonus-short": "AnB",
- "midgard5.defenseBonus": "Abwehrbonus",
- "midgard5.defenseBonus-short": "AbB",
- "midgard5.movementBonus": "Bewegunsbonus",
- "midgard5.resistanceMind": "Resistenz Geist",
- "midgard5.resistanceBody": "Resistenz Körper",
- "midgard5.spellCasting": "Zaubern",
- "midgard5.spellBonus": "Zauberbonus",
- "midgard5.brawl": "Raufen",
- "midgard5.poisonResistance": "Gifttolleranz",
- "midgard5.enduranceBonus": "Ausdauerbonus",
- "midgard5.lpProtection": "Rüstungsschutz (LP)",
- "midgard5.apProtection": "Rüstungsschutz (AP)",
- "midgard5.perception": "Wahrnehmung",
- "midgard5.drinking": "Trinken",
+ "armor": "Rüstung",
+ "defense": "Abwehr",
+ "damageBonus": "Schadensbonus",
+ "damageBonus-short": "SchB",
+ "attackBonus": "Angriffsbonus",
+ "attackBonus-short": "AnB",
+ "defenseBonus": "Abwehrbonus",
+ "defenseBonus-short": "AbB",
+ "movementBonus": "Bewegunsbonus",
+ "resistanceMind": "Resistenz Geist",
+ "resistanceBody": "Resistenz Körper",
+ "spellCasting": "Zaubern",
+ "spellBonus": "Zauberbonus",
+ "brawl": "Raufen",
+ "poisonResistance": "Gifttolleranz",
+ "enduranceBonus": "Ausdauerbonus",
+ "lpProtection": "Rüstungsschutz (LP)",
+ "apProtection": "Rüstungsschutz (AP)",
+ "deprivation": "Zähigkeit",
+ "deprivations": "Entbehrungen",
+ "deprivationCold": "Zähigkeit Kälte",
+ "deprivationHeat": "Zähigkeit Hitze",
+ "deprivationFood": "Zähigkeit Durst/Hunger",
- "midgard5.new-skill": "Neue Fertigkeit",
- "midgard5.special": "Spezial",
- "midgard5.learned-skill": "Gelernte Fertigkeit",
- "midgard5.learned-skills": "Gelernte Fertigkeiten",
- "midgard5.language": "Sprache",
- "midgard5.languages": "Sprachen",
- "midgard5.weapon-skill": "Waffenfertigkeit",
- "midgard5.weapon-skills": "Waffenfertigkeiten",
- "midgard5.unlearned-skill": "Ungelernte Fertigkeit",
- "midgard5.unlearned-skills": "Ungelernte Fertigkeiten",
- "midgard5.innate-ability": "Angeborene/Besondere Fertigkeit",
- "midgard5.innate-abilities": "Angeborene/Besondere Fertigkeit",
+ "new-skill": "Neue Fertigkeit",
+ "special": "Spezial",
+ "learned-skill": "Gelernte Fertigkeit",
+ "learned-skills": "Gelernte Fertigkeiten",
+ "language": "Sprache",
+ "languages": "Sprachen",
+ "writings": "Schriften",
+ "weapon-skill": "Waffenfertigkeit",
+ "weapon-skills": "Waffenfertigkeiten",
+ "unlearned-skill": "Ungelernte Fertigkeit",
+ "unlearned-skills": "Ungelernte Fertigkeiten",
+ "innate-ability": "Angeborene/Besondere Fähigkeit",
+ "innate-abilities": "Angeborene und besondere Fähigkeiten",
- "midgard5.base-damage": "Grundschaden",
- "midgard5.weapon": "Waffe",
- "midgard5.weapons": "Waffen",
- "midgard5.defensive-weapon": "Verteidigungswaffe",
- "midgard5.defensive-weapons": "Verteidigungswaffen",
- "midgard5.no-skill": "Keine Fertigkeit",
- "midgard5.magic": "magisch",
- "midgard5.valuable": "Vermögen",
- "midgard5.equipped": "Ausgerüstet",
- "midgard5.active": "Aktiv",
- "midgard5.rangedWeapon": "Schusswaffe",
- "midgard5.assignItemToCharacter": "Füge Gegenstand einem Charakter hinzu, um hier etwas auswählen zu können",
- "midgard5.showAll": "Alle anzeigen",
- "midgard5.wealthAndWeight": "Vermögen und Lasten",
- "midgard5.itemsInContainers": "Gegenstände in Aufbewahrung",
- "midgard5.allItems": "Alle Gegenstände",
+ "base-damage": "Grundschaden",
+ "weapon": "Waffe",
+ "weapons": "Waffen",
+ "defensive-weapon": "Verteidigungswaffe",
+ "defensive-weapons": "Verteidigungswaffen",
+ "no-skill": "Keine Fertigkeit",
+ "magic": "magisch",
+ "valuable": "Vermögen",
+ "equipped": "Ausgerüstet",
+ "active": "Aktiv",
+ "rangedWeapon": "Schusswaffe",
+ "assignItemToCharacter": "Füge Gegenstand einem Charakter hinzu, um hier etwas auswählen zu können",
+ "showAll": "Alle anzeigen",
+ "wealthAndWeight": "Vermögen und Lasten",
+ "itemsInContainers": "Gegenstände in Aufbewahrung",
+ "allItems": "Alle Gegenstände",
- "midgard5.pw": "Prüfwurf",
- "midgard5.attack": "Angriff",
- "midgard5.damage": "Schaden",
+ "pw": "Prüfwurf",
+ "attack": "Angriff",
+ "damage": "Schaden",
- "midgard5.spell-process-none": "Ohne",
- "midgard5.spell-process-beherrschen": "Beherrschen",
- "midgard5.spell-process-bewegen": "Bewegen",
- "midgard5.spell-process-blutzauber": "Blutmagie",
- "midgard5.spell-process-chaoswunder": "Chaoswunder",
- "midgard5.spell-process-erkennen": "Erkennen",
- "midgard5.spell-process-erschaffen": "Erschaffen",
- "midgard5.spell-process-formen": "Formen",
- "midgard5.spell-process-finstere_magie": "Finstere Magie",
- "midgard5.spell-process-veraendern": "Verändern",
- "midgard5.spell-process-zerstoeren": "Zerstören",
- "midgard5.spell-process-wundertat": "Wundertat",
- "midgard5.spell-process-dweomer": "Dweomer",
- "midgard5.spell-process-wilder_Dweomer": "Wilder Dweomer",
- "midgard5.spell-process-zauberlied": "Zauberlied",
- "midgard5.spell-process-salz": "Salz",
- "midgard5.spell-process-thaumagraphie": "Thaumagraphie",
- "midgard5.spell-process-beschwoeren": "Beschwören",
- "midgard5.spell-process-nekromantie": "Nekromantie",
- "midgard5.spell-process-thaumatherapie": "Thaumatherapie",
- "midgard5.spell-process-zaubermittel": "Zaubermittel",
- "midgard5.spell-process-zauberschutz": "Zauberschutz",
- "midgard5.spell-process-zauberrunen": "Zauberrunen",
- "midgard5.spell-process-zaubersiegel": "Zaubersiegel",
+ "skill-goup-alltag": "Alltag",
+ "skill-goup-freiland": "Freiland",
+ "skill-goup-halbwelt": "Halbwelt",
+ "skill-goup-kampf": "Kampf",
+ "skill-goup-koerper": "Körper",
+ "skill-goup-sozial": "Sozial",
+ "skill-goup-unterwelt": "Unterwelt",
+ "skill-goup-waffen": "Waffen",
+ "skill-goup-wissen": "Wissen",
- "midgard5.spell-type-gedanke": "Gedanke",
- "midgard5.spell-type-geste": "Geste",
- "midgard5.spell-type-wort": "Wort",
+ "spell-process-none": "Ohne",
+ "spell-process-artefakte": "Artefakte",
+ "spell-process-beherrschen": "Beherrschen",
+ "spell-process-bewegen": "Bewegen",
+ "spell-process-beschwoeren": "Beschwören",
+ "spell-process-blutmagie": "Blutmagie",
+ "spell-process-chaoswunder": "Chaoswunder",
+ "spell-process-dweomer": "Dweomer",
+ "spell-process-erkennen": "Erkennen",
+ "spell-process-erschaffen": "Erschaffen",
+ "spell-process-erhaltung": "Erhaltung",
+ "spell-process-formen": "Formen",
+ "spell-process-finstere_magie": "Finstere Magie",
+ "spell-process-kampfverse": "Kampfverse",
+ "spell-process-namensmagie": "Namensmagie",
+ "spell-process-nekromantie": "Nekromantie",
+ "spell-process-runenstaebe": "Runenstäbe",
+ "spell-process-thaumatherapie": "Thaumatherapie",
+ "spell-process-thaumagraphie": "Thaumagraphie",
+ "spell-process-veraendern": "Verändern",
+ "spell-process-vigilsignien": "Vigilsignien",
+ "spell-process-wundertat": "Wundertat",
+ "spell-process-wilder_dweomer": "Wilder Dweomer",
+ "spell-process-zerstoeren": "Zerstören",
+ "spell-process-zauberlied": "Zauberlieder",
+ "spell-process-zaubersalz": "Zaubersalze",
+ "spell-process-zaubermittel": "Zaubermittel",
+ "spell-process-zauberschutz": "Zauberschutz",
+ "spell-process-zauberrunen": "Zauberrunen",
+ "spell-process-zaubersiegel": "Zaubersiegel",
+ "spell-process-zaubertaenze": "Zaubertänze",
+ "spell-process-zauberblaetter": "Zauberblätter",
- "midgard5.spell-target-umgebung": "Umgebung",
- "midgard5.spell-target-geist": "Geist",
- "midgard5.spell-target-koerper": "Körper",
+ "spell-type-gedanke": "Gedanke",
+ "spell-type-geste": "Geste",
+ "spell-type-wort": "Wort",
- "midgard5.spell-type": "Art",
- "midgard5.spell-process": "Prozess",
- "midgard5.spell-castDuration": "Zauberdauer",
- "midgard5.spell-range": "Reichweite",
- "midgard5.spell-effectTarget": "Wirkunsziel",
- "midgard5.spell-effectArea": "Wirkungsbereich",
- "midgard5.spell-effectDuration": "Wirkungsdauer",
- "midgard5.spell-origin": "Ursprung",
- "midgard5.spell-agens": "Agens",
- "midgard5.spell-reagens": "Reagens",
- "midgard5.spell-material": "Zaubermaterial",
+ "spell-target-umgebung": "Umgebung",
+ "spell-target-geist": "Geist",
+ "spell-target-koerper": "Körper",
- "midgard5.kampfkunst-type": "Kampfkunst Art",
- "midgard5.kampfkunst-variante": "Kampfkunst Variante",
- "midgard5.kampfkunst-variante-short": "Var",
- "midgard5.kido-type": "Kido Art",
- "midgard5.kido-variante": "Kido Variante",
+ "spell-type": "Art",
+ "spell-process": "Prozess",
+ "spell-castDuration": "Zauberdauer",
+ "spell-castDuration-short": "Zd",
+ "spell-range": "Reichweite",
+ "spell-range-short": "Rw",
+ "spell-effectTarget": "Wirkunsziel",
+ "spell-effectTarget-short": "Wz",
+ "spell-effectArea": "Wirkungsbereich",
+ "spell-effectArea-short": "Wb",
+ "spell-effectDuration": "Wirkungsdauer",
+ "spell-effectDuration-short": "Wd",
+ "spell-origin": "Ursprung",
+ "spell-agens": "Agens",
+ "spell-reagens": "Reagens",
+ "spell-material": "Zaubermaterial",
- "midgard5.kampfkunst-type-angriff": "Angriffstechnik",
- "midgard5.kampfkunst-type-verteidigung": "Verteidigungstechnik",
- "midgard5.kampfkunst-type-finte": "Finte",
- "midgard5.kampfkunst-type-geist": "Geistestechnik",
- "midgard5.kampfkunst-type-schießkunst": "Schießkunst",
- "midgard5.kampfkunst-type-fechten": "Fechtkunst",
- "midgard5.kido-type-angriff": "Kido Angriffstechnik",
- "midgard5.kido-type-verteidigung": "Kido Verteidigungstechnik",
- "midgard5.kido-type-finte": "Kido Finte",
- "midgard5.kido-type-leib": "Kido Leibestechnik",
+ "kampfkunst-type": "Form",
+ "kampfkunst-variante": "Variante",
+ "kampfkunst-variante-short": "Var",
+ "kampfkunst-ep": "Erfahrungspunkte",
+ "kampfkunst-rank": "Stufe",
+ "kampfkunst-weapon": "Waffengruppe",
+ "kampfkunst-enemy": "Einschränkungen durch Art der Gegner",
- "midgard5.kampfkunst-variante-anstuermen": "Anstürmen",
- "midgard5.kampfkunst-variante-attackieren": "Attackieren",
- "midgard5.kampfkunst-variante-entwaffnen": "Entwaffnen",
+ "kampfkunst-type-angriff": "Angriff",
+ "kampfkunst-type-verteidigung": "Verteidigung",
+ "kampfkunst-type-finte": "Finte",
+ "kampfkunst-type-geist": "Geistestechnik",
+ "kampfkunst-type-schießkunst": "Schießkunst",
+ "kampfkunst-type-fechtkunst": "Fechtkunst",
- "midgard5.kido-variante-anspringen": "Anspringen",
- "midgard5.kido-variante-attackieren": "Attackieren",
- "midgard5.kido-variante-entwaffnen": "Entwaffnen",
- "midgard5.kido-variante-werfen": "Werfen",
- "midgard5.kido-variante-ausweichen": "Ausweichen",
- "midgard5.kido-variante-blockieren": "Blockieren",
- "midgard5.kido-variante-bewegen": "Bewegen",
- "midgard5.kido-variante-kontrollieren": "Kontrollieren",
+ "kampfkunst-variante-anstuermen": "Anstürmen",
+ "kampfkunst-variante-attackieren": "Attackieren",
+ "kampfkunst-variante-entwaffnen": "Entwaffnen",
+ "kampfkunst-variante-fechten": "Fechten",
+ "kampfkunst-variante-schusstechnik": "Schusstechnik",
+ "kampfkunst-variante-finten": "Finten",
+ "kampfkunst-variante-geistestechnik": "Geistestechnik",
+ "kampfkunst-variante-verteidigung": "Verteidigung",
- "midgard5.mod-operation-add100": "Addieren (max 100)",
- "midgard5.mod-operation-roll": "Wurf Modifikation",
- "midgard5.mod-operation-add": "Addieren",
- "midgard5.mod-operation-set": "Basiswert",
- "midgard5.mod-operation-fixed": "Fester Wert",
- "midgard5.mod-operation-subtract": "Subtrahieren",
- "midgard5.mod-operation-multiply": "Multiplizieren",
- "midgard5.mod-operation-division": "Dividieren",
+ "kido-type": "KiDo Form",
+ "kido-variante": "KiDo Variante",
+ "kido-color": "Kampfstilfarbe",
+ "kido-style": "Art der Technik",
- "midgard5.mod-stat-defenseBonus": "Abwehrbonus",
- "midgard5.mod-stat-attackBonus": "Angriffsbonus",
- "midgard5.mod-stat-damageBonus": "Schadensbonus",
- "midgard5.mod-stat-movement": "Bewegung",
- "midgard5.mod-stat-resistanceMind": "Resistenz Geist",
- "midgard5.mod-stat-resistanceBody": "Resistenz Körper",
- "midgard5.mod-stat-spellCasting": "Zaubern",
- "midgard5.mod-stat-brawl": "Raufen",
- "midgard5.mod-stat-poisonResistance": "Gifttolleranz",
- "midgard5.mod-stat-lp": "Lebenspunkte",
- "midgard5.mod-stat-ap": "Ausdauerpunkte",
- "midgard5.mod-stat-lpProtection": "Rüstungsschutz (LP)",
- "midgard5.mod-stat-apProtection": "Rüstungsschutz (AP)",
- "midgard5.mod-stat-perception": "Wahrnehmung",
- "midgard5.mod-stat-drinking": "Trinken",
+ "kido-type-angriff": "Kido Angriff",
+ "kido-type-verteidigung": "Kido Verteidigung",
+ "kido-type-finte": "Kido Finte",
+ "kido-type-leib": "Kido Leibestechnik",
- "midgard5.mod-type": "Typ der Modifikation",
- "midgard5.mod-id": "Was soll modifiziert werden",
- "midgard5.mod-operation": "Wie soll modifiziert werden",
- "midgard5.mod-value": "Wert",
+ "kido-variante-anspringen": "Anspringen",
+ "kido-variante-attackieren": "Attackieren",
+ "kido-variante-entwaffnen": "Entwaffnen",
+ "kido-variante-werfen": "Werfen",
+ "kido-variante-ausweichen": "Ausweichen",
+ "kido-variante-blockieren": "Blockieren",
+ "kido-variante-bewegen": "Bewegen",
+ "kido-variante-kontrollieren": "Kontrollieren",
- "midgard5.type": "Typ",
- "midgard5.formula": "Formel",
- "midgard5.roll": "Wurf"
+ "mod-operation-add100": "Addieren (max 100)",
+ "mod-operation-roll": "Wurf Modifikation",
+ "mod-operation-add": "Addieren",
+ "mod-operation-set": "Basiswert",
+ "mod-operation-fixed": "Fester Wert",
+ "mod-operation-subtract": "Subtrahieren",
+ "mod-operation-multiply": "Multiplizieren",
+ "mod-operation-division": "Dividieren",
+
+ "mod-stat-defenseBonus": "Abwehrbonus",
+ "mod-stat-attackBonus": "Angriffsbonus",
+ "mod-stat-damageBonus": "Schadensbonus",
+ "mod-stat-movement": "Bewegung",
+ "mod-stat-resistanceMind": "Resistenz Geist",
+ "mod-stat-resistanceBody": "Resistenz Körper",
+ "mod-stat-spellCasting": "Zaubern",
+ "mod-stat-brawl": "Raufen",
+ "mod-stat-poisonResistance": "Gifttolleranz",
+ "mod-stat-lp": "Lebenspunkte",
+ "mod-stat-ap": "Ausdauerpunkte",
+ "mod-stat-lpProtection": "Rüstungsschutz (LP)",
+ "mod-stat-apProtection": "Rüstungsschutz (AP)",
+ "mod-stat-deprivationCold": "Entbehrungen Kälte",
+ "mod-stat-deprivationHeat": "Entbehrungen Hitze",
+ "mod-stat-deprivationFood": "Entbehrungen Durst/Hunger",
+
+ "mod-type": "Typ der Modifikation",
+ "mod-id": "Was soll modifiziert werden",
+ "mod-operation": "Wie soll modifiziert werden",
+ "mod-value": "Wert",
+
+ "type": "Typ",
+ "formula": "Formel",
+ "roll": "Wurf",
+
+ "chat": {
+ "luckPoint": "Glückspunkt",
+ "destiny": "Schicksalsgunst",
+ "modify": "Nachträglich",
+ "cancel": "Abbrechen",
+ "roll": "Würfeln",
+ "reroll": "Neuwürfeln",
+
+ "options": {
+ "modifier": "Modifikator",
+ "difficulty": "Schwellenwert",
+ "rollMode": "Würfel Modus"
+ }
+ }
+ }
}
diff --git a/package.json b/package.json
index eef0591..b3dc8bc 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "foundry-system-midgard5",
- "version": "2.5.0",
+ "version": "2.6.0",
"description": "",
"main": "index.js",
"scripts": {
diff --git a/source/helpers.ts b/source/helpers.ts
new file mode 100644
index 0000000..845cc7b
--- /dev/null
+++ b/source/helpers.ts
@@ -0,0 +1,114 @@
+/* global Handlebars, game, TextEditor, WOD5E */
+
+import { M5Skill } from "./module/M5Base";
+import { M5Character } from "./module/actors/M5Character";
+
+/**
+ * Define any helpers necessary for working with Handlebars
+ * @return {Promise}
+ */
+export const loadHelpers = async function () {
+ Handlebars.registerHelper("times", (n: number, block) => {
+ var accum = "";
+ for (let i = 0; i < n; ++i) accum += block.fn(i);
+ return accum;
+ });
+
+ Handlebars.registerHelper("array", (arr: any[], index: number) => {
+ return arr[index];
+ });
+
+ Handlebars.registerHelper("m5concat", (...values) => {
+ const options = values.pop();
+ const join = options.hash?.join || "";
+ //return new Handlebars.SafeString(values.join(join));
+ return values.map((val) => val.toString()).join(join);
+ });
+
+ Handlebars.registerHelper("add", (...values) => {
+ const options = values.pop();
+ return values.reduce((prev, cur) => prev + cur);
+ });
+
+ Handlebars.registerHelper("localizeMidgard", (str: string) => {
+ const template = Handlebars.compile("{{localize value}}");
+ return template({
+ value: "midgard5." + str,
+ });
+ });
+
+ Handlebars.registerHelper("skillBonus", (actorId: string, skill: M5Skill) => {
+ const actor = (game as Game).actors.get(actorId) as M5Character;
+ return actor.skillBonus(skill).toString();
+ });
+
+ Handlebars.registerHelper("skillEw", (actorId: string, skill: M5Skill) => {
+ const actor = (game as Game).actors.get(actorId) as M5Character;
+ return actor.skillEw(skill).toString();
+ });
+
+ Handlebars.registerHelper("skill", (skillId: string) => {
+ return (game as Game).items.get(skillId);
+ });
+
+ Handlebars.registerHelper("itemValue", (id: string, path: string) => {
+ let obj = (game as Game).items.get(id);
+ path.split(".").forEach((p) => (obj = obj[p]));
+ return `${obj}`;
+ });
+
+ Handlebars.registerHelper("actorItemValue", (actorId: any, itemId: string, path: string, token?: boolean) => {
+ //console.log("actorItemValue", actorId, itemId, path)
+ const actor = (game as Game).actors.get(actorId);
+ let obj = actor.items.get(itemId)?.system;
+ path.split(".").forEach((p) => {
+ if (obj) obj = obj[p];
+ });
+ return `${obj}`;
+ });
+
+ Handlebars.registerHelper("icon", (relpath: string) => {
+ return `systems/midgard5/assets/icons/${relpath}`;
+ });
+
+ Handlebars.registerHelper("isSkillInList", (skillName: string, list: any) => {
+ for (let key in list) {
+ if (list[key]?.label?.toLowerCase() === skillName?.toLowerCase()) {
+ return true;
+ }
+ }
+ return false;
+ });
+
+ Handlebars.registerHelper("skillEwInList", (skillName: string, list: any) => {
+ for (let key in list) {
+ if (list[key]?.label?.toLowerCase() === skillName?.toLowerCase()) {
+ return list[key].calc.ew;
+ }
+ }
+ return false;
+ });
+
+ Handlebars.registerHelper("stripHtml", function (param) {
+ var regex = /(<([^>]+)>)/gi;
+ return param.replace(regex, "");
+ });
+
+ Handlebars.registerHelper("contains", (label: string, contains: string) => {
+ return label.toLowerCase().includes(contains.toLowerCase());
+ });
+
+ Handlebars.registerHelper("count", (object: any) => {
+ var length = 0;
+ for (var key in object) {
+ if (object.hasOwnProperty(key)) {
+ ++length;
+ }
+ }
+ return length;
+ });
+
+ Handlebars.registerHelper("console", (object: any) => {
+ console.log(object);
+ });
+};
diff --git a/source/index.ts b/source/index.ts
index deb2690..7dcdff9 100644
--- a/source/index.ts
+++ b/source/index.ts
@@ -2,103 +2,18 @@ import Logger from "./utils/Logger";
import M5CharacterSheet from "./module/sheets/M5CharacterSheet";
import preloadTemplates from "./PreloadTemplates";
import { M5Character } from "./module/actors/M5Character";
-import { M5ItemMod, M5ModOperation, M5Skill, M5TimeUnit } from "./module/M5Base";
+import { M5ModOperation, M5TimeUnit } from "./module/M5Base";
import { M5ItemSheet } from "./module/sheets/M5ItemSheet";
import { M5Item } from "./module/items/M5Item";
+import { reroll } from "./module/rolls/reroll";
+import { loadHelpers } from "./helpers";
+import { loadSettings } from "./settings";
Hooks.once("init", async () => {
Logger.log("M5 | Initialisierung Midgard 5");
- Handlebars.registerHelper("times", (n: number, block) => {
- var accum = "";
- for (let i = 0; i < n; ++i) accum += block.fn(i);
- return accum;
- });
-
- Handlebars.registerHelper("array", (arr: any[], index: number) => {
- return arr[index];
- });
-
- Handlebars.registerHelper("m5concat", (...values) => {
- const options = values.pop();
- const join = options.hash?.join || "";
- //return new Handlebars.SafeString(values.join(join));
- return values.map((val) => val.toString()).join(join);
- });
-
- Handlebars.registerHelper("add", (...values) => {
- const options = values.pop();
- return values.reduce((prev, cur) => prev + cur);
- });
-
- Handlebars.registerHelper("localizeMidgard", (str: string) => {
- const template = Handlebars.compile("{{localize value}}");
- return template({
- value: "midgard5." + str,
- });
- });
-
- Handlebars.registerHelper("skillBonus", (actorId: string, skill: M5Skill) => {
- const actor = (game as Game).actors.get(actorId) as M5Character;
- return actor.skillBonus(skill).toString();
- });
-
- Handlebars.registerHelper("skillEw", (actorId: string, skill: M5Skill) => {
- const actor = (game as Game).actors.get(actorId) as M5Character;
- return actor.skillEw(skill).toString();
- });
-
- Handlebars.registerHelper("skill", (skillId: string) => {
- return (game as Game).items.get(skillId);
- });
-
- Handlebars.registerHelper("itemValue", (id: string, path: string) => {
- let obj = (game as Game).items.get(id);
- path.split(".").forEach((p) => (obj = obj[p]));
- return `${obj}`;
- });
-
- Handlebars.registerHelper("actorItemValue", (actorId: any, itemId: string, path: string, token?: boolean) => {
- //console.log("actorItemValue", actorId, itemId, path)
- const actor = (game as Game).actors.get(actorId);
- let obj = actor.items.get(itemId)?.system;
- path.split(".").forEach((p) => {
- if (obj) obj = obj[p];
- });
- return `${obj}`;
- });
-
- Handlebars.registerHelper("icon", (relpath: string) => {
- return `systems/midgard5/assets/icons/${relpath}`;
- });
-
- Handlebars.registerHelper("isSkillInList", (skillName: string, list: any) => {
- for (let key in list) {
- if (list[key]?.label?.toLowerCase() === skillName?.toLowerCase()) {
- return true;
- }
- }
- return false;
- });
-
- Handlebars.registerHelper("stripHtml", function (param) {
- var regex = /(<([^>]+)>)/gi;
- return param.replace(regex, "");
- });
-
- Handlebars.registerHelper("contains", (label: string, contains: string) => {
- return label.toLowerCase().includes(contains.toLowerCase());
- });
-
- Handlebars.registerHelper("count", (object: any) => {
- var length = 0;
- for (var key in object) {
- if (object.hasOwnProperty(key)) {
- ++length;
- }
- }
- return length;
- });
+ // Load settings into Foundry
+ loadSettings();
// Default Sheet für Items definieren und das Standardsheet deaktivieren
Items.unregisterSheet("core", ItemSheet);
@@ -112,6 +27,8 @@ Hooks.once("init", async () => {
CONFIG.Item.documentClass = M5Item;
//RegisterSettings();
await preloadTemplates();
+
+ loadHelpers();
});
Hooks.once("setup", () => {
@@ -163,6 +80,17 @@ Hooks.on("getChatLogEntryContext", function (html, options) {
return (game["user"].character || game["canvas"].tokens.controlled) && damageRolls > 0;
},
callback: (li) => applyDamage(li, -2),
+ },
+ {
+ name: "Redo",
+ icon: ' ',
+ condition: (li) => {
+ const message = (game as Game).messages.get(li.attr("data-message-id"));
+
+ // All must be true to show the reroll dialogue
+ return (game["user"].isGM || game["user"].character?.id === (game as Game).actors.get(message["speaker"].actor)?.id) && !message["flags"].rerolled;
+ },
+ callback: (li) => reroll(li),
}
);
});
diff --git a/source/module/M5Base.ts b/source/module/M5Base.ts
index 586b84f..e890123 100644
--- a/source/module/M5Base.ts
+++ b/source/module/M5Base.ts
@@ -28,8 +28,9 @@ export interface M5Attribute {
export interface M5RollData {
c: any;
i: any;
+ b: any;
iType: string;
- rolls: {};
+ rolls: any;
res: {
label: string;
};
@@ -103,17 +104,9 @@ export enum M5Stats {
AP = "ap",
PROTECTION_LP = "lpProtection",
PROTECTION_AP = "apProtection",
- PERCEPTION = "perception",
- DRINKING = "drinking",
- HOARD = "hoard",
- HOARD_NEXT = "hoardNext",
- HOARD_MIN = "hoardMin",
- WEALTH = "wealth",
- LOAD = "load",
- HEAVY_LOAD = "heavyLoad",
- LOAD_MAX = "loadMax",
- THRUST_LOAD = "thrustLoad",
- ENCUMBRANCE = "encumbrance",
+ DEPRIVATION_COLD = "deprivationCold",
+ DEPRIVATION_HEAT = "deprivationHeat",
+ DEPRIVATION_FOOD = "deprivationFood",
}
export enum M5ModType {
@@ -180,6 +173,7 @@ export interface M5CharacterCalculatedData {
pa: M5AttributeCalculated;
wk: M5AttributeCalculated;
};
+
stats: {
lp: M5ModResult;
ap: M5ModResult;
@@ -197,10 +191,9 @@ export interface M5CharacterCalculatedData {
brawlFw: number;
poisonResistance: M5ModResult;
enduranceBonus: number;
- perception: M5ModResult;
- perceptionFW: number;
- drinking: M5ModResult;
- drinkingFW: number;
+ deprivationCold: M5ModResult;
+ deprivationHeat: M5ModResult;
+ deprivationFood: M5ModResult;
hoard: number;
hoardNext: number;
hoardMin: number;
diff --git a/source/module/actors/M5Character.ts b/source/module/actors/M5Character.ts
index 46f2263..3f83d15 100644
--- a/source/module/actors/M5Character.ts
+++ b/source/module/actors/M5Character.ts
@@ -1,18 +1,5 @@
import { M5Item } from "../items/M5Item";
-import {
- M5Attribute,
- M5CharacterCalculatedData,
- M5ItemMod,
- M5ItemType,
- M5ModOperation,
- M5ModResult,
- M5ModType,
- M5RollData,
- M5Skill,
- M5SkillCalculated,
- M5SkillLearned,
- M5SkillType,
-} from "../M5Base";
+import { M5Attribute, M5CharacterCalculatedData, M5ItemMod, M5ItemType, M5ModOperation, M5ModResult, M5RollData, M5Skill, M5SkillCalculated } from "../M5Base";
import M5ModAggregate from "./M5ModAggregate";
export class M5Character extends Actor {
// constructor(
@@ -94,6 +81,7 @@ export class M5Character extends Actor {
containers?: boolean;
kampfkuenste?: boolean;
encumbrance?: boolean;
+ class?: boolean;
} = {}
): M5CharacterCalculatedData {
let ret: M5CharacterCalculatedData = {
@@ -126,10 +114,9 @@ export class M5Character extends Actor {
brawlFw: 0,
poisonResistance: { value: 0, mods: [] },
enduranceBonus: 0,
- perception: { value: 0, mods: [] },
- perceptionFW: 0,
- drinking: { value: 0, mods: [] },
- drinkingFW: 0,
+ deprivationCold: { value: 0, mods: [] },
+ deprivationHeat: { value: 0, mods: [] },
+ deprivationFood: { value: 0, mods: [] },
hoard: 0,
encumbrance: 0,
load: 0,
@@ -194,21 +181,16 @@ export class M5Character extends Actor {
ret.stats.attackBonus = this.modResult(ret.attributes.gs.bonus);
ret.stats.defenseBonus = this.modResult(ret.attributes.gw.bonus);
ret.stats.movement = this.modResult(data.movement);
- ret.stats.resistanceMind = this.modResult(
- (data.info.magicUsing ? 2 : 0) + ret.stats.defense.value + (data.info.race === "Mensch" ? ret.attributes.in.bonus : this.raceBonus(data.info.race))
- );
- ret.stats.resistanceBody = this.modResult(
- (data.info.magicUsing ? 2 : 1) + ret.stats.defense.value + (data.info.race === "Mensch" ? ret.attributes.ko.bonus : this.raceBonus(data.info.race))
- );
+ ret.stats.resistanceMind = this.modResult(ret.stats.defense.value + (data.info.race === "Mensch" ? ret.attributes.in.bonus : this.raceBonus(data.info.race)));
+ ret.stats.resistanceBody = this.modResult(ret.stats.defense.value + (data.info.race === "Mensch" ? ret.attributes.ko.bonus : this.raceBonus(data.info.race)));
ret.stats.spellCasting = this.modResult((data.info.magicUsing ? M5Character.spellCastingFromLevel(ret.level) : 3) + ret.attributes.zt.bonus);
ret.stats.brawl = this.modResult(Math.floor((ret.attributes.st.value + ret.attributes.gw.value) / 20));
ret.stats.brawlFw = ret.stats.brawl.value + ret.stats.attackBonus.value + (data.info.race === "Zwerg" ? 1 : 0);
ret.stats.poisonResistance = this.modResult(30 + Math.floor(ret.attributes.ko.value / 2));
ret.stats.enduranceBonus = Math.floor(ret.attributes.ko.value / 10) + Math.floor(ret.attributes.st.value / 20);
- ret.stats.perception = this.modResult(0);
- ret.stats.perceptionFW = 6;
- ret.stats.drinking = this.modResult(0);
- ret.stats.drinkingFW = Math.floor(ret.attributes.ko.value / 10);
+ ret.stats.deprivationCold = this.modResult(Math.floor(ret.attributes.ko.value / 2));
+ ret.stats.deprivationHeat = this.modResult(Math.floor(ret.attributes.ko.value / 2));
+ ret.stats.deprivationFood = this.modResult(Math.floor(40 + ret.attributes.ko.value / 2));
ret.stats.hoardMin = M5Character.levelThreshold.at(ret.level - 1) / 2;
ret.stats.hoardNext = M5Character.levelThreshold.at(ret.level) / 2;
ret.stats.wealth = parseFloat((data.info.gold + data.info.silver / 10 + data.info.copper / 100).toPrecision(3));
@@ -223,7 +205,10 @@ export class M5Character extends Actor {
const aggregate = new M5ModAggregate(data, ret);
context.items
- ?.filter((item) => (item.type === "item" || item.type === "effect" || item.type === "armor" || item.type === "container") && item.system.equipped)
+ ?.filter(
+ (item) =>
+ (item.type === "item" || item.type === "skill" || item.type === "effect" || item.type === "armor" || item.type === "container" || item.type === "class") && item.system.equipped
+ )
.forEach((item) => {
const mods = item.system.mods;
//console.log("Actor item mods", mods)
@@ -266,6 +251,7 @@ export class M5Character extends Actor {
calc: item.system.calc,
equipped: item.system?.equipped,
weight: item.system.weight || 0,
+ capacity: item.system.capacity || 0,
value: item.system.value || 0,
currency: item.system.currency || "",
quantity: item.system.quantity || 0,
@@ -363,6 +349,7 @@ export class M5Character extends Actor {
ret.gear.weapons[item.id] = {
label: label,
+ icon: item.img,
skillId: item.system.skillId,
magic: item.system.magic,
valuable: item.system?.valuable,
@@ -405,6 +392,7 @@ export class M5Character extends Actor {
ret.gear.defensiveWeapons[item.id] = {
label: label,
+ icon: item.img,
skillId: item.system.skillId,
magic: item.system.magic,
valuable: item.system?.valuable,
@@ -448,6 +436,7 @@ export class M5Character extends Actor {
ret.gear.armor[item.id] = {
label: label,
+ icon: item.img,
magic: item.system.magic,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
@@ -460,56 +449,26 @@ export class M5Character extends Actor {
containerId: item.system.containerId || "",
};
});
+ }
- // if (!skip?.encumbrance) {
- // const item = context.items.filter((x) => x.name === "Belastung");
- // if (ret.stats.encumbrance > ret.stats.heavyLoad) {
- // if (item.length === 0) {
- // this.createEffect("Belastung", [{ id: "movement", operation: M5ModOperation.DIVISION, type: M5ModType.STAT, value: 2 }]);
- // } else if (item.length === 1) {
- // item[0].update({
- // data: {
- // equipped: true,
- // },
- // });
- // } else if (item.length === 2) {
- // item[1]?.delete();
- // }
- // } else if (ret.stats.encumbrance <= ret.stats.heavyLoad) {
- // if (item.length === 1) {
- // item[0]?.update({
- // data: {
- // equipped: false,
- // },
- // });
- // }
- // }
- // }
+ if (!skip?.class) {
+ context.items
+ ?.filter((item) => item.type === "class")
+ .sort((a, b) => b?.system.magicUsing - a?.system.magicUsing)
+ .forEach((item, index) => {
+ if (index !== 0) {
+ item.system.equipped = false;
+ } else {
+ item.system.equipped = true;
+ data.info.magicUsing = item.system.magicUsing;
+ data.lernKostenZauber = item.system.lernKostenZauber;
+ }
- // if (!skip?.encumbrance) {
- // const item = context.items.filter((x) => x.name === "Höchstlast");
- // if (ret.stats.encumbrance > ret.stats.loadMax) {
- // if (item.length === 0) {
- // this.createEffect("Höchstlast", [{ id: "ap", operation: M5ModOperation.SUBTRACT, type: M5ModType.STAT, value: 1 }]);
- // } else if (item.length === 1) {
- // item[0].update({
- // data: {
- // equipped: true,
- // },
- // });
- // } else if (item.length === 2) {
- // item[1]?.delete();
- // }
- // } else if (ret.stats.encumbrance <= ret.stats.loadMax) {
- // if (item.length === 1) {
- // item[0]?.update({
- // data: {
- // equipped: false,
- // },
- // });
- // }
- // }
- // }
+ if (typeof data.info.class === "string") {
+ data.info.class = {};
+ }
+ data.info.class[item.id] = item.name;
+ });
}
if (!skip?.effects) {
@@ -526,6 +485,7 @@ export class M5Character extends Actor {
ret.gear.effects[item.id] = {
label: label,
+ icon: item.img,
magic: item.system.magic,
calc: item.system.calc,
equipped: item.system?.equipped || false,
@@ -543,21 +503,12 @@ export class M5Character extends Actor {
const skillMap = ret.skills[item.system.type];
skillMap[item.id] = {
label: item.name,
+ icon: item.img,
fw: item.system.fw,
attribute: item.system.attribute,
pp: item.system.pp,
calc: item.system.calc,
} as M5SkillCalculated;
-
- // Adjust attribute Aussehen based on Athletik skill
- if (item.name === "Athletik") {
- ret.attributes.au.value += Math.floor(item.system.fw / 3);
- }
-
- // Adjust stat Bewegungsweite based on Laufen skill
- if (item.name === "Laufen") {
- ret.stats.movement.value += Math.floor(item.system.fw / 3);
- }
});
}
@@ -570,8 +521,17 @@ export class M5Character extends Actor {
ret.spells[item.id] = {
label: item.name,
+ icon: item.img,
process: "midgard5.spell-process-" + item.system.process,
calc: item.system.calc,
+ type: item.system.type,
+ castDuration: item.system.castDuration || 0,
+ ap: item.system.ap || 0,
+ range: item.system.range || 0,
+ effectTarget: item.system.effectTarget,
+ effectArea: item.system.effectArea,
+ effectDuration: item.system.effectDuration || 0,
+ equipped: item.system?.equipped || false,
};
});
}
@@ -585,6 +545,7 @@ export class M5Character extends Actor {
ret.kampfkuenste[item.id] = {
label: item.name,
+ icon: item.img,
isKido: item.system.isKido,
type: item.system.type,
variante: item.system.variante,
diff --git a/source/module/actors/M5ModAggregate.ts b/source/module/actors/M5ModAggregate.ts
index 63350eb..f1eca6b 100644
--- a/source/module/actors/M5ModAggregate.ts
+++ b/source/module/actors/M5ModAggregate.ts
@@ -41,8 +41,9 @@ export default class M5ModAggregate {
this.push({ type: M5ModType.STAT, id: M5Stats.AP, operation: M5ModOperation.SET, value: calc.stats.ap.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.PROTECTION_LP, operation: M5ModOperation.SET, value: calc.stats.lpProtection.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.PROTECTION_AP, operation: M5ModOperation.SET, value: calc.stats.apProtection.value }, characterString);
- this.push({ type: M5ModType.STAT, id: M5Stats.PERCEPTION, operation: M5ModOperation.SET, value: calc.stats.perception.value }, characterString);
- this.push({ type: M5ModType.STAT, id: M5Stats.DRINKING, operation: M5ModOperation.SET, value: calc.stats.drinking.value }, characterString);
+ this.push({ type: M5ModType.STAT, id: M5Stats.DEPRIVATION_COLD, operation: M5ModOperation.SET, value: calc.stats.deprivationCold.value }, characterString);
+ this.push({ type: M5ModType.STAT, id: M5Stats.DEPRIVATION_HEAT, operation: M5ModOperation.SET, value: calc.stats.deprivationHeat.value }, characterString);
+ this.push({ type: M5ModType.STAT, id: M5Stats.DEPRIVATION_FOOD, operation: M5ModOperation.SET, value: calc.stats.deprivationFood.value }, characterString);
}
push(mod: M5ItemMod, source: string) {
diff --git a/source/module/items/M5Item.ts b/source/module/items/M5Item.ts
index 85c6e9b..24b7c3f 100644
--- a/source/module/items/M5Item.ts
+++ b/source/module/items/M5Item.ts
@@ -13,12 +13,13 @@ export class M5Item extends Item {
const character = actor as M5Character;
const itemData = (this as any).system;
const calc = itemData.calc;
+ const name = (this as any).name;
if (itemType === "item") {
calc.containers = null;
if (actor) {
- const actorCalc = actor.derivedData({ containers: false, items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true });
+ const actorCalc = actor.derivedData({ containers: false, items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true });
if (actorCalc) {
calc.containers = actorCalc.gear.containers;
}
@@ -45,14 +46,39 @@ export class M5Item extends Item {
},
];
+ // Adjust attribute Aussehen based on Athletik skill
+ if (name === "Athletik") {
+ itemData.mods[0] = { type: "attribute", id: "au", operation: "add100", value: Math.floor(calc.fw / 3) };
+ }
+ // Adjust stat Bewegungsweite based on Laufen skill
+ if (name === "Laufen") {
+ itemData.mods[0] = { type: "stat", id: "movement", operation: "add", value: Math.floor(calc.fw / 3) };
+ }
+
+ // Adjust stat Kälte based on Überleben (Gebirge) skill
+ if (name === "Überleben (Gebirge)") {
+ itemData.mods[0] = { type: "stat", id: "deprivationCold", operation: "add", value: Math.floor(calc.fw * 5) };
+ }
+
+ // // Adjust stat Kälte based on Überleben (Steppe) skill
+ if (name === "Überleben (Steppe)") {
+ itemData.mods[0] = { type: "stat", id: "deprivationHeat", operation: "add", value: Math.floor(calc.fw * 5) };
+ }
+ // // Adjust stat Durst & Hunger based on Robustheit skill
+ if (name === "Robustheit") {
+ itemData.mods[0] = { type: "stat", id: "deprivationFood", operation: "add", value: Math.floor(calc.fw * 5) };
+ }
+
if (character) {
const actorCalc = character.derivedData({
+ containers: true,
skills: true,
items: true,
spells: true,
effects: true,
kampfkuenste: true,
encumbrance: true,
+ class: true,
});
if (actorCalc?.skillMods && Object.keys(actorCalc.skillMods).indexOf(itemId) !== -1) {
pairs = pairs.concat(actorCalc.skillMods[itemId]);
@@ -89,7 +115,7 @@ export class M5Item extends Item {
calc.containers = null;
if (actor) {
- const actorCalc = character.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true });
+ const actorCalc = character.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true });
if (actorCalc) {
calc.ew += actorCalc.stats.attackBonus.value;
calc.combatSkills = actorCalc.skills.combat;
@@ -124,7 +150,7 @@ export class M5Item extends Item {
calc.containers = null;
if (actor) {
- const actorCalc = character.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true });
+ const actorCalc = character.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true });
if (actorCalc) {
calc.ew += actorCalc.stats.defense.value + actorCalc.stats.defenseBonus.value;
calc.combatSkills = actorCalc.skills.combat;
@@ -157,7 +183,7 @@ export class M5Item extends Item {
itemData.mods[5] = { type: "stat", id: "apProtection", operation: "set", value: itemData.apProtection };
calc.containers = null;
if (actor) {
- const actorCalc = actor.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true });
+ const actorCalc = actor.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true });
if (actorCalc) {
calc.containers = actorCalc.gear.containers;
}
@@ -171,7 +197,7 @@ export class M5Item extends Item {
} else if (itemType === "spell") {
calc.fw = 0;
if (actor) {
- const actorCalc = character.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true });
+ const actorCalc = character.derivedData({ containers: true, items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true });
if (actorCalc) {
calc.ew = actorCalc.stats.spellCasting.value;
}
@@ -183,7 +209,7 @@ export class M5Item extends Item {
calc.generalSkills = null;
if (actor) {
- const actorCalc = character.derivedData({ items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true });
+ const actorCalc = character.derivedData({ containers: true, items: true, spells: true, effects: true, kampfkuenste: true, encumbrance: true, class: true });
if (actorCalc) {
calc.generalSkills = actorCalc.skills.general;
}
@@ -197,6 +223,9 @@ export class M5Item extends Item {
itemData.rolls.formulas[0].label = skill.name;
}
}
+ } else if (itemType === "class") {
+ itemData.mods[0] = { type: "stat", id: "resistanceBody", operation: "add", value: itemData.resistanceBody };
+ itemData.mods[1] = { type: "stat", id: "resistanceMind", operation: "add", value: itemData.resistanceMind };
}
if (itemData?.mods) {
calc.mods = {};
@@ -318,7 +347,7 @@ export class M5Item extends Item {
}
}
- const roll = new M5Roll(rollData, this.actor, item.name);
+ const roll = new M5Roll(rollData, this.actor, item.name, item.id);
return roll.toMessage();
} else {
ChatMessage.create({
diff --git a/source/module/rolls/M5Roll.ts b/source/module/rolls/M5Roll.ts
index 9a5f316..81f49fb 100644
--- a/source/module/rolls/M5Roll.ts
+++ b/source/module/rolls/M5Roll.ts
@@ -11,7 +11,7 @@ export class M5Roll {
public _total: number = 0;
public pool: PoolTerm = null;
- constructor(public data: M5RollData, public actor: any, public label: string) {
+ constructor(public data: M5RollData, public actor: any, public label: string, public id?: string) {
//super(null)
//this.data = rollData
}
@@ -26,10 +26,10 @@ export class M5Roll {
.map((rollName, index) => {
indexMap.set(index, rollName);
const formula = this.data.rolls[rollName];
+ formula.formula = index === 0 && this.id !== "-1" ? formula.formula.replace(/(\d*d\d*)/, `{$1 + ${this.data.b.modifier}}`) : formula.formula;
const roll = new Roll(formula.formula, this.data);
return roll;
});
-
this.pool = PoolTerm.fromRolls(rolls);
console.log("evaluate", this._evaluated, this.pool);
return this.pool.evaluate({ async: true }).then((results) => {
@@ -66,7 +66,7 @@ export class M5Roll {
const parseResult = M5Roll.parseDiceSides(rollResult.formula);
//console.log("evaluate roll", parseResult)
if (parseResult?.sides === 20) {
- if (roll.total < 20) {
+ if (roll.total < this.data.b.difficulty) {
if (rowRes === M5EwResult.TBD || rowRes === M5EwResult.HIGH) rowRes = M5EwResult.FAIL;
} else {
if (rowRes === M5EwResult.TBD) rowRes = M5EwResult.PASS;
@@ -88,6 +88,50 @@ export class M5Roll {
});
this.data.res.label = this.label;
+ if ((game as Game).settings.get("midgard5", "automatedPP") && this.data.iType !== null) {
+ if ((this.data.i.type === "language" || this.data.i.type === "general") && this.data.rolls[0].dice[0] >= 16) {
+ this.actor.items.get(this.id).update({
+ system: {
+ pp: this.data.i.pp + 1,
+ },
+ });
+ } else if (this.data.rolls[0].dice[0] === 20) {
+ if (this.data.i.type === "combat") {
+ // Rolling through skill
+ this.actor.items.get(this.id).update({
+ system: {
+ pp: this.data.i.pp + 1,
+ },
+ });
+ } else if (this.data.iType === "weapon") {
+ // Rolling through Weapon Item
+ const skill = this.actor.items.get(this.data.i.skillId);
+ skill.update({
+ system: {
+ pp: skill.system.pp + 1,
+ },
+ });
+ } else if (this.data.iType === "defensiveWeapon") {
+ // Rolling through defensiveWeapon Item
+ const skill = this.actor.items.get(this.data.i.skillId);
+ skill.update({
+ system: {
+ pp: skill.system.pp + 1,
+ },
+ });
+ } else if (this.data.iType === "spell") {
+ // Rolling through Spell Item
+ const klasse = this.actor.items.find((x) => x.type === "class" && x.system.equipped);
+ klasse.update({
+ system: {
+ lernKostenZauber: {
+ [this.data.i.process]: { pp: klasse.system.lernKostenZauber[this.data.i.process].pp + 1 },
+ },
+ },
+ });
+ }
+ }
+ }
this._evaluated = true;
return this;
@@ -99,20 +143,28 @@ export class M5Roll {
}
async toMessage() {
+ let checkOptions = await this.popUp({ isPW: this.data.rolls[0].label === (game as Game).i18n.localize("midgard5.pw") });
+ if (checkOptions["cancelled"]) {
+ return;
+ } else {
+ this.data.b = checkOptions;
+ }
+
if (!this._evaluated) await this.evaluate();
+ const faces = this.pool.dice.map((x) => x.faces);
- const rMode = (game as Game).settings.get("core", "rollMode");
-
+ const rMode = checkOptions["rollMode"] || (game as Game).settings.get("core", "rollMode");
const chatData = {
type: CONST.CHAT_MESSAGE_TYPES.ROLL,
content: await this.render(),
speaker: ChatMessage.getSpeaker({ actor: this.actor }),
sound: CONFIG.sounds.dice,
roll: Roll.fromTerms([this.pool]),
+ flags: { data: this.data, rerolled: false, faces: faces },
};
- ChatMessage.applyRollMode(chatData, rMode);
- return ChatMessage.create(chatData);
+ let foo = ChatMessage.applyRollMode(chatData, rMode);
+ return ChatMessage.implementation["create"](foo, { rollMode: rMode });
}
static fromAttributeValue(actor: any, attributeKey: string, attributeValue: number) {
@@ -195,13 +247,13 @@ export class M5Roll {
return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.brawl"));
}
- static perception(actor: any) {
+ static deprivationCold(actor: any) {
const rollData = actor.getRollData() as M5RollData;
rollData.rolls["0"] = {
- formula: "1d20 + @c.calc.stats.perception.value + @c.calc.stats.perceptionFW",
+ formula: "@c.calc.stats.deprivationCold.value -1D100",
enabled: true,
- label: (game as Game).i18n.localize("midgard5.perception"),
+ label: (game as Game).i18n.localize("midgard5.deprivationCold"),
result: "",
total: 0,
totalStr: "",
@@ -209,16 +261,16 @@ export class M5Roll {
css: "",
} as M5RollResult;
- return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.perception"));
+ return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.deprivationCold"));
}
- static drinking(actor: any) {
+ static deprivationHeat(actor: any) {
const rollData = actor.getRollData() as M5RollData;
rollData.rolls["0"] = {
- formula: "1d20 + @c.calc.stats.drinking.value + @c.calc.stats.drinkingFW",
+ formula: "@c.calc.stats.deprivationHeat.value -1D100",
enabled: true,
- label: (game as Game).i18n.localize("midgard5.drinking"),
+ label: (game as Game).i18n.localize("midgard5.deprivationHeat"),
result: "",
total: 0,
totalStr: "",
@@ -226,7 +278,41 @@ export class M5Roll {
css: "",
} as M5RollResult;
- return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.drinking"));
+ return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.deprivationHeat"));
+ }
+
+ static deprivationFood(actor: any) {
+ const rollData = actor.getRollData() as M5RollData;
+
+ rollData.rolls["0"] = {
+ formula: "@c.calc.stats.deprivationFood.value -1D100",
+ enabled: true,
+ label: (game as Game).i18n.localize("midgard5.deprivationFood"),
+ result: "",
+ total: 0,
+ totalStr: "",
+ dice: {},
+ css: "",
+ } as M5RollResult;
+
+ return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.deprivationFood"));
+ }
+
+ static cleanSpell(actor: any) {
+ const rollData = actor.getRollData() as M5RollData;
+
+ rollData.rolls["0"] = {
+ formula: "1d20 + @c.calc.stats.spellCasting.value",
+ enabled: true,
+ label: (game as Game).i18n.localize("midgard5.spellCasting"),
+ result: "",
+ total: 0,
+ totalStr: "",
+ dice: {},
+ css: "",
+ } as M5RollResult;
+
+ return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.spellCasting"));
}
static defense(actor: any) {
@@ -313,6 +399,46 @@ export class M5Roll {
return null;
}
+
+ async popUp({
+ useFortune = false,
+ difficulty = 20,
+ modifier = 0,
+ rollModes = CONFIG.Dice.rollModes,
+ rollMode = "",
+ template = "systems/midgard5/templates/chat/task-check-dialog.hbs",
+ isPW = false,
+ } = {}) {
+ const html = await renderTemplate(template, { useFortune, difficulty, modifier, rollModes, rollMode, isPW });
+ return new Promise((resolve) => {
+ const data = {
+ title: (game as Game).i18n.localize("midgard5.chat.roll"),
+ content: html,
+ buttons: {
+ roll: {
+ label: (game as Game).i18n.localize("midgard5.chat.roll"),
+ callback: (html) => resolve(this._processTaskCheckOptions(html[0].querySelector("form"))),
+ },
+ cancel: {
+ label: (game as Game).i18n.localize("midgard5.chat.cancel"),
+ callback: (html) => resolve({ cancelled: true }),
+ },
+ },
+ default: "roll",
+ close: () => resolve({ cancelled: true }),
+ };
+
+ new Dialog(data, null).render(true);
+ });
+ }
+
+ _processTaskCheckOptions(form) {
+ return {
+ difficulty: parseInt(form.difficulty?.value),
+ modifier: parseInt(form.modifier?.value),
+ rollMode: form.rollMode?.value,
+ };
+ }
}
interface FormulaParseResult {
diff --git a/source/module/rolls/reroll.ts b/source/module/rolls/reroll.ts
new file mode 100644
index 0000000..9fa565a
--- /dev/null
+++ b/source/module/rolls/reroll.ts
@@ -0,0 +1,108 @@
+import { M5RollData, M5RollResult } from "../M5Base";
+import { M5Roll } from "./M5Roll";
+
+export const reroll = async (roll) => {
+ const message = (game as Game).messages.get(roll.attr("data-message-id"));
+ const actor = (game as Game).actors.get(message["speaker"].actor);
+
+ const template = "systems/midgard5/templates/chat/reroll-dialog.hbs";
+ const html = await renderTemplate(template, { sg: actor.system.sg, gp: actor.system.gp });
+ // Button defining
+ let buttons = {};
+ buttons = {
+ destiny: {
+ icon: ' ',
+ label: (game as Game).i18n.localize("midgard5.chat.destiny"),
+ callback: () => rerollDie("destiny", "sg"),
+ },
+ luckPoints: {
+ icon: ' ',
+ label: (game as Game).i18n.localize("midgard5.chat.luckPoint"),
+ callback: () => rerollDie("luckPoint", "gp"),
+ },
+ modify: {
+ icon: ' ',
+ label: (game as Game).i18n.localize("midgard5.chat.modify") + " +" + (message["flags"].faces[0] === 100 ? 10 : 2),
+ callback: () => rerollDie("modify", "gp"),
+ },
+ cancel: {
+ icon: ' ',
+ label: (game as Game).i18n.localize("midgard5.chat.cancel"),
+ },
+ };
+
+ // Dialog object
+ new Dialog(
+ {
+ title: (game as Game).i18n.localize("midgard5.chat.reroll"),
+ content: html,
+ buttons,
+ render: function () {},
+ default: "luckPoints",
+ },
+ {
+ classes: ["midgard5"],
+ }
+ ).render(true);
+
+ async function rerollDie(type, target) {
+ // Update the "content" field
+ let rollData = actor.getRollData() as M5RollData;
+ const flagData = message["flags"].data;
+ rollData.c = flagData.c;
+ rollData.i = flagData.i;
+ rollData.b = flagData.b;
+ rollData.iType = flagData.iType;
+ rollData.res.label = flagData.res.label + " (" + (game as Game).i18n.localize(`midgard5.chat.${type}`) + ")";
+ actor.update({
+ system: {
+ [target]: actor.system[target] - 1,
+ },
+ });
+ if (type !== "modify") {
+ for (var key in flagData.rolls) {
+ if (!!flagData.rolls[key]) {
+ rollData.rolls[key] = {
+ formula: flagData.rolls[key]?.formula,
+ enabled: flagData.rolls[key]?.enabled,
+ label: flagData.rolls[key]?.label,
+ result: "",
+ total: 0,
+ totalStr: "",
+ dice: {},
+ css: "",
+ } as M5RollResult;
+ }
+ }
+ } else {
+ for (var key in flagData.rolls) {
+ if (!!flagData.rolls[key]) {
+ rollData.rolls[key] = {
+ formula: key === "0" ? flagData.rolls[key]?.result + " + " + (message["flags"].faces[0] === 100 ? 10 : 2) : flagData.rolls[key]?.result,
+ enabled: flagData.rolls[key]?.enabled,
+ label: flagData.rolls[key]?.label,
+ result: "",
+ total: 0,
+ totalStr: "",
+ dice: {},
+ css: "",
+ } as M5RollResult;
+ }
+ }
+ }
+
+ const newRoll = new M5Roll(rollData, actor, rollData.res.label, "-1");
+ if (!newRoll._evaluated) await newRoll.evaluate();
+
+ const chatData = {
+ type: CONST.CHAT_MESSAGE_TYPES.ROLL,
+ content: await newRoll.render(),
+ speaker: ChatMessage.getSpeaker({ actor: actor }),
+ sound: CONFIG.sounds.dice,
+ roll: Roll.fromTerms([newRoll.pool]),
+ flags: { rerolled: true },
+ };
+
+ message.update(chatData);
+ }
+};
diff --git a/source/module/sheets/M5CharacterSheet.ts b/source/module/sheets/M5CharacterSheet.ts
index 454a7ab..01b8b5b 100644
--- a/source/module/sheets/M5CharacterSheet.ts
+++ b/source/module/sheets/M5CharacterSheet.ts
@@ -77,7 +77,6 @@ export default class M5CharacterSheet extends ActorSheet {
let target = event.target.closest("[data-attribute]") as HTMLElement;
let attributeValue = target ? parseInt(target.dataset.value) : null;
let attributeStr = target ? target.dataset.attribute : null;
-
const roll = M5Roll.fromAttributeValue(this.actor, attributeStr, attributeValue);
await roll.toMessage();
});
@@ -194,6 +193,36 @@ export default class M5CharacterSheet extends ActorSheet {
});
});
+ html.find(".pp-increase").on("click", async (event) => {
+ let target = event.target.closest("[data-pp-name]") as HTMLElement;
+ let ppName = target ? target.dataset.ppName : null;
+ const context = this.actor as any;
+ const item = context.items.find((x) => x.type === "class" && x.system.equipped);
+ item.update({
+ system: {
+ lernKostenZauber: {
+ [ppName]: { pp: context.system.lernKostenZauber[ppName].pp + 1 },
+ },
+ },
+ });
+ this.render();
+ });
+
+ html.find(".pp-decrease").on("click", async (event) => {
+ let target = event.target.closest("[data-pp-name]") as HTMLElement;
+ let ppName = target ? target.dataset.ppName : null;
+ const context = this.actor as any;
+ const item = context.items.find((x) => x.type === "class" && x.system.equipped);
+ item.update({
+ system: {
+ lernKostenZauber: {
+ [ppName]: { pp: context.system.lernKostenZauber[ppName].pp - 1 },
+ },
+ },
+ });
+ this.render();
+ });
+
html.find(".fw-increase").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
@@ -247,13 +276,23 @@ export default class M5CharacterSheet extends ActorSheet {
await roll.toMessage();
});
- html.find(".roll-perception-button").on("click", async (event) => {
- const roll = M5Roll.perception(this.actor);
+ html.find(".roll-cleanSpell-button").on("click", async (event) => {
+ const roll = M5Roll.cleanSpell(this.actor);
await roll.toMessage();
});
- html.find(".roll-drinking-button").on("click", async (event) => {
- const roll = M5Roll.drinking(this.actor);
+ html.find(".roll-deprivationCold-button").on("click", async (event) => {
+ const roll = M5Roll.deprivationCold(this.actor);
+ await roll.toMessage();
+ });
+
+ html.find(".roll-deprivationHeat-button").on("click", async (event) => {
+ const roll = M5Roll.deprivationHeat(this.actor);
+ await roll.toMessage();
+ });
+
+ html.find(".roll-deprivationFood-button").on("click", async (event) => {
+ const roll = M5Roll.deprivationFood(this.actor);
await roll.toMessage();
});
@@ -433,6 +472,14 @@ export default class M5CharacterSheet extends ActorSheet {
}
});
+ html.find(".class-item-edit").on("click", async (event) => {
+ this.actor.items.find((x) => x.type === "class").sheet.render(true);
+ });
+
+ html.find(".class-item-delete").on("click", async (event) => {
+ this.actor.items.find((x) => x.type === "class").delete();
+ });
+
// Drag & Drop
const dragDrop = new DragDrop({
dragSelector: ".items-list .item",
diff --git a/source/module/sheets/M5ItemSheet.ts b/source/module/sheets/M5ItemSheet.ts
index 1274a50..1403e2b 100644
--- a/source/module/sheets/M5ItemSheet.ts
+++ b/source/module/sheets/M5ItemSheet.ts
@@ -7,6 +7,13 @@ export class M5ItemSheet extends ItemSheet {
width: 640,
height: 480,
classes: ["midgard5", "sheet", "item"],
+ tabs: [
+ {
+ navSelector: ".sheet-navigation",
+ contentSelector: ".sheet-content",
+ initial: "base_values",
+ },
+ ],
});
}
diff --git a/source/settings.ts b/source/settings.ts
new file mode 100644
index 0000000..d9ba705
--- /dev/null
+++ b/source/settings.ts
@@ -0,0 +1,16 @@
+/* global game */
+
+/**
+ * Define all game settings here
+ * @return {Promise}
+ */
+export const loadSettings = async function () {
+ (game as Game).settings.register("midgard5", "automatedPP", {
+ name: "Automatische Praxispunkte",
+ hint: "Falls aktiv, werden Praxispunkte automatisch angerechnet.",
+ scope: "world",
+ config: true,
+ default: true,
+ type: Boolean,
+ });
+};
diff --git a/source/style/Character-sheet.less b/source/style/Character-sheet.less
index 13794ac..d344903 100644
--- a/source/style/Character-sheet.less
+++ b/source/style/Character-sheet.less
@@ -374,4 +374,36 @@
}
}
}
+
+ .chip {
+ display: inline-block;
+ padding: 0 25px;
+ height: 35px;
+ font-size: 16px;
+ line-height: 35px;
+ border-radius: 25px;
+ background-color: #f1f1f1;
+ }
+
+ .closebtn {
+ padding-left: 10px;
+ color: #888;
+ font-weight: bold;
+ float: right;
+ font-size: 20px;
+ cursor: pointer;
+ }
+
+ .closebtn:hover {
+ color: #000;
+ }
+
+ .pp-listing {
+ margin: 0 2rem;
+ flex: 1 0 16%;
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: baseline;
+ }
}
diff --git a/source/style/item-sheet.less b/source/style/item-sheet.less
index 57133d6..fc1faf6 100644
--- a/source/style/item-sheet.less
+++ b/source/style/item-sheet.less
@@ -1,6 +1,6 @@
// main: midgard5.less
-.midgard5.sheet.item {
+.midgard5.sheet.item {
form {
display: flex;
flex-direction: column;
@@ -15,10 +15,11 @@
}
.item-img {
height: 64px;
- width: 64px;
+ width: 64px;
}
- td, th {
+ td,
+ th {
padding: 0 0.5rem 0 0.5rem;
&.center {
@@ -40,7 +41,7 @@
.col-create {
width: 3rem;
text-align: center;
-
+
button {
background: rgba(255, 255, 255, 0.5);
}
diff --git a/source/system.json b/source/system.json
index 82bae51..dc58156 100644
--- a/source/system.json
+++ b/source/system.json
@@ -3,7 +3,7 @@
"name": "midgard5",
"title": "Midgard 5. Edition",
"description": "The German RPG Midgard 5. Edition",
- "version": "2.5.0",
+ "version": "2.6.0",
"compatibility": {
"minimum": "10",
"verified": "11",
@@ -24,8 +24,8 @@
"primaryTokenAttribute": "lp",
"secondaryTokenAttribute": "ap",
"url": "https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5",
- "manifest": "https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/releases/download/v2.5.0/system.json",
- "download": "https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/releases/download/v2.5.0/midgard5-v2.5.0.zip",
+ "manifest": "https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/releases/download/v2.6.0/system.json",
+ "download": "https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/releases/download/v2.6.0/midgard5-v2.6.0.zip",
"initiative": "@c.calc.attributes.gw.value",
"license": "LICENSE.txt"
}
diff --git a/source/template.json b/source/template.json
index 928e687..ba41359 100644
--- a/source/template.json
+++ b/source/template.json
@@ -6,7 +6,7 @@
"info": {
"description": "",
"background": "",
- "class": "",
+ "class": {},
"race": "",
"magicUsing": false,
"showAllItems": false,
@@ -101,7 +101,11 @@
"meditieren": { "fw": 0, "attribute": "wk", "initial": 8, "pp": 0 },
"menschenkenntnis": { "fw": 3, "attribute": "in", "initial": 8, "pp": 0 },
"meucheln": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
- "musizieren": { "fw": 0, "attribute": "gs", "initial": 12, "pp": 0 },
+ "musizierenFloete": { "fw": 0, "attribute": "gs", "initial": 12, "pp": 0 },
+ "musizierenBlas": { "fw": 0, "attribute": "gs", "initial": 12, "pp": 0 },
+ "musizierenRythmus": { "fw": 0, "attribute": "gs", "initial": 12, "pp": 0 },
+ "musizierenStreich": { "fw": 0, "attribute": "gs", "initial": 12, "pp": 0 },
+ "musizierenZupf": { "fw": 0, "attribute": "gs", "initial": 12, "pp": 0 },
"ninjutsu": { "fw": 0, "attribute": "gw", "initial": 8, "pp": 0 },
"naturkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"orakelkunst": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
@@ -131,7 +135,9 @@
"tauchen": { "fw": 6, "attribute": "ko", "initial": 8, "pp": 0 },
"tanzen": { "fw": 6, "attribute": "ko", "initial": 8, "pp": 0 },
"tierkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
- "ueberleben": { "fw": 6, "attribute": "in", "initial": 8, "pp": 0 },
+ "ueberlebenWald": { "fw": 6, "attribute": "in", "initial": 8, "pp": 0 },
+ "ueberlebenSteppe": { "fw": 6, "attribute": "in", "initial": 8, "pp": 0 },
+ "ueberlebenGebirge": { "fw": 6, "attribute": "in", "initial": 8, "pp": 0 },
"verfuehren": { "fw": 3, "attribute": "pa", "initial": 8, "pp": 0 },
"verhoeren": { "fw": 3, "attribute": "pa", "initial": 8, "pp": 0 },
"verstellen": { "fw": 3, "attribute": "pa", "initial": 8, "pp": 0 },
@@ -140,12 +146,11 @@
"wahrsagen": { "fw": 0, "attribute": "zt", "initial": 8, "pp": 0 },
"wasserkampf": { "fw": 0, "attribute": "gw", "initial": 8, "pp": 0 },
"zauberkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 }
- }
+ }
}
},
"gear": {
- "gear": {
- }
+ "gear": {}
}
},
"character": {
@@ -154,7 +159,7 @@
}
},
"Item": {
- "types": ["skill", "weapon", "defensiveWeapon", "armor", "spell", "kampfkunst", "item", "effect", "container"],
+ "types": ["skill", "weapon", "defensiveWeapon", "armor", "spell", "kampfkunst", "item", "effect", "container", "class"],
"templates": {
"itemDescription": {
"description": ""
@@ -207,16 +212,17 @@
"equipped": false
},
"valuable": {
- "valuable": false,
+ "valuable": false,
"item-wealth": true
},
"hoarded": {
- "hoarded": false,
+ "hoarded": false,
"inHoard": true
},
"physical": {
"value": 0,
"weight": 0,
+ "capacity": 0,
"containerId": "",
"magic": false
},
@@ -231,29 +237,36 @@
"spellSelection": {
"spellProcessSelection": {
"none": "midgard5.spell-process-none",
+ "artefakte": "midgard5.spell-process-artefakte",
"beherrschen": "midgard5.spell-process-beherrschen",
"bewegen": "midgard5.spell-process-bewegen",
- "blutzauber": "midgard5.spell-process-blutzauber",
+ "beschwoeren": "midgard5.spell-process-beschwoeren",
+ "blutmagie": "midgard5.spell-process-blutmagie",
"chaoswunder": "midgard5.spell-process-chaoswunder",
+ "dweomer": "midgard5.spell-process-dweomer",
+ "erhaltung": "midgard5.spell-process-erhaltung",
"erkennen": "midgard5.spell-process-erkennen",
"erschaffen": "midgard5.spell-process-erschaffen",
"formen": "midgard5.spell-process-formen",
"finstere_magie": "midgard5.spell-process-finstere_magie",
- "veraendern": "midgard5.spell-process-veraendern",
- "zerstoeren": "midgard5.spell-process-zerstoeren",
- "wundertat": "midgard5.spell-process-wundertat",
- "dweomer": "midgard5.spell-process-dweomer",
- "wilder_dweomer": "midgard5.spell-process-wilder_dweomer",
- "zauberlied": "midgard5.spell-process-zauberlied",
- "salz": "midgard5.spell-process-salz",
- "thaumagraphie": "midgard5.spell-process-thaumagraphie",
- "beschwoeren": "midgard5.spell-process-beschwoeren",
+ "kampfverse": "midgard5.spell-process-kampfverse",
+ "namensmagie": "midgard5.spell-process-namensmagie",
"nekromantie": "midgard5.spell-process-nekromantie",
- "thaumatherapie": "midgard5.spell-process-thaumatherapie",
+ "runenstaebe": "midgard5.spell-process-zauberrunen",
+ "thaumatherapie": "midgard5.spell-process-runenstaebe",
+ "veraendern": "midgard5.spell-process-veraendern",
+ "vigilsignien": "midgard5.spell-process-vigilsignien",
+ "wilder_dweomer": "midgard5.spell-process-wilder_dweomer",
+ "wundertat": "midgard5.spell-process-wundertat",
+ "zauberblaetter": "midgard5.spell-process-zauberblaetter",
+ "zauberlied": "midgard5.spell-process-zauberlied",
"zaubermittel": "midgard5.spell-process-zaubermittel",
- "zauberschutz": "midgard5.spell-process-zauberschutz",
"zauberrunen": "midgard5.spell-process-zauberrunen",
- "zaubersiegel": "midgard5.spell-process-siegel"
+ "zaubersalz": "midgard5.spell-process-zaubersalz",
+ "zauberschutz": "midgard5.spell-process-zauberschutz",
+ "zaubersiegel": "midgard5.spell-process-zaubersiegel",
+ "zaubertaenze": "midgard5.spell-process-zaubertaenze",
+ "zerstoeren": "midgard5.spell-process-zerstoeren"
},
"spellTypeSelection": {
"gedanke": "midgard5.spell-type-gedanke",
@@ -264,7 +277,8 @@
"umgebung": "midgard5.spell-target-umgebung",
"geist": "midgard5.spell-target-geist",
"koerper": "midgard5.spell-target-koerper"
- }
+ },
+ "spellSpecialization": "none"
},
"kampfkunstSelection": {
"kampfkunstTypeSelection": {
@@ -273,7 +287,7 @@
"finte": "midgard5.kampfkunst-type-finte",
"geist": "midgard5.kampfkunst-type-geist",
"schießkunst": "midgard5.kampfkunst-type-schießkunst",
- "fechten": "midgard5.kampfkunst-type-fechten"
+ "fechtkunst": "midgard5.kampfkunst-type-fechtkunst"
},
"kidoTypeSelection": {
"angriff": "midgard5.kido-type-angriff",
@@ -284,7 +298,12 @@
"kampfkunstVarianteSelection": {
"anstuermen": "midgard5.kampfkunst-variante-anstuermen",
"attackieren": "midgard5.kampfkunst-variante-attackieren",
- "entwaffnen": "midgard5.kampfkunst-variante-entwaffnen"
+ "entwaffnen": "midgard5.kampfkunst-variante-entwaffnen",
+ "fechten": "midgard5.kampfkunst-variante-fechten",
+ "schusstechnik": "midgard5.kampfkunst-variante-schusstechnik",
+ "finten": "midgard5.kampfkunst-variante-finten",
+ "geistestechnik": "midgard5.kampfkunst-variante-geistestechnik",
+ "verteidigung": "midgard5.kampfkunst-variante-verteidigung"
},
"kidoVarianteSelection": {
"none": "midgard5.spell-process-none",
@@ -303,6 +322,7 @@
"templates": ["itemDescription", "attributeSelection"],
"fw": 0,
"attribute": "st",
+ "equipped": true,
"skill": "",
"type": "general",
"rolls": {
@@ -316,10 +336,11 @@
"output": ""
},
"pp": 0,
- "calc": {}
+ "calc": {},
+ "mods": {}
},
"item": {
- "templates": ["itemDescription", "equippable", "physical","valuable","hoarded"],
+ "templates": ["itemDescription", "equippable", "physical", "valuable", "hoarded"],
"rolls": {
"formulas": {},
"output": ""
@@ -346,7 +367,7 @@
"calc": {}
},
"weapon": {
- "templates": ["itemDescription", "stats", "equippable", "physical","valuable","hoarded"],
+ "templates": ["itemDescription", "stats", "equippable", "physical", "valuable", "hoarded"],
"special": false,
"ranged": false,
"valuable": false,
@@ -371,7 +392,7 @@
"calc": {}
},
"defensiveWeapon": {
- "templates": ["itemDescription", "stats", "equippable", "physical","valuable","hoarded"],
+ "templates": ["itemDescription", "stats", "equippable", "physical", "valuable", "hoarded"],
"special": false,
"valuable": false,
"hoarded": false,
@@ -389,7 +410,7 @@
"calc": {}
},
"armor": {
- "templates": ["itemDescription", "stats", "equippable", "attributeMod", "physical","valuable","hoarded"],
+ "templates": ["itemDescription", "stats", "equippable", "attributeMod", "physical", "valuable", "hoarded"],
"lpProtection": 0,
"apProtection": 0,
"valuable": false,
@@ -436,6 +457,12 @@
"variante": "",
"isKido": false,
"ap": "",
+ "weapon": "",
+ "ep": "",
+ "rank": "",
+ "enemy": "",
+ "color": "",
+ "style": "",
"rolls": {
"formulas": {
"0": {
@@ -447,6 +474,154 @@
"output": ""
},
"calc": {}
+ },
+ "class": {
+ "templates": ["itemDescription"],
+ "magicUsing": false,
+ "equipped": true,
+ "resistanceBody": 1,
+ "resistanceMind": 0,
+ "calc": {},
+ "mods": {},
+ "lernKostenAllgemein": {
+ "alltag": 20,
+ "freiland": 20,
+ "halbwelt": 20,
+ "kampf": 20,
+ "koerper": 20,
+ "sozial": 20,
+ "unterwelt": 20,
+ "waffen": 20,
+ "wissen": 20
+ },
+ "lernKostenZauber": {
+ "beherrschen": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "bewegen": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "erkennen": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "erschaffen": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "formen": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "veraendern": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "zerstoeren": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "wundertat": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "dweomer": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "zauberlied": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "kampfverse": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "zaubertaenze": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "zaubersalz": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "runenstaebe": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "zaubersiegel": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "zauberrunen": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "thaumagraphie": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "erhaltung": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "zaubermittel": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "zauberschutz": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "zauberblaetter": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "vigilsignien": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "artefakte": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "chaoswunder": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "wilder_dweomer": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "nekromantie": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "finstere_magie": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "blutmagie": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "beschwoeren": {
+ "kosten": 0,
+ "pp": 0
+ },
+ "namensmagie": {
+ "kosten": 0,
+ "pp": 0
+ }
+ },
+ "lernKostenKamptechnik": {
+ "kampfkunst": 90,
+ "fechtkunst": 90,
+ "schiesskunst": 90,
+ "kido": 90
+ }
}
}
}
diff --git a/templates/chat/reroll-dialog.hbs b/templates/chat/reroll-dialog.hbs
new file mode 100644
index 0000000..a1b9583
--- /dev/null
+++ b/templates/chat/reroll-dialog.hbs
@@ -0,0 +1,18 @@
+
\ No newline at end of file
diff --git a/templates/chat/roll-m5.hbs b/templates/chat/roll-m5.hbs
index 8e06f8e..9e516fd 100644
--- a/templates/chat/roll-m5.hbs
+++ b/templates/chat/roll-m5.hbs
@@ -64,21 +64,43 @@
{{localize "midgard5.actor-ap"}}
{{i.ap}}
+
+ {{localize "midgard5.kampfkunst-ep"}}
+ {{i.ep}}
+
{{localize "midgard5.kampfkunst-type"}}
{{localize (m5concat "midgard5.kampfkunst-type-" i.type)}}
- {{#if (eq i.type "angriff")}}
-
- {{localize "midgard5.kampfkunst-variante"}}
- {{localize (m5concat "midgard5.kampfkunst-variante-" i.variante)}}
-
- {{/if}}
+
+ {{localize "midgard5.kampfkunst-variante"}}
+ {{localize (m5concat "midgard5.kampfkunst-variante-" i.variante)}}
+
+
+ {{localize "midgard5.kampfkunst-enemy"}}
+ {{i.enemy}}
+
+
+ {{localize "midgard5.kampfkunst-weapon"}}
+ {{i.weapon}}
+
{{else}}
{{localize "midgard5.actor-ap"}}
{{i.ap}}
+
+ {{localize "midgard5.kampfkunst-ep"}}
+ {{i.ep}}
+
+
+ {{localize "midgard5.kampfkunst-color"}}
+ {{i.color}}
+
+
+ {{localize "midgard5.kampfkunst-style"}}
+ {{i.style}}
+
{{localize "midgard5.kido-type"}}
{{localize (m5concat "midgard5.kido-type-" i.type)}}
@@ -88,6 +110,14 @@
{{localize "midgard5.kido-variante"}}
{{localize (m5concat "midgard5.kido-variante-" i.variante)}}
+
+ {{localize "midgard5.kampfkunst-enemy"}}
+ {{i.enemy}}
+
+
+ {{localize "midgard5.kampfkunst-weapon"}}
+ {{i.weapon}}
+
{{/if}}
{{/unless}}
{{/if}}
@@ -95,7 +125,7 @@
{{#each rolls as |roll index|}}
{{#if roll.enabled}}
- {{roll.label}}
+ {{roll.label}} {{#if (eq index '0')}} {{#if (gt ../b.modifier 0)}}+{{../b.modifier}}{{/if}}{{#if (gt 0 ../b.modifier)}}{{../b.modifier}}{{/if}}{{/if}}
{{roll.totalStr}}
{{roll.result}}
diff --git a/templates/chat/task-check-dialog.hbs b/templates/chat/task-check-dialog.hbs
new file mode 100644
index 0000000..6604497
--- /dev/null
+++ b/templates/chat/task-check-dialog.hbs
@@ -0,0 +1,22 @@
+
\ No newline at end of file
diff --git a/templates/sheets/character/base_values.hbs b/templates/sheets/character/base_values.hbs
index b7b9556..20b25b7 100644
--- a/templates/sheets/character/base_values.hbs
+++ b/templates/sheets/character/base_values.hbs
@@ -46,8 +46,8 @@
{{localize "midgard5.luckPoints"}}
-
-
+ {{localize "midgard5.valuable"}}
+ {{data.calc.stats.wealth}}
@@ -63,7 +63,7 @@
{{localize "midgard5.magicUsing"}}
-
+
{{localize "midgard5.movementRange"}}
@@ -104,23 +104,43 @@
{{data.calc.stats.resistanceBody.value}}
{{#if (eq data.info.race "Zwerg")}}
-
- {{localize "midgard5.hoard"}}
- {{data.calc.stats.hoard}}
-
-
-
-
- {{localize "midgard5.hoardMin"}}
- {{data.calc.stats.hoardMin}}
- {{localize "midgard5.hoard-next"}}
- {{data.calc.stats.hoardNext}}
-
+
+ {{localize "midgard5.hoard"}}
+ {{data.calc.stats.hoard}}
+
+
+ {{localize "midgard5.hoardMin"}}
+ {{data.calc.stats.hoardMin}}
+ {{localize "midgard5.hoard-next"}}
+ {{data.calc.stats.hoardNext}}
+
{{/if}}
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+ {{localize "midgard5.deprivationFood"}}
+ {{data.calc.stats.deprivationFood.value}}
+
+
+ {{localize "midgard5.deprivationHeat"}}
+ {{ data.calc.stats.deprivationHeat.value}}
+
+
+ {{localize "midgard5.deprivationCold"}}
+ {{data.calc.stats.deprivationCold.value}}
+
+
+
+
+
\ No newline at end of file
diff --git a/templates/sheets/character/combat.hbs b/templates/sheets/character/combat.hbs
index 9231f72..bd11d3c 100644
--- a/templates/sheets/character/combat.hbs
+++ b/templates/sheets/character/combat.hbs
@@ -8,9 +8,22 @@
{{localize "midgard5.movementRange"}}
{{data.calc.stats.movement.value}}
+
+
+
+
{{localize "midgard5.initiative"}}
+
+ {{#if (isSkillInList (localizeMidgard "anfuehren") data.calc.skills.general)}}
+ {{skillEwInList (localizeMidgard "anfuehren") data.calc.skills.general}}
+ {{else}}
+ {{skillEw actor._id data.skills.general.anfuehren}}
+ {{/if}}
+
+ {{localize "midgard5.actionrank"}}
{{data.calc.attributes.gw.value}}
+
{{localize "midgard5.defense"}}
{{data.calc.stats.defense.value}}
{{localize "midgard5.defenseBonus"}}
@@ -28,7 +41,7 @@
-
+
{{localize "midgard5.combat-join"}}
{{localize "midgard5.combat-ranged"}}
{{localize "midgard5.combat-spell"}}
@@ -41,6 +54,7 @@
+
{{localize "TYPES.Item.weapon"}}
{{localize "midgard5.ew"}}
{{localize "midgard5.damage"}}
@@ -52,6 +66,7 @@
{{#each data.calc.gear.weapons as |item itemId|}}
{{#if item.equipped}}
+
{{item.label}}{{#if item.special}}(*){{/if}}
{{item.calc.ew}}
{{item.damageBase}}
@@ -68,6 +83,7 @@
{{/each}}
+
{{localize "midgard5.brawl"}}
{{data.calc.stats.brawlFw}}
1d6 -4
@@ -80,6 +96,7 @@
+
{{localize "TYPES.Item.kampfkunst"}}
{{localize "midgard5.kampfkunst-variante-short"}}
{{localize "midgard5.ew"}}
@@ -90,6 +107,7 @@
{{#each data.calc.kampfkuenste as |item itemId|}}
+
{{item.label}}
{{#if item.isKido}}
@@ -99,9 +117,7 @@
{{/unless}}
{{else}}
{{localize (m5concat "midgard5.kampfkunst-type-" item.type)}}
- {{#if (eq item.type "angriff")}}
- ({{localize (m5concat "midgard5.kampfkunst-variante-" item.variante)}})
- {{/if}}
+ ({{localize (m5concat "midgard5.kampfkunst-variante-" item.variante)}})
{{/if}}
{{item.calc.ew}}
@@ -120,17 +136,20 @@
+
{{localize "midgard5.defense"}}
{{add data.calc.stats.defense.value data.calc.stats.defenseBonus.value}}
+
{{localize "midgard5.resistanceMind"}}
{{data.calc.stats.resistanceMind.value}}
+
{{localize "midgard5.resistanceBody"}}
{{data.calc.stats.resistanceBody.value}}
@@ -140,6 +159,7 @@
+
{{localize "TYPES.Item.defensiveWeapon"}}
{{localize "midgard5.ew"}}
{{localize "midgard5.defenseBonus-short"}}
@@ -151,6 +171,7 @@
{{#each data.calc.gear.defensiveWeapons as |item itemId|}}
{{#if item.equipped}}
+
{{item.label}}
{{item.calc.ew}}
{{item.defenseBonus}}
@@ -171,6 +192,7 @@
+
{{localize "TYPES.Item.armor"}}
{{localize "midgard5.actor-lp-short"}}
@@ -180,6 +202,7 @@
{{#each data.calc.gear.armor as |item itemId|}}
{{#if item.equipped}}
+
{{item.label}}
{{lpProtection}}
@@ -196,4 +219,44 @@
+
+ {{#if actor.system.info.magicUsing }}
+
+
+
+
+
+
+ {{localize "TYPES.Item.spell"}}
+ {{localize "midgard5.spell-castDuration"}}
+ {{localize "midgard5.actor-ap"}}
+ {{localize "midgard5.ew"}}
+
+
+
+
+
+ {{#each data.calc.spells as |item itemId|}}
+ {{#if item.equipped}}
+
+ {{item.label}}{{#if item.special}}(*){{/if}}
+ {{item.castDuration}}
+ {{item.ap}}
+ {{item.calc.ew}}
+
+ {{#if item.equipped}}
+
+ {{else}}
+
+ {{/if}}
+
+
+
+ {{/if}}
+ {{/each}}
+
+
+
+
+ {{/if}}
diff --git a/templates/sheets/character/effects.hbs b/templates/sheets/character/effects.hbs
index 59808f5..1d06a1b 100644
--- a/templates/sheets/character/effects.hbs
+++ b/templates/sheets/character/effects.hbs
@@ -1,6 +1,7 @@
+
{{localize "TYPES.Item.effect"}}
@@ -9,6 +10,7 @@
{{#each data.calc.gear.effects as |item itemId|}}
+
{{item.label}}
{{#if item.equipped}}
@@ -18,7 +20,9 @@
{{/unless}}
{{/if}}
+ {{!--{{#unless (eq item.label "Belastung")}}--}}
+ {{!--{{/unless}}--}}
{{/each}}
diff --git a/templates/sheets/character/gear.hbs b/templates/sheets/character/gear.hbs
index 4a5158a..79efc09 100644
--- a/templates/sheets/character/gear.hbs
+++ b/templates/sheets/character/gear.hbs
@@ -48,9 +48,9 @@
-
-
-
+
+
+
@@ -59,6 +59,7 @@
+{{#unless (eq (count data.calc.gear.containers) 0)}}
{{localize "midgard5.itemsInContainers"}}
{{#each data.calc.gear.containers as |container containerId|}}
@@ -68,6 +69,7 @@