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 @@ +
+
+ +
+ +
+
+ {{localize "midgard5.destiny"}}: + {{sg}} +
+
+ {{localize "midgard5.luckPoints"}}: + {{gp}} +
+
+
+
+
\ 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 @@ +
+
+ + +
+ {{#unless isPW}} +
+ + +
+ {{/unless}} +
+ + +
+
\ 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.deprivations"}} & {{localize "midgard5.deprivation"}}
+ + + + + + + + + + + + + + + + +
{{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.initiative"}}
+
{{localize "midgard5.actionrank"}}
@@ -41,6 +54,7 @@ + @@ -52,6 +66,7 @@ {{#each data.calc.gear.weapons as |item itemId|}} {{#if item.equipped}} + @@ -68,6 +83,7 @@ {{/each}} + @@ -80,6 +96,7 @@
{{localize "TYPES.Item.weapon"}} {{localize "midgard5.ew"}} {{localize "midgard5.damage"}}
{{item.label}}{{#if item.special}}(*){{/if}} {{item.calc.ew}} {{item.damageBase}}
{{localize "midgard5.brawl"}} {{data.calc.stats.brawlFw}} 1d6 -4
+ @@ -90,6 +107,7 @@ {{#each data.calc.kampfkuenste as |item itemId|}} + @@ -120,17 +136,20 @@
{{localize "TYPES.Item.kampfkunst"}} {{localize "midgard5.kampfkunst-variante-short"}} {{localize "midgard5.ew"}}
{{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}}
+ + + @@ -140,6 +159,7 @@
{{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}}
+ @@ -151,6 +171,7 @@ {{#each data.calc.gear.defensiveWeapons as |item itemId|}} {{#if item.equipped}} + @@ -171,6 +192,7 @@
{{localize "TYPES.Item.defensiveWeapon"}} {{localize "midgard5.ew"}} {{localize "midgard5.defenseBonus-short"}}
{{item.label}} {{item.calc.ew}} {{item.defenseBonus}}
+ @@ -180,6 +202,7 @@ {{#each data.calc.gear.armor as |item itemId|}} {{#if item.equipped}} +
{{localize "TYPES.Item.armor"}} {{localize "midgard5.actor-lp-short"}}
{{item.label}} {{lpProtection}} @@ -196,4 +219,44 @@
+ + {{#if actor.system.info.magicUsing }} +
+
+
{{localize "TYPES.Item.spell"}}
+ + + + + + + + + + + + + {{#each data.calc.spells as |item itemId|}} + {{#if item.equipped}} + + + + + + + + + {{/if}} + {{/each}} + +
{{localize "TYPES.Item.spell"}}{{localize "midgard5.spell-castDuration"}}{{localize "midgard5.actor-ap"}}{{localize "midgard5.ew"}}
{{item.label}}{{#if item.special}}(*){{/if}}{{item.castDuration}}{{item.ap}}{{item.calc.ew}} + {{#if item.equipped}} + + {{else}} + + {{/if}} +
+
+
+ {{/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 @@ + {{#each data.calc.gear.effects as |item itemId|}} + + {{!--{{#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 @@
{{localize "TYPES.Item.effect"}} @@ -9,6 +10,7 @@
{{item.label}} {{#if item.equipped}} @@ -18,7 +20,9 @@ {{/unless}} {{/if}}
+ @@ -82,6 +84,7 @@ {{#each ../data.calc.gear.items as |item itemId|}} {{#if (eq item.containerId containerId)}} + @@ -115,6 +118,7 @@ {{#each ../data.calc.gear.weapons as |item itemId|}} {{#if (eq item.containerId containerId)}} + @@ -144,6 +148,7 @@ {{#each ../data.calc.gear.defensiveWeapons as |item itemId|}} {{#if (eq item.containerId containerId)}} + @@ -173,6 +178,7 @@ {{#each ../data.calc.gear.armor as |item itemId|}} {{#if (eq item.containerId containerId)}} + @@ -205,6 +211,9 @@ {{/each}} +{{/unless}} + +

{{localize "midgard5.allItems"}} @@ -218,9 +227,11 @@

{{localize "TYPES.Item.item"}} {{localize "midgard5.item-quantity"}} {{localize "midgard5.item-value"}}
{{item.label}}
{{item.label}}
{{item.label}}
{{item.label}}
+ + {{#each data.calc.gear.containers as |item itemId|}} + @@ -243,6 +255,11 @@ {{item.weight}} kg {{/unless}} + + + + + + + + + + + + + {{#unless item.system.isKido}} @@ -47,7 +59,6 @@ {{/unless}} {{#unless item.system.isKido}} - {{#if (eq item.system.type "angriff")}} - {{/if}} {{else}} {{#unless (eq item.system.type "finte")}}
{{localize "TYPES.Item.container"}} {{localize "midgard5.item-value"}} {{localize "midgard5.item-weight"}}{{localize "midgard5.capacity"}} @@ -230,6 +241,7 @@
{{item.label}} + {{#unless (eq item.capacity "")}} + {{item.capacity}} kg + {{/unless}} + {{#if item.equipped}} @@ -265,6 +282,7 @@ + @@ -279,6 +297,7 @@ {{#each data.calc.gear.items as |item itemId|}} {{#if (or ../data.info.showAllItems (eq item.containerId ""))}} + @@ -321,6 +340,7 @@
{{localize "TYPES.Item.item"}} {{localize "midgard5.item-quantity"}} {{localize "midgard5.item-value"}}
{{item.label}}
+ @@ -333,6 +353,7 @@ {{#each data.calc.gear.weapons as |item itemId|}} {{#if (or ../data.info.showAllItems (eq item.containerId ""))}} + + +
{{localize "TYPES.Item.weapon"}} {{localize "midgard5.item-value"}} {{localize "midgard5.item-weight"}}
{{item.label}} {{#unless (or (eq item.value 0) (eq item.currency ""))}} @@ -366,6 +387,7 @@ + @@ -377,6 +399,7 @@ {{#each data.calc.gear.defensiveWeapons as |item itemId|}} {{#if (or ../data.info.showAllItems (eq item.containerId ""))}} + }} --}} + @@ -84,6 +70,7 @@
{{localize "TYPES.Item.defensiveWeapon"}} {{localize "midgard5.item-value"}} {{localize "midgard5.item-weight"}}
{{item.label}} {{#unless (or (eq item.value 0) (eq item.currency ""))}} @@ -410,6 +433,7 @@ + @@ -421,6 +445,7 @@ {{#each data.calc.gear.armor as |item itemId|}} {{#if (or ../data.info.showAllItems (eq item.containerId ""))}} + - +
{{localize "TYPES.Item.armor"}} {{localize "midgard5.item-value"}} {{localize "midgard5.item-weight"}}
{{item.label}} {{#unless (or (eq item.value 0) (eq item.currency ""))}} diff --git a/templates/sheets/character/main.hbs b/templates/sheets/character/main.hbs index 1039fc3..d5cef81 100644 --- a/templates/sheets/character/main.hbs +++ b/templates/sheets/character/main.hbs @@ -15,7 +15,14 @@
{{localize "midgard5.class"}} + {{#each data.info.class as |class id|}} +
+ {{class}} + +
+ {{/each}} +
{{localize "midgard5.level"}} {{data.calc.level}}
@@ -132,26 +139,26 @@ {{> "systems/midgard5/templates/sheets/character/base_values.hbs"}} -
+
{{> "systems/midgard5/templates/sheets/character/skills.hbs"}}
-
+
{{> "systems/midgard5/templates/sheets/character/gear.hbs"}}
-
+
{{> "systems/midgard5/templates/sheets/character/combat.hbs"}}
-
+
{{> "systems/midgard5/templates/sheets/character/spells.hbs"}}
-
+
{{> "systems/midgard5/templates/sheets/character/effects.hbs"}}
-
+
{{> "systems/midgard5/templates/sheets/character/description.hbs"}}
diff --git a/templates/sheets/character/skills.hbs b/templates/sheets/character/skills.hbs index c85769e..cbebdde 100644 --- a/templates/sheets/character/skills.hbs +++ b/templates/sheets/character/skills.hbs @@ -6,6 +6,7 @@ + @@ -17,6 +18,7 @@ {{#each data.calc.skills.innate as |skill skillId|}} + @@ -25,22 +27,6 @@ {{/each}} - - - - - - - - - - - - - - - -
{{localize "midgard5.innate-ability"}} {{localize "midgard5.fw"}} {{localize "midgard5.bonus"}}
{{skill.label}} {{skill.fw}} {{skill.calc.bonus}}
{{localize "midgard5.perception"}}{{data.calc.stats.perceptionFW}}{{data.calc.stats.perception.value}}{{add data.calc.stats.perception.value data.calc.stats.perceptionFW}}
{{localize "midgard5.drinking"}}{{data.calc.stats.drinkingFW}}{{data.calc.stats.drinking.value}}{{add data.calc.stats.drinking.value data.calc.stats.drinkingFW}}
@@ -67,7 +53,7 @@ {{skill.fw}} - {{!-- {{
{{skill.fw}} {{skill.calc.bonus}} {{skill.calc.ew}} {{skill.pp}}
+ @@ -96,8 +83,13 @@ {{#each data.calc.skills.combat as |skill skillId|}} + - + @@ -110,10 +102,11 @@
-
{{localize "midgard5.languages"}}
+
{{localize "midgard5.languages"}} & {{localize "midgard5.writings"}}
{{localize "midgard5.weapon-skill"}} {{localize "midgard5.fw"}} {{localize "midgard5.bonus"}}
{{skill.label}}{{skill.fw}} + + {{skill.fw}} + + {{skill.calc.bonus}} {{skill.calc.ew}} {{skill.pp}}
+ @@ -126,8 +119,13 @@ {{#each data.calc.skills.language as |skill skillId|}} + - + diff --git a/templates/sheets/character/spells.hbs b/templates/sheets/character/spells.hbs index 90d636a..6884d0a 100644 --- a/templates/sheets/character/spells.hbs +++ b/templates/sheets/character/spells.hbs @@ -1,23 +1,106 @@ -
{{localize "midgard5.language"}} {{localize "midgard5.fw"}} {{localize "midgard5.bonus"}}
{{skill.label}}{{skill.fw}} + + {{skill.fw}} + + {{skill.calc.bonus}} {{skill.calc.ew}} {{skill.pp}}
- - - - - - - - - {{#each data.calc.spells as |item itemId|}} - - - - - - - {{/each}} - -
{{localize "TYPES.Item.spell"}}{{localize "midgard5.ew"}} -
- {{item.label}} - {{localize item.process}} - {{item.calc.ew}}
\ No newline at end of file +
+
+
+
{{localize "midgard5.spellCasting"}}
+ + + + + + + + + + + + + + + + +
{{localize "midgard5.spellCasting"}}{{data.calc.stats.spellCasting.value}}{{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}}
+
+
+ + +
+
+
{{localize "TYPES.Item.spell"}}
+ + + + + + + + + + + + + + + + + + + {{#each data.calc.spells as |item itemId|}} + + + + + + + + + + + + + + + + {{/each}} + +
{{localize "TYPES.Item.spell"}}{{localize "midgard5.spell-type"}}{{localize "midgard5.spell-castDuration-short"}}{{localize "midgard5.actor-ap-short"}}{{localize "midgard5.spell-range-short"}}{{localize "midgard5.spell-effectTarget"}}{{localize "midgard5.spell-effectArea-short"}}{{localize "midgard5.spell-effectDuration-short"}}{{localize "midgard5.ew"}} +
+ {{item.label}} + {{localize item.process}} + {{localize (m5concat 'midgard5.spell-type-' item.type)}}{{item.castDuration}}{{item.ap}}{{item.range}}{{localize (m5concat 'midgard5.spell-target-' item.effectTarget)}}{{item.effectArea}}{{item.effectDuration}}{{item.calc.ew}} + {{#if item.equipped}} + + {{else}} + + {{/if}} +
+
+
+
+ +
+
+
{{localize "midgard5.pp"}} {{localize "midgard5.spells"}}
+ + + + + + +
+
+ + {{#each data.lernKostenZauber as |group name|}} + + + + + + + + + {{/each}} +
+
+
+
+ diff --git a/templates/sheets/item/class.hbs b/templates/sheets/item/class.hbs new file mode 100644 index 0000000..80604a3 --- /dev/null +++ b/templates/sheets/item/class.hbs @@ -0,0 +1,109 @@ +
+
+ +

+
+ + +
+ +
+ + + + + + + + + + + + + + +
+
+ + + + +
+
{{localize "midgard5.resistanceMind"}}{{localize "midgard5.resistanceBody"}}
+ +
+ +
+ + + + + + +
+
+ {{#each data.lernKostenAllgemein as |wert name|}} + + + + + {{/each}} +
+
+
+ +
+ + + + + + +
+
+ {{#each data.lernKostenKamptechnik as |wert name|}} + + + + + {{/each}} +
+
+
+ +
+ + + + + + +
+
+ + {{#each data.lernKostenZauber as |wert name|}} + + + + + {{/each}} +
+
+
+ +
+ {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} + +
+ +
+ +
\ No newline at end of file diff --git a/templates/sheets/item/container.hbs b/templates/sheets/item/container.hbs index 2add63f..13c1a87 100644 --- a/templates/sheets/item/container.hbs +++ b/templates/sheets/item/container.hbs @@ -26,6 +26,12 @@
+
+ {{localize "midgard5.capacity"}} + +
+
@@ -42,6 +48,12 @@ +
+ {{localize "midgard5.item-weight"}} + +
+
diff --git a/templates/sheets/item/kampfkunst.hbs b/templates/sheets/item/kampfkunst.hbs index d97e4ba..962dd93 100644 --- a/templates/sheets/item/kampfkunst.hbs +++ b/templates/sheets/item/kampfkunst.hbs @@ -22,6 +22,18 @@
{{localize "midgard5.actor-ap"}}
{{localize "midgard5.kampfkunst-ep"}}{{localize "midgard5.kampfkunst-rank"}}
{{localize "midgard5.kampfkunst-weapon"}}{{localize "midgard5.kampfkunst-enemy"}}
{{localize "midgard5.kampfkunst-type"}}{{localize "midgard5.kampfkunst-variante"}} {{localize "midgard5.kido-variante"}}