Compare commits

..

132 Commits

Author SHA1 Message Date
Byroks 4a9afcf150 v2.7.2 2024-09-21 10:21:19 +02:00
Byroks 6a90581c4e Fix Versteckte Würfe & Ungelernte Würfe auf EW 2024-09-21 10:17:53 +02:00
LeFrique 7c7ba3679b KUS-Update (#116)
+ Fine Arts from KUS-QB
+ Bugfix for Wealth (again parseFloat) on higher and mixed values for gold, silver and copper

Neuer/alter Mitspieler mit viel zuviel Vermögen deckt kleine Mängel auf, immer diese reichen Elfen... und ich hab schnell noch die neuen Fertigkeiten für die Küstenstaaten eingetragen.

Reviewed-on: #116
Reviewed-by: Byroks <byroks@gmail.com>
Co-authored-by: LeFrique <lefrique@live.de>
Co-committed-by: LeFrique <lefrique@live.de>
2024-06-02 20:17:20 +02:00
Byroks 28e960dbf1 V2.7.1 2024-05-27 11:59:28 +02:00
Byroks e1c27bb3f1 Remove Console.log 2024-05-27 11:57:05 +02:00
Byroks f06fbb2687 Hot Fix
Changes:
 + NPC Stat anzeige updaten damit boni mit angezeigt werden
 + Shit fix Mods da attribute Mods Sekundäre effekte (Schadensbonus zb.) nicht angepasst haben
2024-05-27 11:56:10 +02:00
Byroks c5ce058f44 V2.7.0 2024-05-27 10:12:23 +02:00
Byroks 32bf1ba747 Fix PP anzeige von Zaubern (#115)
Changes:
 + PP werden wieder angezeigt
 + Es werden nur PP Angezeigt von Zauberschulen wo die lernkosten ungleich 0 sind
Reviewed-on: #115
2024-05-27 10:04:26 +02:00
Byroks 38f1c90c09 Fix Bonus bei Wurf anzeige (#114)
Changes:
 + Situations Boni wird nicht mehr auf den Würfel gerechnet sondern seperat angezeigt wie andere Boni
Reviewed-on: #114
Reviewed-by: Le-Frique <lefrique@live.de>
2024-05-27 10:03:54 +02:00
Byroks 1852f2bf08 Sneak Fixes
Changes:
 + EP Input vergrößert
 + Verstecke Ungelernte Fähigkeiten auf Spieler Bogen wie bei NPC Bogen
 + Fix Mods (again)
 + nutze richtige movement wert bei NPC Bogen
2024-05-26 09:56:02 +02:00
Byroks 918b32fda0 Attribute Mods verändern Boni nicht (#111)
Problem:
 + Mods für die Attribute (wie zb. bei dem Zauber Stärke) haben davon abgeleitete Werte (Wie Schadensbonus) nicht verändert

Changes:
 + Mods werden vor den abgeleiteten Werten ausgewertet

Reviewed-on: #111
Reviewed-by: Le-Frique <lefrique@live.de>
2024-05-22 08:15:47 +02:00
oskaloq 3ecd2c6c1e Vereinfachter-NPC/Kreaturen-Bogen (#107)
Ich habe mal den ersten Entwurf eines NPC Bogens fertiggestellt. Ist jetzt ein eigener Actor Type geworden und nicht nur ein alternativer Char Bogen:
Einfach beim Erstellen eines neuen Actors NPC wählen.

Co-authored-by: Ender <harald@drueppels.de>
Co-authored-by: LeFrique <lefrique@live.de>
Co-authored-by: Byroks <byroks@gmail.com>
Reviewed-on: #107
Reviewed-by: Le-Frique <lefrique@live.de>
2024-05-14 11:38:20 +02:00
LeFrique 37d6ba12e7 tragkraft-containerwert-abw-kidoprep (#103)
+ Added ABW to items
+ Added warning for over-capacity
+ Added Valuecalculation for containers
+ Updated KiDo-template

Reviewed-on: #103
Reviewed-by: Byroks <byroks@gmail.com>
Co-authored-by: LeFrique <lefrique@live.de>
Co-committed-by: LeFrique <lefrique@live.de>
2024-05-01 19:10:47 +02:00
Byroks 5a1e11d0d7 Sneak update, AP Cost not working correctly 2024-04-27 18:45:20 +02:00
oskaloq c5e5ba199b changed manifest for easier update (#97)
Co-authored-by: Ender <harald@drueppels.de>
Reviewed-on: #97
Reviewed-by: Byroks <byroks@gmail.com>
2024-04-01 19:30:19 +02:00
oskaloq 08e767afcb Drag and Drop für Container #98 (#99)
Items können jetzt per Drag and Drop in Container verschoben werden. Werden sie nicht in einen Container gedroppt, landen sie wieder in der allgemeinen Item Übersicht.

Co-authored-by: Ender <harald@drueppels.de>
Reviewed-on: #99
Reviewed-by: Byroks <byroks@gmail.com>
2024-03-31 18:51:01 +02:00
Byroks fb30f8fe40 v2.6.0 2024-03-29 14:32:33 +01:00
Byroks 2a1262662f Situationsbedingte-Boni/Mali-#41 (#95)
Changes:
 + Popup für Situationsbedinge Boni/Mali, Schwellenwert und RollMode (Sichtbarkeit)
 + neuwürfel/verändern des wurfes durch glückspunkte und schicksalsgunst
Co-authored-by: Ender <harald@drueppels.de>
Reviewed-on: #95
2024-03-29 14:28:49 +01:00
Byroks a4cf10c5f1 #64-anzeige-von-zauber-pp (#96)
Reviewed-on: #96
2024-03-29 14:02:47 +01:00
LeFrique 7ac704cc61 Entbehrungen (#89)
Ich habe die Entbehrungswerte für Zähigkeit unter den Grundwerten abgelegt und werde die Tage noch Entbehrungseffekte und ein Macro in der Extension dafür anlegen. Die Boni für die Klassen wie zB Barbar +10 könnten wir dann da direkt mit in der jeweilige Klasse berücksichtigen. Grundsätzlich kann man das aber jetzt schonmal nutzen und der Grundwertebogen war mir zu leer ;) ![grafik](/attachments/fbb80a27-91d7-4b00-bd39-7c24af3bda60)

Co-authored-by: Byroks <byroks@gmail.com>
Reviewed-on: #89
Co-authored-by: LeFrique <lefrique@live.de>
Co-committed-by: LeFrique <lefrique@live.de>
2024-03-24 20:02:24 +01:00
Byroks 046d5f0286 #91 Automatische Praxispunkte (#93)
Changes:
 + implementation von Automatischen Praxispunkten
 + Hinzufügen von System Settings zur abschaltung von Automatischen Praxispunkten
 + Aufräumen von Helpers und settings in eigene Dateien
Co-authored-by: LeFrique <lefrique@live.de>
Reviewed-on: #93
2024-03-24 15:09:08 +01:00
Byroks 3a58485d27 #90 Clean Spell Button funktioniert nicht (#94)
Changes:
 + hinzufügen von roll funktion für Zauberwert
Reviewed-on: #94
Reviewed-by: Le-Frique <lefrique@live.de>
2024-03-24 15:06:30 +01:00
Byroks 12e6412a9f #70-classes-as-items (#92)
Co-authored-by: LeFrique <lefrique@live.de>
Reviewed-on: #92
2024-03-23 19:17:54 +01:00
LeFrique af6fdbbf89 Skill & Sheets Update (#88)
+ Added FW-Increase/Decrease on Weapon and Language Skills
+ Added ItemIcons for Skills, Gear, Spells, Combat and Effects
+ Re-Added Belastungseffect with all mods working nearly smoothless (only bugging on new actors once created; could be commented out if not approvable until better solution exists)

![grafik](/attachments/451f5642-8250-4331-bdb7-04019ce2525c)

Reviewed-on: #88
Reviewed-by: Byroks <byroks@gmail.com>
Co-authored-by: LeFrique <lefrique@live.de>
Co-committed-by: LeFrique <lefrique@live.de>
2024-03-14 20:58:52 +01:00
LeFrique 43375a19c8 Kampfkunstupdate (#86)
+ Added more types & variants
+ Modified Kampfkunstitem, Combatsheet and rollmessage

Hab grad die Kampfkünste in der extension anscheinend direkt nach develop durchgepusht ohne meine kampfkunstbranch dazwischen, hier dann auch die Anpassungen im System dafür. Läuft beides bei mir rund.

Reviewed-on: #86
Reviewed-by: oskaloq <os_ka_loq@gmx.de>
Co-authored-by: LeFrique <lefrique@live.de>
Co-committed-by: LeFrique <lefrique@live.de>
2024-03-14 11:35:26 +01:00
oskaloq a03af18281 Zaubertab ergänzen #79 + Kampftab ergänzen #78 (#87)
- Zaubertab um Header (Zaubern + Resistenzen) ergänzt (Footer steht noch aus; am besten zusammen mit der PP Überarbeitung)
- Werte in der Zauber Tabelle ergänzt
- Zauber "ausrüstbar" gemacht, so dass sie im Kampftab angezeigt werden
- Kampftab um Initiative (Anführen) ergänzt

Co-authored-by: Ender <harald@drueppels.de>
Reviewed-on: #87
Reviewed-by: Byroks <byroks@gmail.com>
2024-03-13 22:22:54 +01:00
Byroks 08ca1cedce Merge branch 'develop' of https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5 into develop 2024-03-04 14:17:39 +01:00
Byroks a9895d612a v2.5.0 2024-03-04 14:16:22 +01:00
Byroks 15473fb0db Remove Lasteneffekte (#84)
Changes:
 + Aktive Effekte wurden entfernt
 + Überschrittene Lasten werden Rot eingefärbt
Reviewed-on: #84
2024-03-04 14:14:19 +01:00
Byroks b83c57b5c8 Fix increase/decrease EW button 2024-03-04 10:34:51 +01:00
Byroks e465bac5ef Sortierbare Items (#68)
Changes:
 + Items sind jetzt sortierbar
 + Items können jetzt auf andere Actor übertragen werden
 + Löschen button für Mods
Reviewed-on: #68
2024-03-04 10:01:47 +01:00
LeFrique bb9d20f586 Fertigkeitenboni (#77)
+ Added bonus on Aussehen depending on fw: athletik gem. KOD S. 104
+ Added bonus on Bewegungsweite depending on fw: laufen gem. KOD S. 116
+ Added Skill increase/decrease buttons like on quantity

Reviewed-on: #77
Reviewed-by: oskaloq <os_ka_loq@gmx.de>
Co-authored-by: LeFrique <lefrique@live.de>
Co-committed-by: LeFrique <lefrique@live.de>
2024-03-03 18:43:43 +01:00
oskaloq 9ff50fbd7d #75 Build lässt sich wegen fehlendem packs Ordner nicht mehr durchführen (#76)
Keine Ahnung, warum der packs Ordner beim letzten Pull Request gelöscht wurde. Hatte den Build vor dem Request noch einmal getestet. Ich habe jetzt vorsichtshalber eine empty.md Datei im Ordner erstellt.

Ich habe auch nochmal verifiziert, ob die Kompendium Folders in einer neuen Welt auch wirklich nicht angelegt werden:
![image](/attachments/828ccf31-c039-4534-a57a-4f06ae983da7)

Co-authored-by: Ender <harald@drueppels.de>
Reviewed-on: #76
Reviewed-by: Byroks <byroks@gmail.com>
Co-authored-by: oskaloq <os_ka_loq@gmx.de>
Co-committed-by: oskaloq <os_ka_loq@gmx.de>
2024-02-27 13:08:31 +01:00
oskaloq 1801599e8d Layout Wiederherstellung im Ausrüstungstab #73, Kompendium Packs aus dem System entfernen #71, "Sonstige Werte" doppelt im Kampftab vorhanden #69 (#74)
Erledigung folgender Issues:
- Layout Wiederherstellung im Ausrüstungstab #73
- Kompendium Packs aus dem System entfernen #71
- "Sonstige Werte" doppelt im Kampftab vorhanden #69
- Wiederherstellung einiger Features im Character Sheet, die durch das Lasten Update verloren gegangen sind
- Anpassung des Editors im Descript Tab: Entfernung des deprecated Parameter content

Co-authored-by: Ender <harald@drueppels.de>
Reviewed-on: #74
Co-authored-by: oskaloq <os_ka_loq@gmx.de>
Co-committed-by: oskaloq <os_ka_loq@gmx.de>
2024-02-27 10:17:45 +01:00
Byroks a0037aa1bf Hotfix - reapply missing css class 2024-02-25 10:04:12 +01:00
Byroks 8ce84bad19 #55 Default FW/EW für waffen auf 4 setzen (#63)
Changes:
 + falls eine Waffe keinen Skill ausgewählt hat, ist der standard wert 4 anstelle von 0
Reviewed-on: #63
Reviewed-by: Le-Frique <lefrique@live.de>
2024-02-24 13:58:02 +01:00
Byroks 5b1b0deb7a #6 Lasten und Gewichte (#52)
Co-authored-by: LeFrique <lefrique@live.de>
Reviewed-on: #52
2024-02-24 11:23:37 +01:00
Byroks 06ef797ef2 #57 Damage auf tokens (#58)
Changes:
 + Fix um Heilung anzurechnen
 + Finde token über Canvas Selected
 + möglich schaden auf mehrere token zeitlgiehc anzurechnen.
Reviewed-on: #58
2024-02-21 22:30:08 +01:00
Byroks 1624602407 + Button für Skills (#59)
Changes:
 + Styling anpassung für + buttons
 + CreatItem funktion angepasst, man kann optionen reingeben
 + button um skills zu erstellen eingefügt
Reviewed-on: #59
2024-02-21 22:29:58 +01:00
Byroks a46ef87e3f Button um Kampf beizutreten (#61)
Changes:
 + Button um Kampf beizutreten
 + buttons um initiative zu verändern für Fernangriffe und Zauber
Reviewed-on: #61
2024-02-21 22:29:48 +01:00
Byroks c2aa466ce1 v2.4.2 2024-02-05 13:30:20 +01:00
Byroks 24426bb248 HotFix nicht öffenbare Charaktere
Changes:
 + Currency hat bei (fast) allen Items gefehlt weswegen das Charakterblatt nicht mehr öffenbar war, nachdem man Wert und Currency eingetragen hat.
 + Beachte Menge für Vermögensrechnung
 + Hort rechnung beachtet jetzt Currency
2024-02-05 13:29:29 +01:00
Byroks 26b2bddc2d v2.4.1 2024-02-05 10:28:46 +01:00
oskaloq 9f1334da4f - Container behavior for Weapons, Def. Weapons and Armor is now the same as for items (#53)
- Fixed some Bugs

Co-authored-by: Ender <harald@drueppels.de>
Co-authored-by: Byroks <byroks@gmail.com>
Reviewed-on: #53
Reviewed-by: Byroks <byroks@gmail.com>
Co-authored-by: oskaloq <os_ka_loq@gmx.de>
Co-committed-by: oskaloq <os_ka_loq@gmx.de>
2024-01-31 18:31:32 +01:00
Byroks 454982906f Hotfix - can't open charaktersheet
Problem:
 +sometimes items had a null formula which blocked opening the sheet

Changes:
 + add ? to catch nulls
2024-01-22 22:24:12 +01:00
Byroks 33c65735bd v2.4.0 2024-01-20 15:31:35 +01:00
Byroks 2bfd3a7d6a #46-problems-with-character-description-editor (#50)
Changes:
 + adjust height and width of the editor

WIP for #46
Closes #44

Reviewed-on: #50
2024-01-20 13:58:22 +01:00
Byroks 03b87f2df0 update url 2024-01-20 13:44:06 +01:00
Byroks 9d72b31d5f Add Items on Character Sheet
Changes:
 + add button to add all different kind of items directly onto the character sheet
 + fix #1 by correctly updating the item
2024-01-20 12:37:05 +01:00
oskaloq c13fef5103 Zusammenführung-von-Fertigkeiten,-Waffen-und-Rüstungen-im-Kampf-Tab-#15 (#48)
- Created character description tab
- Redesigned skill, gear and combat tab
- Weapons, defense weapons and armor is still in the gear tab. If you equip them (now directly possible via click on the equip icon), they appear in the combat tab. Reason: This holds the combat tab clean for combat stuff.

Co-authored-by: Ender <harald@drueppels.de>
Reviewed-on: #48
Reviewed-by: Byroks <byroks@gmail.com>
2024-01-16 11:25:39 +01:00
Byroks abf8077131 #33 Wrong wealth calculation (#34)
Changes:
 + add function to adjust item value depending on currency
Co-authored-by: Simon Gustavs <simon.gustavs@bms-cs.de>
Reviewed-on: #34
Reviewed-by: oskaloq <os_ka_loq@gmx.de>
2024-01-16 08:29:14 +01:00
Byroks b5b75aa2c6 #18 Remove ContainerId from containers (#29)
Changes
 + remove containerId variable from containers as it's not needed

Reviewed-on: #29
Reviewed-by: oskaloq <os_ka_loq@gmx.de>
2024-01-15 14:15:30 +01:00
Byroks 7368673ba3 Update .gitea/workflows/add-issue-to-project.yaml 2024-01-08 20:42:22 +01:00
Byroks a606750b23 Update .gitea/workflows/add-issue-to-project.yaml 2024-01-08 20:41:15 +01:00
Byroks 7358b67da2 Update .gitea/workflows/add-issue-to-project.yaml 2024-01-08 20:41:05 +01:00
Byroks 2a36b8eaa1 Update .gitea/workflows/add-issue-to-project.yaml 2024-01-08 20:38:50 +01:00
Byroks f38ef8aa6d Update .gitea/workflows/add-issue-to-project.yaml 2024-01-08 16:16:04 +01:00
Byroks 2ac8a6bba4 Update .gitea/workflows/add-issue-to-project.yaml 2024-01-08 16:09:13 +01:00
Byroks 41fb1a8879 Update .gitea/workflows/add-issue-to-project.yaml 2024-01-08 16:02:37 +01:00
Byroks ff74871a0c Update .gitea/workflows/add-issue-to-project.yaml 2024-01-08 12:56:49 +01:00
Byroks f8b65c030f Update .gitea/workflows/add-issue-to-project.yaml 2024-01-08 12:39:39 +01:00
Byroks 31a4ccfda1 Update .gitea/workflows/add-issue-to-project.yaml 2024-01-08 12:37:43 +01:00
Byroks c24e2b7af2 Update .gitea/workflows/add-issue-to-project.yaml 2024-01-08 12:28:41 +01:00
oskaloq cfdba0ee75 Anpassung-des-Character-Sheet-Headers-#13 (#28)
- Made character sheet header more responsive
- Changed Logo
- Changed "all gear items" container, that it shows items not in dedicated containers ( unless "Alle" checkbox is set)

Co-authored-by: Ender <harald@drueppels.de>
Co-authored-by: Byroks <byroks@gmail.com>
Reviewed-on: #28
Reviewed-by: Byroks <byroks@gmail.com>
2024-01-07 22:53:16 +01:00
Byroks d67de1b064 Update .gitea/workflows/add-issue-to-project.yaml 2024-01-07 16:47:12 +01:00
Byroks 718f1eab99 Update .gitea/workflows/add-issue-to-project.yaml 2024-01-07 16:38:35 +01:00
Byroks 47fd5b7763 Update .gitea/workflows/add-issue-to-project.yaml 2024-01-07 16:37:27 +01:00
Byroks ad884994dd Update .gitea/workflows/add-issue-to-project.yaml 2024-01-07 16:17:20 +01:00
Byroks b08bd195c7 Update .gitea/workflows/add-issue-to-project.yaml 2024-01-07 15:45:46 +01:00
Byroks c83cd8f079 Update .gitea/workflows/add-issue-to-project.yaml 2024-01-07 15:40:56 +01:00
Byroks b1ef88235f Update .gitea/workflows/add-issue-to-project.yaml 2024-01-07 15:37:37 +01:00
Byroks da1ae4e16e Update .gitea/workflows/add-issue-to-project.yaml 2024-01-07 15:35:54 +01:00
Byroks 840a7c1dc4 Update .gitea/workflows/add-issue-to-project.yaml 2024-01-07 15:33:26 +01:00
Byroks 4825166f87 Add .gitea/workflows/add-issue-to-project.yaml 2024-01-07 15:06:01 +01:00
LeFrique b8e873537c Zwergenhort (#4)
Mein Geschenk zu Weihnachten:

Implementierung des Zwergenhort gem. KOD S. 167 mit Angabe aktueller Mindesthort für aktuellen Grad und benötigtem Hort für nächsten Grad bei Zwergen. Der Hort erscheint nur bei ausgewählter Rasse Zwerg und wird bei allen anderen Rassen versteckt. Die Anrechnung von Gold oder Gegenständen wie auch im KOD erwähnt erfordert die Implementierung eines Goldmanagements und am besten auch eine Neustrukturierung des Charakterbogens (s. weitere Issues).

Frohe Weihnachten ;)

Co-authored-by: Byroks <byroks@gmail.com>
Reviewed-on: #4
Co-authored-by: LeFrique <lefrique@live.de>
Co-committed-by: LeFrique <lefrique@live.de>
2024-01-07 14:31:20 +01:00
Byroks 975bcd1e15 #10 Kampfkunst nicht öffenbar (#11)
Änderungen:
 + auskommentierte if Bedingung wieder drin
 + if Bedingung angepasst

Reviewed-on: #11
Reviewed-by: Le-Frique <lefrique@live.de>
2024-01-07 14:29:39 +01:00
oskaloq b945f22710 Charakterbogen anpassen #7 (#9)
- Use of flexboxes in two columns for better display
- Introduction of item containers for the different storage of items

Co-authored-by: Ender <harald@drueppels.de>
Co-authored-by: Byroks <byroks@gmail.com>
Reviewed-on: Byroks/foundry-vtt-system-midgard5#9
Reviewed-by: Byroks <byroks@gmail.com>
2024-01-03 15:57:15 +01:00
Byroks 6baf9a0269 Change git Path (#3)
Changes:
 + change github urls to git.byroks
Reviewed-on: Byroks/foundry-vtt-system-midgard5#3
Reviewed-by: Le-Frique <lefrique@live.de>
2023-12-18 19:53:37 +01:00
Byroks 91f12b11da v2.3.1 2023-12-15 21:36:33 +01:00
Byroks bfa51605bc
Add Consumable Items (#62)
Changes:
 + add Quantity value for items
 + add plus and minus buttons for list
 + add roll button if item contains formulas
 + decrease quantity by 1 if rolled
2023-12-15 21:34:32 +01:00
Byroks c313d3448c
Add Roll Modification (#61)
Changes:
 + add roll Mod (only for attributes)
 + check for roll mods when rolling on attributes
2023-12-15 20:40:23 +01:00
Byroks 31cfd52131
Add currency to character sheet (#60)
Changes:
 + add fields to track currency
 + show value of standard items
2023-12-15 20:39:29 +01:00
Byroks a5336faa94 v2.3.0 2023-12-13 18:52:41 +01:00
Byroks a56e6bab3d
Automatically select skill for effects (#59)
Changes:
 + when a mod gets added, check if it's a skill
 + if it's a skill, find appropiate ID in actors item list and apply it to the mod
2023-12-13 18:46:49 +01:00
LeFrique fed1175987
26 perception drinking all abilities (#56)
* Innate abilities

+ Added Perception as fixed innate ability
+ Added Drinking as fixed innate ability
+ Set Luckpoints to 0

* Duration Update

+ Added Duration to Effects
+ Added Perception to Eye & Ear Injury

* Fixed like recommended

+ Fixed M5Base
+Fixed M5Character
+ Fixed M5Rolls
+ Fixed Skills HBS
+ Fixed BrawlFw
+ Fixed Effect (not saved already)

* fix minor issues

---------

Co-authored-by: Byroks <byroks@gmail.com>
2023-12-13 18:45:35 +01:00
Byroks 1e27e135cf
15 add duration to active effects (#50)
* Add Effect Duration & Rework Combat tracker

Changes:
 + rework combat tracker to display every uneven round as Movementphase
 + rework combat tracker to display every even round as actionphase
 + add possibility for effects durations
 + effects duration decreases with every actionphase
 + add enum for time Units
 + update localization
 + add display of remaining time on effects
 + add duration for spelleffect "Bärenwut"

* add LP AP Manipulation through effects

Changes:
 + add LimitHeal function
 + adjust LP AP Values if Mod exists in an effect

* Fix linked actor not being updated
2023-12-11 17:36:12 +01:00
LeFrique 30e94741bf
Update main.hbs (#55)
+ Switched Ko and Gw to match dice description above dice symbols in header.
2023-12-09 18:24:09 +01:00
LeFrique 2dccbf3de3
Fix packfolders (#47)
+ Added missing curly brace
+ Added Injuries in packFolders
2023-12-06 18:43:23 +01:00
LeFrique 9814c44045
Added Injuries & in Macros, Fixes (#25)
Added:
+ Injuries as Effects
+ Added Injury Effects to Macro Schwere Verletzungen
Fixed:
+ Pagedescription in Spell Effects
+ Images (again) in Combat Conditions
2023-12-06 16:30:13 +01:00
Byroks 53ff2ece7d v2.2.0 2023-12-06 16:08:39 +01:00
Byroks 04a30a70b9 Minor Style Changes 2023-12-06 16:08:08 +01:00
Byroks b5cffae778
Fix Armor misscalculation (#46)
Changes:
 + mod operation "add" can't go into negative numbers
2023-12-06 14:49:12 +01:00
Byroks db23081a9a
Fix Movement Boni being applied multiple times (#45)
Changes:
 + seperate display of Base Movement speed and calculated movement speed
 + for asthetic reasons move GiT to Berechnete Werte
2023-12-06 12:31:34 +01:00
LeFrique e753f6392d
Delete Maps (#43)
- Deleted Assets
- Deleted Packs
+ Removed Scenepacks from system.json
2023-12-06 11:17:05 +01:00
Byroks 2b4e6b18d0
28 apply damage through chat (#40)
* Add Rightclick menu to apply damage/heal

Changes:
 + add rightclick context menu for rolls
 + only appears if keyword Schaden exists
 + calculate damage from all rolls with keyword Schaden
 + possible to apply damage or heal actor or if present token

ToDo:
 + add button that does the same

* Add Rüstungsschutz to damage calculation

Changes:
 + Add Damage application from chat
 + take token first, if none exist, take actor
 + include damage reduction from equipped armor
 + damage appliaction is only accesible through right click on roll

* Fix falsy display of rightclick context menu
2023-12-06 11:14:35 +01:00
oskaloq 0fe61e5bbb
Comprehensive overhaul of the character sheet design. (#35) 2023-12-04 11:44:32 +01:00
LeFrique 46cac30dcd
17 add rüstungskammer + 21 Restructure Compendium (#31)
* Rüstkammer, Fixes & Preparation

+ Added Rüstkammer
+ Added Pagedescriptions in Ausrüstung
+ Prepared Compendium Folders

* Compendium Folders & Fixes

+ Added Effects to magical Gear
+ Added more Combat Conditions for Gear Effects
+ Added Markup to some Items for better visualization in Items or chat, more to follow
+ Solved Combat Folders (works only in new World!)

---------

Co-authored-by: Byroks <byroks@gmail.com>
2023-12-03 15:29:12 +01:00
Byroks 7e6147299b
Adjust Mod Calculation (#30)
Changes:
 + Adjust mod calculation
 + remov max 0 from subtract and addition
 + check in skills for subtract mod
2023-12-03 13:07:41 +01:00
Byroks f9737a4cb9
Aktualisieren von LICENSE 2023-12-01 22:10:24 +01:00
LeFrique 6ff4f16f9d
18 add more operations for modifiers (#23)
* Added Operations and Combat Conditions

+ Added Multiply, Division and Subtract operations for modifiers
+ Added Combat Conditions Effects form Ars Armorum

* Added Math.floor()

* Fixed Operations and Combat Conditions
2023-12-01 19:04:58 +01:00
LeFrique 725dd8c504
Added Operations and Combat Conditions (#22)
* Added Operations and Combat Conditions

+ Added Multiply, Division and Subtract operations for modifiers
+ Added Combat Conditions Effects form Ars Armorum

* Added Math.floor()
2023-12-01 15:26:49 +01:00
Byroks 48883c3102
Add Description to bottom of rolls (#19)
Changes:
 + Add helper to strip Html
 + add description of items to bottom of roll
2023-11-30 18:13:04 +01:00
Byroks 250fc499ae v2.1.0 2023-11-30 16:17:04 +01:00
Byroks 28595e7dd0
Make Items with mods equippable (#11)
Changes:
 + Items that can influence you stats are equippable
 + only equipped items influence your stats
 + Armor now influences your stats
 + move mods into a partial for easier changes
2023-11-30 15:50:59 +01:00
Byroks 8095785fc2
Movement stat (#10)
Changes:
 + make movement stat work and be moddable by effects
2023-11-29 10:14:49 +01:00
Byroks e141839055
Merge branch 'main' into develop 2023-11-28 19:50:38 +01:00
Byroks 14e005cb0a v2.0.0 2023-11-28 19:48:14 +01:00
Byroks c635c54f24
Dev Kampfkünste Items & Integration (#7)
Changes:
 + add kampfkuenste template
 + add kampfkuenste tab
 + make kampfkuenste rollable
 + update localization
2023-11-28 19:42:38 +01:00
Byroks e27f4209e5 Squashed commit of the following:
commit 0bfa224dae
Author: Byroks <byroks@gmail.com>
Date:   Mon Nov 27 19:56:05 2023 +0100

    V1.3.1 (#6)

    * v1.3.1

    * v1.3.1

    * update .gitingore

commit 35a6b0fae9
Author: Byroks <byroks@gmail.com>
Date:   Mon Nov 27 19:48:56 2023 +0100

    v1.3.1

commit db21ca93b0
Author: Byroks <byroks@gmail.com>
Date:   Sun Nov 26 13:13:13 2023 +0100

    subtract ap when casting spell

    Changes:
     + subtract AP when casting a spell
2023-11-27 20:05:20 +01:00
Byroks 0bfa224dae V1.3.1 (#6)
* v1.3.1

* v1.3.1

* update .gitingore
2023-11-27 20:04:06 +01:00
Byroks 35a6b0fae9 v1.3.1 2023-11-27 19:48:56 +01:00
Byroks db21ca93b0 subtract ap when casting spell
Changes:
 + subtract AP when casting a spell
2023-11-26 13:13:13 +01:00
Byroks 7bf0fd90b0 update verified and maximum version 2023-11-25 19:33:03 +01:00
Byroks a7bdd0434e Delete midgard5-v1.3.0.zip 2023-11-25 16:38:39 +01:00
Byroks 97d4a35cd6 update localize Keys
Changes:
 + update localize Keys, to conform with v11
2023-11-25 16:38:05 +01:00
Byroks c2996aa974 Fix Raufen roll
Changes:
 + fix roll attributes for Raufen
2023-11-25 16:04:17 +01:00
Byroks bf4f49755a adjust iniative roll
Changes:
 + fix iniative stat
2023-11-25 15:54:53 +01:00
Byroks 57bffd492a
Update de.md 2023-11-25 14:20:47 +01:00
Byroks 5a36ee9eab
V1.3.0 (#3)
* v1.3.0

* v1.3.0
2023-11-24 21:01:10 +01:00
Byroks a8a1e6e133 fix gulpfile 2023-11-24 20:54:22 +01:00
Byroks 3bf2612dd0 update system.json & gitignore 2023-11-24 20:47:21 +01:00
Byroks 68cb8fcf6d Include Weapons and effects
Changes:
 + include weapon pack and effect pack
 + handle effects as own entity
 + effects can influence your attributes and skills
 + add Aktive Effekte page for effects on your character
2023-11-24 20:11:36 +01:00
Byroks 4b2daef20a fix Gifttolleranz naming, parsing and display 2023-11-22 23:13:19 +01:00
Byroks 792c578e0f
Merge pull request #1 from LeFrique/main
Added skills & weapons from all Sourcebooks,GiT&B
2023-11-22 22:19:54 +01:00
Byroks 3b051760ae
Merge branch 'main' into main 2023-11-22 22:19:20 +01:00
Byroks bffbe97805 Revert "update system id"
This reverts commit 6428b3252e.
2023-11-22 19:11:53 +01:00
Byroks e21e5a91be Revert "adjust to id change"
This reverts commit 30d0924e3d.
2023-11-22 19:11:44 +01:00
Byroks 783f7f020b Revert "update version"
This reverts commit c77818199a.
2023-11-22 19:11:36 +01:00
Byroks ad841b111f Revert "remove"
This reverts commit 5277a3ca4b.
2023-11-22 19:11:17 +01:00
LeFrique ba2992221d Added skills & weapons from all Sourcebooks,GiT&B 2023-11-21 20:03:46 +01:00
Byroks 5277a3ca4b remove 2023-11-21 19:57:45 +01:00
Byroks c77818199a update version 2023-11-21 19:53:32 +01:00
132 changed files with 5742 additions and 5286 deletions

View File

@ -0,0 +1,15 @@
name: Move new issues into To Do
on:
issues:
types: [opened]
jobs:
createCard:
runs-on: ubuntu-latest
steps:
- name: Close Issue
run: >
curl -X PATCH -H "Content-Type: application/xml"
-H "Authorization: token ${{ secrets.GITEA_TOKEN }}
-d '{ "state": "To Do" }'
"${{ gitea.event.issue.url }}"

1
.gitignore vendored
View File

@ -5,3 +5,4 @@ package-lock.json
source/packs/
source/generators/
dist
*.zip

View File

@ -1,6 +1,7 @@
MIT License
Copyright (c) 2022
Copyright (c) 2022 Michael Stein
Copyright (c) 2023 Byroks
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512"><path fill="#fff" d="M262.406 17.188c-27.22 8.822-54.017 28.012-72.375 55.53 17.544 47.898 17.544 57.26 0 105.157 19.92 15.463 40.304 24.76 60.782 27.47-2.063-25.563-3.63-51.13 1.125-76.69-13.625-1.483-23.374-5.995-37-13.874V82.563c35.866 19.096 61.84 18.777 98.813 0v32.22c-13.364 6.497-21.886 11.16-35.25 13.218 3.614 25.568 3.48 51.15 1.375 76.72 18.644-3.265 37.236-12.113 55.5-26.845-14.353-47.897-14.355-57.26 0-105.156-16.982-28.008-47.453-46.633-72.97-55.532zm-129.594 8.218c-25.906 110.414-27.35 215.33-27.4 330.922-18.84-1.537-37.582-5.12-56.027-11.12v28.554h69.066c8.715 35.025 6.472 70.052-1.036 105.078h28.13c-7.195-35.026-8.237-70.053-.872-105.078h68.904v-28.555c-18.49 4.942-37.256 8.552-56.097 10.46.082-114.94 2.496-223.068-24.667-330.26zm89.47 202.375c0 117.27 25.517 233.342 120.155 257.97C446.62 464.716 462.72 345.374 462.72 227.78H222.28z"/></svg>

After

Width:  |  Height:  |  Size: 956 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512"><path fill="#000" d="M256 16C123.5 16 16 123.5 16 256c0 132.6 107.5 240 240 240 132.6 0 240-107.4 240-240S388.6 16 256 16zm0 60c99.4 0 180 80.6 180 180s-80.6 180-180 180S76 355.4 76 256 156.6 76 256 76zm91.3 64.2c-6.5 0-12.5 2.4-16.8 8.2-52 70.1-69 96.5-106 169.8-8.4-11.1-65.6-72.4-93.9-94.1-14.2-10.9-41.3 27.2-31.6 37.1C142.6 306.1 220.1 406 232.7 405c21.4-1.7 75.1-136.8 148.8-233.7 8-10.4-15-31.3-34.2-31.1z"/></svg>

After

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 MiB

View File

@ -6,7 +6,7 @@ _**Warnung:** Das System befindet sich noch in der Entwicklung._
Gehe auf die Setup-Seite deiner Foundry VTT Instanz. Klicke im Reiter **Game Systems** auf den Button **Install System**. In dem dann geöffneten Dialog, unten in der Zeile **Manifest URL** den Link zur aktuellen (oder gewünschten) Version der _system.json_ eintragen und auf **Install** klicken:
https://github.com/michaelstein/foundry-vtt-system-midgard5/releases/download/v1.0.1/system.json
https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5/releases/download/v1.3.0/system.json
Danach kann eine Spielwelt mit dem System erstellt werden.
@ -32,7 +32,7 @@ Dieser Reiter enthält (mit Ausname von Zaubern) alle zu erlernenden Dinge des C
![Blaupausen für Gegenstände](compendium-items.de.png)
Es kann einfach per Drag'n'Drop die entsprechende Blaupause auf den Charakterbogen gezogen werden, um eine Fertigkeit/Fähigkeit/Sprache zu *lernen.* Alternativ kann auch der **Lernen** Button bei den **ungelernten Fertigkeiten** geklickt werden.
Es kann einfach per Drag'n'Drop die entsprechende Blaupause auf den Charakterbogen gezogen werden, um eine Fertigkeit/Fähigkeit/Sprache zu _lernen._ Alternativ kann auch der **Lernen** Button bei den **ungelernten Fertigkeiten** geklickt werden.
Um den **Fertigkeitswert** und die **Leiteigenschaft** einer Fertigkeit anzupassen, kann man auf die Fertigkeit klicken. Dann geht folgender Dialog auf:

View File

@ -1,5 +1,4 @@
{
"moduleName": "Midgard 5. Edition",
"repository": "https://github.com/Byroks/foundry-vtt-system-midgard5",
"rawURL": "https://raw.githubusercontent.com/Byroks/foundry-vtt-system-midgard5"
"repository": "https://git.byroks.de/MidgardVTT-Entwicklung/foundry-vtt-system-midgard5"
}

View File

@ -43,6 +43,7 @@ import less from "gulp-less";
import Logger from "./source/utils/Logger";
import { ModuleData } from "@league-of-foundry-developers/foundry-vtt-types/src/foundry/common/packages.mjs";
import browserify from "browserify";
import { data } from "jquery";
const tsify = require("tsify");
const ts = require("gulp-typescript");
@ -82,10 +83,8 @@ const getManifest = (): Manifest | null => {
} else {
json.root = distPath;
}
const modulePath = path.join(json.root, "module.json");
const systemPath = path.join(json.root, "system.json");
if (fs.existsSync(modulePath)) {
json.file = loadJson(modulePath) as ModuleData;
json.name = "module.json";
@ -95,7 +94,6 @@ const getManifest = (): Manifest | null => {
} else {
return null;
}
return json;
};
@ -309,7 +307,7 @@ const setTargetDir = async () => {
const dp = process.env.FOUNDRY_PATH;
if (!dp) throw Error("FOUNDRY_PATH not defined in environment");
const name = getManifest()!.file.name ?? "midgard5e";
const name = getManifest()!.file.name ?? "midgard5";
distPath = path.join(dp, "Data", "systems", name);
};
@ -330,7 +328,6 @@ const linkUserData = async () => {
const dataPath = process.env.FOUNDRY_PATH;
if (dataPath) {
if (!fs.existsSync(path.join(dataPath, "Data"))) throw Error("User Data path invalid, no Data directory found");
linkDir = path.join(dataPath, "Data", destDir, name as string);
} else {
throw Error("FOUNDRY_PATH not defined in environment");
@ -379,22 +376,26 @@ async function packageBuild() {
// Initialize the zip file
const zipName = `${manifest.file.name}-v${manifest.file.version}.zip`;
const zipFile = fs.createWriteStream(path.join(distPath, zipName));
const zipFile = fs.createWriteStream(zipName);
const zip = archiver("zip", { zlib: { level: 9 } });
zipFile.on("close", () => {
Logger.ok(zip.pointer() + " total bytes");
Logger.ok(`Zip file ${zipName} has been written`);
return resolve(true);
});
zipFile.on("end", function () {
throw "Data has been drained";
});
zip.on("error", (err) => {
throw err;
});
zip.pipe(zipFile);
zip.directory(path.join(process.cwd(), distPath), false);
zip.directory(distPath, manifest.file.name);
return zip.finalize();
} catch (err) {
return reject(err);
@ -422,7 +423,7 @@ const updateManifest = (cb: any) => {
cb(Error("Manifest JSON not found"));
return;
}
if (!rawURL || !repoURL) cb(Error("Repository URLs not configured in foundryconfig.json"));
if (!repoURL) cb(Error("Repository URLs not configured in foundryconfig.json"));
try {
const version = argv.update || argv.u;
@ -469,11 +470,11 @@ const updateManifest = (cb: any) => {
/* Update URLs */
const result = `${rawURL}/v${manifest.file.version}/${distPath}/${manifest.file.name}-v${manifest.file.version}.zip`;
const result = `${repoURL}/releases/download`;
manifest.file.url = repoURL;
manifest.file.manifest = `${rawURL}/master/${manifestRoot}/${manifest.name}`;
manifest.file.download = result;
manifest.file.manifest = `${result}/latest/${manifest.name}?token=2455375115b92bc8d87c93df7159eec232456f2d`;
manifest.file.download = `${result}/v${manifest.file.version}/${manifest.file.name}-v${manifest.file.version}.zip?token=2455375115b92bc8d87c93df7159eec232456f2d`;
const prettyProjectJson = stringify(manifest.file, {
maxLength: 35,
@ -492,9 +493,8 @@ const updateManifest = (cb: any) => {
const gitTaskManifest = (cb: gulp.TaskFunctionCallback) => {
const manifest = getManifest();
if (!manifest) return cb(Error("could not load manifest."));
return gulp
.src([`package.json`, `source/module.json`])
.src([`package.json`, `source/system.json`])
.pipe(git.add({ args: "--no-all -f" }))
.pipe(git.commit(`v${manifest.file.version}`, { args: "-a", disableAppendPaths: true }));
};
@ -504,7 +504,7 @@ const gitTaskBuild = (cb: gulp.TaskFunctionCallback) => {
if (!manifest) return cb(Error("could not load manifest."));
return gulp
.src(`${distPath}/${manifest.file.name}-v${manifest.file.version}.zip`)
.src(`${manifest.file.name}.zip`)
.pipe(git.checkout(`v${manifest.file.version}`, { args: "-b" }))
.pipe(git.add({ args: "--no-all -f" }))
.pipe(git.commit(`v${manifest.file.version}`, { args: "-a", disableAppendPaths: true }));
@ -520,4 +520,4 @@ exports.clean = clean;
exports.link = linkUserData;
exports.package = packageBuild;
exports.update = updateManifest;
//exports.publish = gulp.series(clean, updateManifest, execBuild, bundleModule, packageBuild, gitTaskManifest, gitTaskBuild)
exports.publish = gulp.series(clean, updateManifest, execBuild, bundleModule, packageBuild, gitTaskManifest);

View File

@ -1,232 +1,466 @@
{
"ACTOR.TypeCharacter": "Charakter",
"ACTOR.TypeNpc": "Kreatur / Nichtspielerfigur",
"TYPES.Actor.character": "Charakter",
"TYPES.Actor.npc": "Kreatur / Nichtspielerfigur",
"ACTOR.TypeVehicle": "Transportmittel / Pferd etc.",
"ITEM.TypeItem": "Gegenstand",
"ITEM.TypeWeapon": "Waffe",
"ITEM.TypeDefensiveWeapon": "Verteidigungswaffe",
"ITEM.TypeArmor": "Rüstung",
"ITEM.TypeSpell": "Zauber",
"TYPES.Item.item": "Gegenstand",
"TYPES.Item.skill": "Fertigkeit",
"TYPES.Item.weapon": "Waffe",
"TYPES.Item.defensiveWeapon": "Verteidigungswaffe",
"TYPES.Item.armor": "Rüstung",
"TYPES.Item.spell": "Zauber",
"TYPES.Item.effect": "Aktiver Effekt",
"TYPES.Item.kampfkunst": "Kampfkunst",
"TYPES.Item.container": "Aufbewahrung",
"TYPES.Item.class": "Klasse",
"midgard5.doRoll": "Würfeln",
"midgard5.learn": "Lernen",
"midgard5": {
"phase-action": "Handlungsphase",
"phase-movement": "Bewegungsphase",
"no-encounter": "Kein Kampf",
"encounter-not-started": "Kein aktiver Kampf",
"initiative": "Initiative",
"actionrank": "Handlungsrang",
"midgard5.label": "Bezeichnung",
"midgard5.description": "Beschreibung",
"midgard5.attribute": "Leiteigenschaft",
"midgard5.skill": "Fertigkeit",
"midgard5.skill-value": "Fertigkeitswert",
"midgard5.fw": "FW",
"midgard5.bonus": "Bonus",
"midgard5.ew": "EW",
"midgard5.pp-short": "PP",
"midgard5.pp": "Praxispunkte",
"combat-join": "Kampf Beitreten/Handlungsrang zurücksetzen",
"combat-ranged": "Fernangriff",
"combat-spell": "Zaubern (10 Sec)",
"midgard5.item-value": "Wert",
"midgard5.item-quantity": "Menge",
"midgard5.item-onbody": "Am Körper",
"midgard5.item-ismagic": "Ist Magisch",
"time-duration": "Dauer",
"time-round": "Runde(n)",
"time-minute": "Minute(n)",
"time-hour": "Stunde(n)",
"time-limitless": "Unbegrenzt",
"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",
"doRoll": "Würfeln",
"learn": "Lernen",
"midgard5.aktuell": "Akt.",
"midgard5.maximum": "Max.",
"midgard5.attrvalue": "Wert",
"midgard5.movementRange": "Bewegungsweite",
"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.base_values": "Grundwerte",
"midgard5.skills": "Fertigkeiten",
"midgard5.gear": "Ausrüstung",
"midgard5.spells": "Zauber",
"skill": "Fertigkeit",
"skill-value": "Fertigkeitswert",
"fw": "FW",
"bonus": "Bonus",
"bonuses": "Boni",
"ew": "EW",
"pp-short": "PP",
"pp": "Praxispunkte",
"midgard5.class": "Klasse",
"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",
"item-value": "Wert",
"item-quantity": "Menge",
"item-onbody": "Am Körper",
"item-ismagic": "Ist Magisch",
"item-wealth": "Vermögenswert",
"item-weight": "Gewicht",
"item-abw": "ABW",
"item-abw-long": "Ausbrennwahrscheinlichkeit",
"midgard5.exp-overall": "Erfahrungsschatz",
"midgard5.exp-available": "Erfahrungspunkte",
"midgard5.grace": "Göttliche Gnade",
"midgard5.destiny": "Schicksalsgunst",
"midgard5.luckPoints": "Glückspunkte",
"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.akrobatik": "Akrobatik",
"midgard5.alchimie": "Alchimie",
"midgard5.anfuehren": "Anführen",
"midgard5.athletik": "Athletik",
"midgard5.balancieren": "Balancieren",
"midgard5.beidhaendigerKampf": "Beidhändiger Kampf",
"midgard5.beredsamkeit": "Beredsamkeit",
"midgard5.betaeuben": "Betäuben",
"midgard5.bootfahren": "Bootfahren",
"midgard5.ersteHilfe": "Erste Hilfe",
"midgard5.etikette": "Etikette",
"midgard5.fallenEntdecken": "Fallen entdecken",
"midgard5.fallenmechanik": "Fallenmechanik",
"midgard5.faelschen": "Fälschen",
"midgard5.fechten": "Fechten",
"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.klettern": "Klettern",
"midgard5.landeskunde": "Landeskunde",
"midgard5.laufen": "Laufen",
"midgard5.lesenVonZauberschrift": "Lesen von Zauberschrift",
"midgard5.meditieren": "Meditieren",
"midgard5.menschenkenntnis": "Menschenkenntnis",
"midgard5.meucheln": "Meucheln",
"midgard5.musizieren": "Musizieren",
"midgard5.naturkunde": "Naturkunde",
"midgard5.pflanzenkunde": "Pflanzenkunde",
"midgard5.reiten": "Reiten",
"midgard5.reiterkampf": "Reiterkampf",
"midgard5.scharfschiessen": "Scharfschießen",
"midgard5.schleichen": "Schleichen",
"midgard5.schloesserOeffnen": "Schlösser öffnen",
"midgard5.schwimmen": "Schwimmen",
"midgard5.seilkunst": "Seilkunst",
"midgard5.spurensuche": "Spurensuche",
"midgard5.stehlen": "Stehlen",
"midgard5.tarnen": "Tarnen",
"midgard5.tauchen": "Tauchen",
"midgard5.tierkunde": "Tierkunde",
"midgard5.ueberleben": "Überleben",
"midgard5.verfuehren": "Verführen",
"midgard5.verhoeren": "Verhören",
"midgard5.verstellen": "Verstellen",
"midgard5.wagenlenken": "Wagenlenken",
"midgard5.zauberkunde": "Zauberkunde",
"aktuell": "Akt.",
"maximum": "Max.",
"attrvalue": "Wert",
"movementRange": "Bewegungsweite",
"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": "Giftresistenz",
"midgard5.enduranceBonus": "Ausdauerbonus",
"base_values": "Grundwerte",
"skills": "Fertigkeiten",
"gear": "Ausrüstung",
"spells": "Zauber",
"effects": "Aktive Effekte",
"kampfkuenste": "Kampfkünste",
"combat": "Kampf",
"midgard5.new-skill": "Neue Fertigkeit",
"midgard5.special": "Spezial",
"midgard5.learned-skill": "Gelernte Fertigkeit",
"midgard5.language": "Sprache",
"midgard5.weapon-skill": "Waffenfertigkeit",
"midgard5.unlearned-skill": "Ungelernte Fertigkeit",
"midgard5.innate-ability": "Angeborene Fähigkeit",
"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.base-damage": "Grundschaden",
"midgard5.defensive-weapon": "Verteidigungswaffe",
"midgard5.no-skill": "Keine Fertigkeit",
"midgard5.magic": "magisch",
"midgard5.rangedWeapon": "Schusswaffe",
"midgard5.assignItemToCharacter": "Füge Gegenstand einem Charakter hinzu, um Fähigkeit auwählen zu können",
"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.pw": "Prüfwurf",
"midgard5.attack": "Angriff",
"midgard5.damage": "Schaden",
"no-container": "Ohne",
"midgard5.spell-process-none": "Ohne",
"midgard5.spell-process-beherrschen": "Beherrschen",
"midgard5.spell-process-bewegen": "Bewegen",
"midgard5.spell-process-erkennen": "Erkennen",
"midgard5.spell-process-erschaffen": "Erschaffen",
"midgard5.spell-process-formen": "Formen",
"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-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",
"encumbrance": "Getragene Last",
"load": "Normallast",
"heavy-load": "Schwere Last",
"thrust-load": "Schublast",
"load-max": "Höchstlast",
"capacity": "Tragkraft",
"midgard5.spell-type-gedanke": "Gedanke",
"midgard5.spell-type-geste": "Geste",
"midgard5.spell-type-wort": "Wort",
"exp-overall": "Erfahrungsschatz",
"exp-available": "Erfahrungspunkte",
"grace": "Göttliche Gnade",
"destiny": "Schicksalsgunst",
"luckPoints": "Glückspunkte",
"midgard5.spell-target-umgebung": "Umgebung",
"midgard5.spell-target-geist": "Geist",
"midgard5.spell-target-koerper": "Körper",
"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",
"bildendeKuensteA": "Bildende Künste (Architektur)",
"bildendeKuensteB": "Bildende Künste (Bildhauerei)",
"bildendeKuensteG": "Bildende Künste (Grafik)",
"bildendeKuensteM": "Bildende Künste (Malerei)",
"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.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",
"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.mod-operation-add100": "Addieren (max 100)",
"midgard5.mod-operation-add": "Addieren",
"midgard5.mod-operation-set": "Basiswert",
"midgard5.mod-operation-fixed": "Fester Wert",
"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.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": "Giftresistenz",
"midgard5.mod-stat-lp": "Lebenspunkte",
"midgard5.mod-stat-ap": "Ausdauerpunkte",
"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",
"showUnlearned": "Ungelernte Fertigkeiten",
"wealthAndWeight": "Vermögen und Lasten",
"itemsInContainers": "Gegenstände in Aufbewahrung",
"allItems": "Alle Gegenstände",
"midgard5.mod-type": "Typ der Modifikation",
"midgard5.mod-id": "Was soll modifiziert werden",
"midgard5.mod-operation": "Wie soll modifiziert werden",
"midgard5.mod-value": "Wert",
"pw": "Prüfwurf",
"attack": "Angriff",
"damage": "Schaden",
"midgard5.type": "Typ",
"midgard5.formula": "Formel",
"midgard5.roll": "Wurf"
"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",
"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",
"spell-type-gedanke": "Gedanke",
"spell-type-geste": "Geste",
"spell-type-wort": "Wort",
"spell-target-umgebung": "Umgebung",
"spell-target-geist": "Geist",
"spell-target-koerper": "Körper",
"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",
"spell-rank": "Stufe",
"kampfkunst-type": "Form",
"kampfkunst-variante": "Variante",
"kampfkunst-variante-short": "Var",
"kampfkunst-ep": "Erfahrungspunkte",
"kampfkunst-rank": "Stufe der Technik",
"kampfkunst-weapon": "Waffengruppe",
"kampfkunst-enemy": "Einschränkungen durch Art der Gegner",
"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",
"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",
"kido-type": "KiDo Form",
"kido-variante": "KiDo Variante",
"kido-color": "Kampfstilfarbe",
"kido-style": "Art der Technik",
"kido-rank": "Stufe der Technik",
"kido-grade": "Ausbildungsgrad",
"kido-enemy": "Einschränkungen durch Art der Gegner",
"kido-weapon": "Waffengruppe",
"kido-type-angriff": "Kido Angriff",
"kido-type-verteidigung": "Kido Verteidigung",
"kido-type-finte": "Kido Finte",
"kido-type-leib": "Kido Leibestechnik",
"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",
"kido-variante-finte": "Finte",
"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": "Wurfmodifikator",
"difficulty": "Erfolg",
"rollMode": "Würfelmodus"
}
}
}
}

Binary file not shown.

View File

@ -1 +0,0 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M274.663 63.02L90.792 80.26l154.193 19.273c5.063-13.339 12.952-24.341 22.541-31.828a52.072 52.072 0 0 1 7.137-4.683zm19.832 12.803c-5.092.166-10.492 2.296-15.879 6.502-7.835 6.118-15.009 16.575-18.83 29.688-3.821 13.112-3.477 26.099-.289 35.927 3.188 9.829 8.73 16.071 15.633 18.395 6.903 2.324 14.766.596 22.601-5.522 7.835-6.117 15.01-16.574 18.83-29.687 3.822-13.113 3.48-26.1.292-35.928-3.189-9.828-8.73-16.07-15.633-18.394a19.017 19.017 0 0 0-6.725-.98zm166.85 9.485c-24.113 13.949-46.193 20.298-87.233 17.252L340.48 228.452c-.675 2.682-.318 6 1.922 10.87 2.243 4.876 6.355 10.89 11.836 17.607 9.99 12.242 24.527 27.16 39.573 44.238 14.56-5.5 28.23-12.828 38.972-20.19 11.841-8.113 20.234-16.95 21.965-19.939l42.027-118.22c-16.748-14.613-29.471-33.974-35.43-57.51zm-288.07 51.261L23.652 158.331l89.309 12.988 2.158-5.052zm286.265 2.325l16.941 6.078-39.123 109.037-37.212 19.181-8.247-15.998 30.913-15.933zm-259.842 4.394l-70.586 36.043-29.222 68.422 19.218 8.809 24.905-57.764 59.299-22.973-14.702 75.955-.963 1.477c-32.725 50.18-71.654 93.41-118.464 134.28L42.722 432.98l17.021 7.245 31.875-43.989 1.38-.906c45.476-29.872 75.93-62.333 112.255-94.492l4.533-4.012 5.426 2.686c23.365 11.571 42.934 24.117 62.107 37.705l8.924 6.324-69.006 65.643 24.649 39.794 17.67-10.308-20.078-28.477 8.224-5.004c29.884-18.186 49.986-39.43 71.938-66.039-23.653-35.6-42.006-49.433-71.592-71.267l9.908-7.227c34.703-25.312 38.132-54.476 41.61-79.449-9.203 4.441-19.498 5.772-29.473 2.414-13.488-4.54-22.924-16.472-27.465-30.473-.17-.522-.321-1.054-.479-1.584zm116.62 45.04c-1.355 7.027-3.324 14.17-6.092 21.349l14.056 9.666 5.938-22.223zm-174.243 97.476l-126.85 17.953 99.67 14.105a598.987 598.987 0 0 0 27.18-32.058zm91.781 82.73l-95.892 21.432 59.406 13.277z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -1 +0,0 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M214.475 29.258L161.77 81.96c16.936 20.538 28.36 42.014 27.927 65.403-.452 24.518-14.472 48.98-43.79 73.528l5.99 17.694c71.606-19.315 130.42-50.42 170.478-101.428l-107.9-107.898zm-57.424 77.54L21.24 211.07v51.764l149.748-115.11c.008-.236.02-.472.026-.706.24-13-4.75-26.334-13.96-40.22zm276.18 3.19l-36.34 84.352 70.038-48.074-33.7-36.278zm-97.543 40.48c-42.955 53.685-105.04 86.063-177.787 105.852l14.08 41.59c18.005.184 38.99-3.06 60.754-9.574.94-1.584 1.904-3.157 2.924-4.705 23.146-35.122 66.755-62.113 114.967-66.79 8.404-8.93 16.06-18.51 22.73-28.705l-37.668-37.666zm29.745 84.34c-47.143 0-92.654 26.458-114.168 59.106-10.757 16.324-15.532 33.768-12.805 50.416 2.726 16.648 12.827 33.23 34.772 48.188l6.118 4.168c13.21 6.097 27.513 9.598 40.26 10.794l-38.04 5.555-20.562 43.145c11.34 9.924 24.012 17.9 37.492 23.927l10.53-45.236 18.202 4.24-11.09 47.646c13.566 4.21 27.673 6.614 41.858 7.203v-52.015h18.688v51.74c13.787-.973 27.45-3.665 40.56-8.07l-10.443-46.578 18.236-4.09 9.77 43.57c11.56-5.517 22.482-12.496 32.422-20.94l-21.39-44.884-35.71-5.213c10.606-.995 22.29-3.588 33.524-7.94l12.13-5.782c24.48-15.652 35.938-32.698 39.337-49.32 3.44-16.818-1.263-34.156-12.35-50.5-22.174-32.69-70.172-59.13-117.34-59.13zm-50.62 84.174c19.09 0 34.567 15.475 34.567 34.565 0 19.09-15.48 34.566-34.567 34.566-19.09 0-34.565-15.476-34.565-34.566 0-19.09 15.474-34.565 34.565-34.565zm105.547 0c19.09 0 34.564 15.476 34.564 34.565 0 19.09-15.476 34.566-34.565 34.566-19.09 0-34.565-15.476-34.565-34.566 0-19.09 15.474-34.565 34.564-34.565zm-233.737 3.747l-108.115.26 24.996 43.334 83.12-43.595zm23.623 15.715l-56.36 83.56 44.692 15.724 11.668-99.285zm107.7 9.703c-5.715 0-10.147 4.433-10.147 10.147 0 5.715 4.432 10.146 10.145 10.146 5.714 0 10.147-4.43 10.147-10.145s-4.43-10.147-10.147-10.147zm99.28 0c-5.715 0-10.146 4.432-10.146 10.147 0 5.714 4.433 10.146 10.147 10.146 5.713 0 10.146-4.43 10.146-10.145 0-5.714-4.432-10.147-10.146-10.147zm-49.835 14.297l23.046 53.694c-11.686 7.06-33.125 7.013-44.42 1.95l21.375-55.645z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -1 +0,0 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M45.906 23.625v9.344c0 102.68 10.49 205.087 41.125 288.155 30.637 83.068 82.364 147.415 163.75 169.78l2.22.626 2.22-.5C344.49 472 396.864 407.39 425.593 323.47c28.728-83.92 35.25-187.777 35.25-290.5v-9.345H45.906zM64.72 42.313H442.06c-.413 98.8-7.497 197.342-34.125 275.125-27.21 79.487-73.39 136.637-154.375 154.78-73.28-21.03-119.914-78.696-149-157.562-28.475-77.212-39.206-174.13-39.843-272.344zm18.81 18.75c.807 84.13 12.486 172.823 39.314 244.812 7.825 20.998 16.874 40.495 27.25 58.063l45.844-38.438-40.75-75.063-5.47-10.062 10.97-3.344s38.865-11.786 60.406-18.25l20.437-7.25-94.843-150.468H83.53zm160.25 0l45.782 91.5 132.407-43.157c.69-16.205 1.053-32.366 1.155-48.344H243.78zm177.157 68.343L298.031 169.47l24.908 49.78 25.875 48.72 53.28-1.845c10.245-42.834 16.03-89.664 18.844-136.72zM310.908 236.47l-30.75 10.374 67.25 145.187c17.813-23.2 31.737-51.6 42.624-83.686 2.578-7.595 4.966-15.39 7.19-23.344l-53.626 1.844-5.844.22-2.75-5.158-24.094-45.437zm-99.22 4.686c-13.133 3.972-27.346 8.262-34.625 10.47L216 323.28l3.625 6.72-5.844 4.906-53.56 44.906c24.67 35.91 55.887 61.828 94.655 73.125 30.34-6.91 55.36-21.496 76.03-42.062L211.69 241.155z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1 +0,0 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M246.8 35.58l25.5 52.5 24.8-22.9-50.3-29.6zm109.1 13.41l-10.3 9.51 52.9 57.3 10.3-9.5-52.9-57.31zm-30.3 14.37l-57.3 52.94 66.5 72 57.3-53-66.5-71.94zM181.8 93.33l-19.5 49.17L196 187l-14.2-93.67zM75.81 127l-32.42 13.8 94.41 52.1L75.81 127zm186.09 8.9l-16.2 15-32 44.1 62.7-18.2-33.6 70.7 32.4-17.8 39.6-36.6-52.9-57.2zm232.1 2.4c-3.1.8-6.1 1.6-9.2 2.3-25.7 5.9-51.9 8.5-74.5 2.3l-69.4 64.2c4.5 23-.2 48.9-8.1 74.1-8.7 27.5-21.6 54.1-32.9 75.4 60.6 17.3 133-11.2 187.1-61.1 2.4-2.2 4.7-4.5 7-6.7V138.3zM76.71 232.6l-18.78 37.6 72.57-21.6-53.79-16zm117.19 48l-24 51.8-21-34.4-47.2 196H182l37.2-154.6-25.7 29.5.4-88.3z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 880 B

View File

@ -1 +0,0 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M279.775 17.137c-18.823-.262-38.412 6.822-51.54 20.02l-5.858 5.89-6.535-5.127c-35.796-28.083-78.147-22.538-98.727 10.39l-3.465 5.547-6.398-1.357c-27.027-5.737-53.6 4.882-69.373 23.047-15.776 18.165-21.16 42.634-5.937 68.43l3.68 6.234-5.12 5.122c-7.12 7.122-9.71 16.235-8.956 26.824.753 10.59 5.242 22.277 12.04 31.98 6.8 9.705 15.853 17.3 24.67 20.634 8.82 3.333 16.93 3.112 25.68-2.877l6.626-4.538 5.48 5.868c18.752 20.07 63.427 19.456 81.504-9.315l4.967-7.906 7.91 4.96c9.652 6.05 21.095 6.628 32.078 3.243 10.983-3.384 21.017-10.924 26.445-19.56l8.34-13.272 7.707 13.648c5.984 10.6 21.754 20.7 39.238 24.517 17.485 3.818 35.716 1.47 46.955-7.793l7.116-5.863 5.96 7.036c13.405 15.834 34.384 19.713 51.292 15.234 8.453-2.24 15.61-6.562 20.1-11.894 4.49-5.332 6.64-11.394 5.548-19.36l-1.412-10.292 10.386-.317c14.28-.435 23.67-5.757 30.195-13.635 6.527-7.877 9.99-18.775 9.966-30.103-.05-22.658-12.994-45.11-39.104-48.66l-9.843-1.34 1.936-9.743c1.49-7.49-1.057-16.514-7.54-25.764-6.485-9.25-16.708-18.272-28.37-24.904-11.662-6.634-24.726-10.866-36.596-11.388-11.87-.522-22.266 2.385-30.62 9.863l-7.743 6.934-6.072-8.437c-10.336-14.36-27.786-21.715-46.61-21.976zm-23.13 207.613c-7.79 7.932-17.737 13.957-28.64 17.316-12.57 3.874-26.675 4.027-39.61-1.3-13.607 16.66-33.646 25.044-53.58 25.658.803 2.694 2.022 5.36 3.65 7.885 4.48 6.947 11.786 12.436 20.377 14.188 8.59 1.752 18.766.2 30.504-8.578l9.133-6.828 4.9 10.295c1.805 3.793 10.955 9.652 22.417 10.94 11.462 1.286 23.836-1.518 30.982-8.206l7.2-6.737 6.34 7.55c7.687 9.153 18.164 11.31 28.223 9.768 10.06-1.54 18.25-8.15 19.394-10.936l4.225-10.297 9.41 5.943c9.343 5.9 17.365 6.48 24.47 4.494 7.103-1.987 13.382-6.983 17.39-13.273 3.672-5.763 5.297-12.387 4.51-18.327-7.83-2.86-15.302-7.21-21.903-13.22-16.45 9.763-37.038 10.807-55.794 6.712-16.836-3.676-32.71-11.465-43.6-23.045zm5.767 80.373c-7.74 4.837-16.592 7.306-25.443 8.002v41.938c-39.484 1.013-74.942 4.618-102.22 10.093-16.214 3.255-29.515 7.07-39.53 11.844-5.01 2.387-9.234 4.994-12.69 8.406-3.454 3.412-6.343 8.197-6.343 13.75 0 5.553 2.866 10.328 6.313 13.75 3.447 3.422 7.682 6.03 12.688 8.438 10.01 4.818 23.314 8.72 39.53 12.03 20.218 4.13 44.93 7.244 72.438 9-15.85 21.005-36.292 38.707-56.937 50.438H364.5c-20.393-12.03-39.75-29.664-54.72-50.312 28.51-1.726 54.114-4.872 74.94-9.125 16.215-3.312 29.52-7.213 39.53-12.03 5.006-2.41 9.24-5.016 12.688-8.44 3.446-3.42 6.28-8.196 6.28-13.75 0-5.55-2.857-10.337-6.312-13.75-3.455-3.41-7.68-6.018-12.687-8.405-10.017-4.773-23.32-8.59-39.533-11.844-27.645-5.55-63.688-9.17-103.812-10.125v-40.776c-6.473-1.61-12.817-4.55-18.463-9.13zm19.12 68.596c38.834.986 73.608 4.558 99.468 9.75 15.31 3.072 27.538 6.774 35.156 10.405 3.81 1.815 6.438 3.64 7.625 4.813.298.293.28.317.408.468-.13.156-.123.188-.438.5-1.196 1.187-3.814 3.04-7.625 4.875-7.622 3.67-19.85 7.406-35.156 10.533-22.08 4.51-50.67 7.833-82.72 9.343-8.816-16.007-14.824-33.213-16.72-50.687zm-45.157.06c-1.88 17.484-8.158 34.644-17.28 50.533-31.217-1.555-59.056-4.838-80.657-9.25-15.308-3.127-27.534-6.863-35.157-10.532-3.81-1.833-6.428-3.686-7.624-4.874-.32-.318-.31-.344-.437-.5.126-.15.134-.17.436-.47 1.188-1.17 3.785-2.996 7.594-4.81 7.62-3.632 19.846-7.334 35.156-10.407 25.525-5.125 59.738-8.648 97.97-9.69z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -1 +0,0 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M375.483 251.243l-109.98 51.138.213 183.381L477.01 266.346l-86.993-21.81zm-12.736 108.626l-5.947 14.699-48.604-8.955 5.007-12.832a141.306 141.306 0 0 0 13.51-11.358 167.184 167.184 0 0 0 16.566-17.517 170.478 170.478 0 0 0 12.606-17.958 115.607 115.607 0 0 0 9.514-17.97l14.068 2.51q-9.37 22.334-30.361 44.43-13.296 13.64-20.645 18.636zM121.603 244.334l-84.71 21.763L246.474 486V302.38l-109.946-51.137zm19.147 50.852a28.72 28.72 0 0 1 24.273 6.802 53.052 53.052 0 0 1 11.226 14.188l-13.081 2.676a28.542 28.542 0 0 0-5.388-7.374q-5.185-4.876-11.262-3.853l-.487.095a6.458 6.458 0 0 0-5.162 4.448c-.856 2.378-.238 5.554 1.796 9.371q4.08 7.6 10.81 9.027a23.785 23.785 0 0 0 8.563-.203l1.867-.344 5.791 10.822q-6.398 1.427-8.23 3.282-3.21 3.14.429 9.93a17.042 17.042 0 0 0 6.089 6.696 10.406 10.406 0 0 0 7.385 1.534l.416-.083q4.757-.964 5.079-4.757c.261-2.57-.655-5.744-2.748-9.514l12.38-2.545a49.247 49.247 0 0 1 4.103 11.226 19.956 19.956 0 0 1-.642 9.383 11.702 11.702 0 0 1-3.96 5.411 19.575 19.575 0 0 1-8.027 3.235l-1.19.214a27.971 27.971 0 0 1-17.494-2.7 32.193 32.193 0 0 1-14.128-14.092q-3.627-6.79-2.604-12.19a8.396 8.396 0 0 1 2.521-4.947h-.071q-1.844.31-7.04-2.497a32.11 32.11 0 0 1-12.916-13.593q-5.245-9.764-3.282-18.398 1.962-8.634 13.676-11zM27.19 248.865l108.78-116.309a7.135 7.135 0 0 1 1.427 0h.154q3.14.345 2.842 3.71a19.36 19.36 0 0 1-3.294 8.1 39.376 39.376 0 0 1-9.728 10.405q-3.912 2.938-15.044 9.514-12.796 7.505-19.55 14.77a92.535 92.535 0 0 0-11.513 14.486l32.907 3.758 8.182-12.963-20.967-2.378a36.415 36.415 0 0 1 4.757-3.83q2.379-1.605 8.444-5.125l6.422-3.747a92.975 92.975 0 0 0 12.903-8.776 61.472 61.472 0 0 0 12.51-14.414q6.84-10.846 6.494-17.957c-.19-3.949-2.105-6.434-5.684-7.505l79.798-85.161-102.097 179.576-5.708 10.06zm367.238-71.974q-3.817-5.458-3.758-8.515c0-2.033 1.19-3.199 3.568-3.448h.57a11.892 11.892 0 0 1 6.91 2.247 29.85 29.85 0 0 1 7.837 8.051q3.687 5.28 3.71 8.397c0 2.093-1.188 3.258-3.496 3.567h-.594a11.75 11.75 0 0 1-6.957-2.378 29.79 29.79 0 0 1-7.79-7.885zm-109.41-141.52l83.948 89.634h-1.189c-.38 0-.975 0-1.463.107q-7.825.892-8.324 6.862-.5 5.97 5.03 13.747a53.778 53.778 0 0 0 6.375 7.374 37.901 37.901 0 0 0 10.144 6.897q-2.117 2.89-.702 7.98a37.283 37.283 0 0 0 5.613 11.096 55.122 55.122 0 0 0 15.223 14.806q8.098 5.268 16.066 4.935.81 0 1.618-.13 8.776-.988 9.228-7.873a16.114 16.114 0 0 0-.463-4.853l58.689 62.686-91.572-22.941-6.1-10.703zm98.22 104.927l2.45 2.617c.451.57.903 1.189 1.355 1.784 1.808 2.592 2.723 4.757 2.723 6.529 0 1.771-1.034 2.782-3.127 3.02h-.512a10.346 10.346 0 0 1-6.077-1.95 22.596 22.596 0 0 1-6.184-6.137c-1.974-2.83-2.937-5.102-2.878-6.814.06-1.713 1.118-2.7 3.187-2.937h.524a10.263 10.263 0 0 1 6.005 1.879 19.147 19.147 0 0 1 2.533 2.01zM255.987 26L137.456 231.026l118.532 55.05 118.604-55.05zm-1.19 208.463q-17.529 0-24.58-12.273-7.053-12.273-7.053-34.988 0-22.714 7.052-35.047 7.052-12.332 24.582-12.344 17.53 0 24.582 12.332 7.052 12.333 7.052 35.047 0 22.715-7.052 34.988-7.053 12.273-24.582 12.285zm10.538-71.807q2.497 7.968 2.497 24.546 0 15.817-2.497 24.201-2.498 8.384-10.537 8.325-8.04 0-10.632-8.325-2.593-8.324-2.593-24.2 0-16.579 2.593-24.547t10.632-7.968q8.015-.012 10.513 7.956z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -1 +0,0 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><polygon points="384,477.7,256,426.67,128,477.7,108.2,341.33,0,256,108.2,170.67,128,34.3,256,85.33,384,34.3,403.8,170.67,512,256,403.8,341.33" fill="#ac2929" fill-opacity="1"></polygon><g class="" style="" transform="translate(0,0)"><path d="M375.483 251.243l-109.98 51.138.213 183.381L477.01 266.346l-86.993-21.81zm-12.736 108.626l-5.947 14.699-48.604-8.955 5.007-12.832a141.306 141.306 0 0 0 13.51-11.358 167.184 167.184 0 0 0 16.566-17.517 170.478 170.478 0 0 0 12.606-17.958 115.607 115.607 0 0 0 9.514-17.97l14.068 2.51q-9.37 22.334-30.361 44.43-13.296 13.64-20.645 18.636zM121.603 244.334l-84.71 21.763L246.474 486V302.38l-109.946-51.137zm19.147 50.852a28.72 28.72 0 0 1 24.273 6.802 53.052 53.052 0 0 1 11.226 14.188l-13.081 2.676a28.542 28.542 0 0 0-5.388-7.374q-5.185-4.876-11.262-3.853l-.487.095a6.458 6.458 0 0 0-5.162 4.448c-.856 2.378-.238 5.554 1.796 9.371q4.08 7.6 10.81 9.027a23.785 23.785 0 0 0 8.563-.203l1.867-.344 5.791 10.822q-6.398 1.427-8.23 3.282-3.21 3.14.429 9.93a17.042 17.042 0 0 0 6.089 6.696 10.406 10.406 0 0 0 7.385 1.534l.416-.083q4.757-.964 5.079-4.757c.261-2.57-.655-5.744-2.748-9.514l12.38-2.545a49.247 49.247 0 0 1 4.103 11.226 19.956 19.956 0 0 1-.642 9.383 11.702 11.702 0 0 1-3.96 5.411 19.575 19.575 0 0 1-8.027 3.235l-1.19.214a27.971 27.971 0 0 1-17.494-2.7 32.193 32.193 0 0 1-14.128-14.092q-3.627-6.79-2.604-12.19a8.396 8.396 0 0 1 2.521-4.947h-.071q-1.844.31-7.04-2.497a32.11 32.11 0 0 1-12.916-13.593q-5.245-9.764-3.282-18.398 1.962-8.634 13.676-11zM27.19 248.865l108.78-116.309a7.135 7.135 0 0 1 1.427 0h.154q3.14.345 2.842 3.71a19.36 19.36 0 0 1-3.294 8.1 39.376 39.376 0 0 1-9.728 10.405q-3.912 2.938-15.044 9.514-12.796 7.505-19.55 14.77a92.535 92.535 0 0 0-11.513 14.486l32.907 3.758 8.182-12.963-20.967-2.378a36.415 36.415 0 0 1 4.757-3.83q2.379-1.605 8.444-5.125l6.422-3.747a92.975 92.975 0 0 0 12.903-8.776 61.472 61.472 0 0 0 12.51-14.414q6.84-10.846 6.494-17.957c-.19-3.949-2.105-6.434-5.684-7.505l79.798-85.161-102.097 179.576-5.708 10.06zm367.238-71.974q-3.817-5.458-3.758-8.515c0-2.033 1.19-3.199 3.568-3.448h.57a11.892 11.892 0 0 1 6.91 2.247 29.85 29.85 0 0 1 7.837 8.051q3.687 5.28 3.71 8.397c0 2.093-1.188 3.258-3.496 3.567h-.594a11.75 11.75 0 0 1-6.957-2.378 29.79 29.79 0 0 1-7.79-7.885zm-109.41-141.52l83.948 89.634h-1.189c-.38 0-.975 0-1.463.107q-7.825.892-8.324 6.862-.5 5.97 5.03 13.747a53.778 53.778 0 0 0 6.375 7.374 37.901 37.901 0 0 0 10.144 6.897q-2.117 2.89-.702 7.98a37.283 37.283 0 0 0 5.613 11.096 55.122 55.122 0 0 0 15.223 14.806q8.098 5.268 16.066 4.935.81 0 1.618-.13 8.776-.988 9.228-7.873a16.114 16.114 0 0 0-.463-4.853l58.689 62.686-91.572-22.941-6.1-10.703zm98.22 104.927l2.45 2.617c.451.57.903 1.189 1.355 1.784 1.808 2.592 2.723 4.757 2.723 6.529 0 1.771-1.034 2.782-3.127 3.02h-.512a10.346 10.346 0 0 1-6.077-1.95 22.596 22.596 0 0 1-6.184-6.137c-1.974-2.83-2.937-5.102-2.878-6.814.06-1.713 1.118-2.7 3.187-2.937h.524a10.263 10.263 0 0 1 6.005 1.879 19.147 19.147 0 0 1 2.533 2.01zM255.987 26L137.456 231.026l118.532 55.05 118.604-55.05zm-1.19 208.463q-17.529 0-24.58-12.273-7.053-12.273-7.053-34.988 0-22.714 7.052-35.047 7.052-12.332 24.582-12.344 17.53 0 24.582 12.332 7.052 12.333 7.052 35.047 0 22.715-7.052 34.988-7.053 12.273-24.582 12.285zm10.538-71.807q2.497 7.968 2.497 24.546 0 15.817-2.497 24.201-2.498 8.384-10.537 8.325-8.04 0-10.632-8.325-2.593-8.324-2.593-24.2 0-16.579 2.593-24.547t10.632-7.968q8.015-.012 10.513 7.956z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -1 +0,0 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M248 20.3L72.33 132.6 248 128.8zm16 0v108.5l175.7 3.8zm51.4 58.9c6.1 3.5 8.2 7.2 15.1 4.2 10.7.8 22.3 5.8 27.6 15.7 4.7 4.5 1.5 12.6-5.2 12.6-9.7.1-19.7-6.1-14.6-8.3 4.7-2 14.7.9 10-5.5-3.6-4.5-11-7.8-16.3-5.9-1.6 6.8-9.4 4-12-.7-2.3-5.8-9.1-8.2-15-7.9-6.1 2.7 1.6 8.8 5.3 9.9 7.9 2.2.2 7.5-4.1 5.1-4.2-2.4-15-9.6-13.5-18.3 5.8-7.39 15.8-4.62 22.7-.9zm-108.5-3.5c5.5.5 12.3 3 10.2 9.9-4.3 7-9.8 13.1-18.1 14.8-6.5 3.4-14.9 4.4-21.6 1.9-3.7-2.3-13.5-9.3-14.9-3.4-2.1 14.8.7 13.1-11.1 17.8V92.3c9.9-3.9 21.1-4.5 30.3 1.3 8 4.2 19.4 1.5 24.2-5.7 1.4-6.5-8.1-4.6-12.2-3.4-2.7-8.2 7.9-7.5 13.2-8.8zm35 69.2L55.39 149l71.21 192.9zm28.2 0l115.3 197L456.6 149zm-14.1 7.5L138.9 352.6h234.2zm133.3 21.1c13.9 8.3 21.5 26.2 22.1 43-1.3 13.6-.7 19.8-15.2 21.4-14.5 1.6-23.9-19.2-29.7-32.6-3.4-9.9-5.8-24 1.7-31.3 6.1-4.8 15-4.1 21.1-.5zm-223.7 16.1c2.1 4-.5 11.4-4.8 12.1-4.9.7-3.8-9.3-9.4-11.6-6.9-2.3-13.6 5.6-15 11.6 10.4-4 20.3 7.1 20.3 17-.4 11.7-7.9 24.8-19.7 28.1h-5.6c-12.7-.7-18.3-15.8-14.2-26.6 4.4-15.8 10.8-33.9 27.2-40.6 8.5-3.9 19 3.2 21.2 10zm213.9-8.4c-7.1-.1-4.4 10-3.3 14.5 3.5 11.5 7.3 26.6 18.9 30 6.8-1.2 4.4-12.8 3.7-16.5-4.7-10.9-7.1-23.3-19.3-28zM52 186v173.2l61.9-5.7zm408 0l-61.9 167.5 61.9 5.7zm-117.9.7l28.5 63.5-10 4.4-20-43.3c-6.1 3-13 8.9-14.6-1.4-1.3-3.9 8.5-5.1 8.1-11.9-.3-6.9 2.2-12.2 8-11.3zm-212 27.4c-2.4 5.1-4.1 10.3-2.7 15.9 1.7 8.8 13.5 6.4 15.6-.8 2.7-5 3.9-11.7-.5-15.7-4.1-3.4-8.9-2.8-12.4.6zm328.4 41.6c-.1 18.6 1.1 39.2-9.7 55.3-.9 1.2-2.2 1.9-3.7 2.5-5.8-4.1-3-11.3 1.2-15.5 1 7.3 5.5-2.9 6.6-5.6 1.3-3.2 3.6-17.7-1-10.2.7 4-6.8 13.1-9.3 8.1-5-14.4 0-30.5 7-43.5 5.7-6.2 9.9 4.4 8.9 8.9zM59.93 245.5c.59.1 1.34 1 2.48 3.6v61.1c-7.3-7-4.47-18-4.45-26.4 0-8.4 1.65-16.3-1.28-23.2-4.62-1.7-5.79-17-3.17-12.7 4.41 4.8 4.66-2.7 6.42-2.4zm178.77 7.6c8.1 4.5 13.8 14.4 10.8 23.6-2.1 15.2-27 21.1-30.4 29.7-1.2 3 25.4 1.6 30.2 1.6.5 4 1.5 10.7-3.8 11.7-14.5-1.2-29.9-.6-45.1-.6.4-11.2 7.4-21.3 17-26.8 6.9-4.9 15.4-9.3 18.1-17.9 1.8-4.5-.6-9.3-4.6-11.5-4.2-2.9-11-2.3-13.2 2.7-2 3.8-4.4 9.1-8.7 9.6-2.9.4-9 .5-7.2-4.9 1.4-5.6 3.4-11.5 8.2-15.2 8.8-6.3 19.9-6.7 28.7-2zm53.3-1.4c6.8 2.2 12 7.9 14.3 14.6 6.1 14.7 5.5 33.1-4.4 45.9-4.5 4.8-10.2 9.1-17 9.1-12.5-.1-22.4-11.1-24.8-22.8-3.1-13.4-1.8-28.7 6.9-39.8 6.8-7.6 16-10.3 25-7zm156.1 8.1c-1.6 5.9-3.3 13.4-.7 19.3 5.1-2 5.4-9.6 6.6-14.5.9-6.1-3.5-12.6-5.9-4.8zm-176.2 21.1c.6 10.5 1.7 22.8 9.7 28.2 4.9 1.8 9.7-2.2 11.1-6.7 1.9-6.3 2.3-12.9 2.4-19.4-.2-7.1-1.5-15-6.7-20.1-12.2-4.4-15.3 10.9-16.5 18zM434 266.8V328l-4.4 6.7v-42.3c-4.6 7.5-9.1 9.1-6.1-.9 6.1-7.1 4.8-17.4 10.5-24.7zM83.85 279c.8 3.6 5.12 17.8 2.04 14.8-1.97-1.3-3.62-4.9-3.41-6.1-1.55-3-2.96-6.1-4.21-9.2-2.95 4-3.96 8.3-3.14 13.4.2-1.6 1.18-2.3 3.39-.7 7.84 12.6 12.17 29.1 7.29 43.5l-2.22 1.1c-10.36-5.8-11.4-19.4-13.43-30-1.55-12.3-.79-24.7 2.3-36.7 5.2-3.8 9.16 5.4 11.39 9.9zm-7.05 20.2c-4.06 4.7-2.26 12.8-.38 18.4 1.11 5.5 6.92 10.2 6.06 1.6.69-11.1-2.33-12.7-5.68-20zm66.4 69.4L256 491.7l112.8-123.1zm-21.4.3l-53.84 4.9 64.24 41.1c-2.6-2.7-4.9-5.7-7.1-8.8-5.2-6.9-10.5-13.6-18.9-16.6-8.75-6.5-4.2-5.3 2.9-2.6-1-1.8-.7-2.6.1-2.6 2.2-.2 8.4 4.2 9.8 6.3l24.7 31.6 65.1 41.7zm268.4 0l-42.4 46.3c6.4-3.1 11.3-8.5 17-12.4 2.4-1.4 3.7-1.9 4.3-1.9 2.1 0-5.4 7.1-7.7 10.3-9.4 9.8-16 23-28.6 29.1l18.9-24.5c-2.3 1.3-6 3.2-8.2 4.1l-40.3 44 74.5-47.6c5.4-6.7 1.9-5.6-5.7-.9l-11.4 6c11.4-13.7 30.8-28.3 40-35.6 9.2-7.3 15.9-9.8 8.2-1.5l-12.6 16c10-7.6.9 3.9-4.5 5.5-.7 1-1.4 2-2.2 2.9l54.5-34.9zM236 385.8v43.4h-13.4v-30c-5-1.4-10.4 1.7-15.3-.3-3.8-2.9 1-6.8 4.5-5.9 3.3-.1 7.6.2 9.3-3.2 4.4-4.5 9.6-4.4 14.9-4zm29 .5c12.1 1.2 24.2.6 36.6.6 1.5 3 .8 7.8-3.3 7.9-7.7.3-21-1.6-25.9.6-8.2 10.5 5.7 3.8 11.4 5.2 7 1.1 15 2.9 19.1 9.2 2.1 3.1 2.7 7.3.7 10.7-5.8 6.8-17 11.5-25.3 10.9-7.3-.6-15.6-1.1-20.6-7.1-6.4-10.6 10.5-6.7 12.2-3.2 6 5.3 20.3 1.9 20.7-4.7.6-4.2-2.1-6.3-6.9-7.8-4.8-1.5-12.6 1-17.3 1.8-4.7.8-9.6.5-9-4.4.8-4.2 2.7-8.1 2.7-12.5.1-3 1.7-7 4.9-7.2zm133.5 5c-.2-.2-7 5.8-9.9 8.1l-15.8 13.1c10.6-6.5 19.3-12 25.7-21.2zm-247 14.2c2.4 0 7.5 4.6 9.4 7l26.1 31.1c-7.7-2.1-13.3-7.1-17.6-13.7-6.5-7.3-11.3-16.6-21.2-19.6-9-5-5.2-6.4 2.1-2.2-.3-1.9.2-2.6 1.2-2.6z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -1 +0,0 @@
<svg style="height: 512px; width: 512px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 0h512v512H0z" fill="#000" fill-opacity="1"></path><g class="" style="" transform="translate(0,0)"><path d="M255.703 44.764c-6.176 0-12.353 1.384-17.137 4.152l-152.752 88.36c-9.57 5.535-9.57 14.29 0 19.826l152.752 88.359c9.57 5.536 24.703 5.536 34.272 0l152.754-88.36c9.57-5.534 9.57-14.289 0-19.824L272.838 48.916c-4.785-2.77-10.96-4.152-17.135-4.152zm-23.39 39.847l23.8 14.875-46.263 27.76 19.427 12.14a38.645 38.645 0 0 1 4.75-4.702c1.743-1.527 3.752-2.974 6.03-4.34 12.953-7.772 26.878-11.423 41.771-10.95 14.838.439 29.095 4.933 42.776 13.483 13.568 8.48 20.256 17.485 20.06 27.012-.148 9.498-7.198 18.43-21.148 26.8-6.026 3.616-12.705 6.767-20.037 9.45-7.23 2.689-15.166 4.908-23.805 6.658l-25.483-15.928c9.714-1.02 18.138-2.469 25.272-4.346 7.182-1.905 13.075-4.238 17.678-7 6.643-3.985 9.956-8.308 9.94-12.968-.026-4.724-3.318-9.137-9.878-13.237-6.616-4.135-13.752-6.24-21.408-6.316-7.609-.105-14.734 1.834-21.377 5.82-3.938 2.363-7.521 5.268-10.748 8.715-3.283 3.412-6.225 7.444-8.826 12.096l-70.645-44.153 68.113-40.869zm203.554 89.203c-1.938.074-4.218.858-6.955 2.413l-146.935 84.847c-9.57 5.527-17.14 18.638-17.14 29.69v157.699c0 11.05 7.57 15.419 17.14 9.89l146.937-84.843c9.57-5.527 17.137-18.636 17.137-29.688v-157.7c-2.497-8.048-5.23-12.495-10.184-12.308zm-359.763.48c-6.227 0-10.033 5.325-10.155 11.825v157.697c0 11.052 7.57 24.163 17.14 29.69l146.93 84.848c9.57 5.526 17.141 1.156 17.141-9.895v-157.7c0-11.051-7.57-24.159-17.14-29.687L83.09 176.225c-2.567-1.338-4.911-1.93-6.986-1.93zM393.4 233.587v24.264c-4.264-.079-8.281.397-12.052 1.43-3.771.973-7.454 2.538-11.045 4.693-7.722 4.633-13.737 11.055-18.047 19.267-4.31 8.154-6.825 17.955-7.543 29.405 2.963-4.65 6.174-8.715 9.63-12.196 3.458-3.54 7.228-6.535 11.313-8.986 10.28-6.168 18.565-7.211 24.85-3.129 6.33 4.055 9.494 12.442 9.494 25.16 0 14.066-3.524 27.462-10.572 40.19-7.049 12.668-16.498 22.558-28.35 29.67-13.064 7.838-23.188 8.17-30.371.992-7.138-7.263-10.707-21.474-10.707-42.631 0-21.685 4.175-41.216 12.525-58.592 8.395-17.462 19.889-30.57 34.479-39.324 4.624-2.775 9.112-5 13.467-6.676 4.354-1.675 8.665-2.854 12.93-3.537zm-242.789 13.582l27.635 16.58v85.809L192 357.809v25.414l-13.754-8.252v24.777l-23.502-14.102V360.87L112 335.223v-30.06l38.611-57.995zm4.133 31.355l-27.248 40.582 27.248 16.35v-56.932zm212.596 35.182c-1.706.057-3.703.773-5.992 2.147-4.535 2.72-7.947 6.701-10.237 11.943-2.244 5.156-3.367 11.572-3.367 19.25 0 7.678 1.123 12.777 3.367 15.299 2.29 2.436 5.702 2.295 10.237-.426 4.579-2.748 7.99-6.701 10.234-11.857 2.29-5.242 3.436-11.702 3.436-19.38 0-7.677-1.146-12.733-3.436-15.17-1.122-1.26-2.536-1.862-4.242-1.806z" fill="#fff" fill-opacity="1"></path></g></svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 MiB

View File

@ -1,259 +0,0 @@
.midgard5 .flexrow {
align-items: center;
}
.midgard5 h3 {
margin-top: 1rem;
}
.midgard5 .sheet.character form {
display: flex;
flex-direction: column;
}
.midgard5 .sheet.character .sheet-content {
height: 100%;
display: flex;
flex-direction: column;
}
.midgard5 .sheet.character .sheet-content .editor {
height: 100%;
}
.midgard5 .sheet.character .profile-img {
height: 64px;
width: 64px;
}
.midgard5 .sheet.character .description {
flex: 0 0 100%;
margin: 0;
}
.midgard5 .level-display {
text-align: right;
font-weight: bold;
}
.midgard5 td,
.midgard5 th {
padding: 0 0.5rem 0 0.5rem;
}
.midgard5 td.center,
.midgard5 th.center {
text-align: center;
}
.midgard5 td.fixed-value,
.midgard5 th.fixed-value {
width: 3rem;
text-align: center;
}
.midgard5 input.skill {
width: 5rem;
}
.midgard5 input.fixed {
width: 5rem;
}
.midgard5 .new-skill {
font-style: italic;
background: rgba(0, 0, 0, 0.3);
color: rgba(255, 255, 255);
}
.midgard5 .new-skill button {
background: rgba(255, 255, 255, 0.5);
}
.midgard5 button.roll-button {
background: url(/icons/svg/d20-black.svg) no-repeat;
background-size: 24px 24px;
width: 26px;
height: 26px;
}
.midgard5 span.spell-process {
color: #5d5d5d;
font-style: italic;
}
.midgard5 .filler {
flex: 1 1 auto;
}
.midgard5 .health-bar {
height: 2rem;
background-color: rgba(0, 0, 0, 0.8);
display: flex;
flex-direction: row;
gap: 1px;
padding: 1px;
}
.midgard5 .health-bar input {
flex: 0 0 3rem;
text-align: center;
height: 100%;
background-color: #6d6c66;
color: #ffffff;
font-weight: bold;
border-radius: 0;
}
.midgard5 .health-bar .lp-bar-item-empty,
.midgard5 .health-bar .ap-bar-item-empty {
flex-grow: 1;
background-color: #c9c9c9;
}
.midgard5 .health-bar .lp-bar-item {
flex-grow: 1;
background-color: #39ea8b;
}
.midgard5 .health-bar .ap-bar-item {
flex-grow: 1;
background-color: #39a3ea;
}
.midgard5 .health-bar .negative-bar-item {
flex-grow: 1;
background-color: #ea3939;
}
.midgard5 .attributes {
display: flex;
flex-direction: row;
margin-bottom: 0.5rem;
}
.midgard5 .attributes .attribute {
flex: 0 0 7rem;
margin: 0;
border: 1px solid rgba(0, 0, 0, 0.5);
border-radius: 10;
display: flex;
flex-direction: column;
}
.midgard5 .attributes .attribute .attribute-header {
display: flex;
align-items: center;
text-align: center;
justify-content: center;
font-weight: bold;
background-color: rgba(0, 0, 0, 0.5);
color: #ffffff;
height: 2.5rem;
}
.midgard5 .attributes .attribute .attribute-main {
padding: 0.2rem;
}
.midgard5 .attributes .attribute .attribute-main .attribute-main-value {
text-align: center;
vertical-align: middle;
font-size: 2rem;
}
.midgard5 .attributes .attribute .attribute-main .attribute-main-bonus {
text-align: center;
vertical-align: middle;
font-size: 1rem;
}
.midgard5 .attributes .attribute .attribute-footer {
display: flex;
flex-direction: row;
gap: 0.3rem;
padding: 0.3rem;
background-color: rgba(0, 0, 0, 0.5);
}
.midgard5 .attributes .attribute .attribute-footer input {
flex-grow: 1;
text-align: center;
background-color: rgba(255, 255, 255, 0.8);
}
.midgard5.sheet.item form {
display: flex;
flex-direction: column;
}
.midgard5.sheet.item .sheet-content {
height: 100%;
display: flex;
flex-direction: column;
}
.midgard5.sheet.item .sheet-content .editor {
height: 100%;
}
.midgard5.sheet.item .item-img {
height: 64px;
width: 64px;
}
.midgard5.sheet.item td,
.midgard5.sheet.item th {
padding: 0 0.5rem 0 0.5rem;
}
.midgard5.sheet.item td.center,
.midgard5.sheet.item th.center {
text-align: center;
}
.midgard5.sheet.item td.fixed-value,
.midgard5.sheet.item th.fixed-value {
width: 3rem;
text-align: center;
}
.midgard5.sheet.item table.rolls-table .col-enabled {
width: 3rem;
text-align: center;
}
.midgard5.sheet.item table.rolls-table .col-create {
width: 3rem;
text-align: center;
}
.midgard5.sheet.item table.rolls-table .col-create button {
background: rgba(255, 255, 255, 0.5);
}
.midgard5.sheet.item table.rolls-table .col-delete {
width: 3rem;
text-align: center;
}
.midgard5.sheet.item table.rolls-table .col-label {
width: 6rem;
}
.m5-roll .roll-title {
text-align: center;
vertical-align: middle;
padding: 0.3rem 0 0.1rem 0;
font-weight: bold;
font-size: 1.3rem;
}
.m5-roll .roll-spell-details {
text-align: right;
padding-right: 1rem;
font-weight: bold;
}
.m5-roll .roll-result {
text-align: right;
padding-right: 1rem;
font-weight: bold;
display: flex;
flex-direction: row;
}
.m5-roll .roll-result .roll-total {
width: 100%;
}
.m5-roll .roll-result .roll-detail {
width: 100%;
margin-left: -100%;
}
.m5-roll .roll-row:not( :hover ) .roll-total {
visibility: visible;
}
.m5-roll .roll-row:not( :hover ) .roll-detail {
visibility: hidden;
}
.m5-roll .roll-row:hover .roll-total {
visibility: hidden;
}
.m5-roll .roll-row:hover .roll-detail {
visibility: visible;
}
.m5-roll .roll-ew-result-fumble {
background-color: #ca3636;
color: #ffffff;
}
.m5-roll .roll-ew-result-critical {
background-color: #cac536;
color: #000000;
}
.m5-roll .roll-ew-result-high {
background-color: #368aca;
color: #ffffff;
}
.m5-roll .roll-ew-result-fail {
background-color: #753f83;
color: #ffffff;
}
.m5-roll .roll-ew-result-pass {
background-color: #36ca58;
color: #000000;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,232 +0,0 @@
{
"ACTOR.TypeCharacter": "Charakter",
"ACTOR.TypeNpc": "Kreatur / Nichtspielerfigur",
"ACTOR.TypeVehicle": "Transportmittel / Pferd etc.",
"ITEM.TypeItem": "Gegenstand",
"ITEM.TypeWeapon": "Waffe",
"ITEM.TypeDefensiveWeapon": "Verteidigungswaffe",
"ITEM.TypeArmor": "Rüstung",
"ITEM.TypeSpell": "Zauber",
"midgard5.doRoll": "Würfeln",
"midgard5.learn": "Lernen",
"midgard5.label": "Bezeichnung",
"midgard5.description": "Beschreibung",
"midgard5.attribute": "Leiteigenschaft",
"midgard5.skill": "Fertigkeit",
"midgard5.skill-value": "Fertigkeitswert",
"midgard5.fw": "FW",
"midgard5.bonus": "Bonus",
"midgard5.ew": "EW",
"midgard5.pp-short": "PP",
"midgard5.pp": "Praxispunkte",
"midgard5.item-value": "Wert",
"midgard5.item-quantity": "Menge",
"midgard5.item-onbody": "Am Körper",
"midgard5.item-ismagic": "Ist Magisch",
"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.aktuell": "Akt.",
"midgard5.maximum": "Max.",
"midgard5.attrvalue": "Wert",
"midgard5.movementRange": "Bewegungsweite",
"midgard5.base_values": "Grundwerte",
"midgard5.skills": "Fertigkeiten",
"midgard5.gear": "Ausrüstung",
"midgard5.spells": "Zauber",
"midgard5.class": "Klasse",
"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",
"midgard5.exp-overall": "Erfahrungsschatz",
"midgard5.exp-available": "Erfahrungspunkte",
"midgard5.grace": "Göttliche Gnade",
"midgard5.destiny": "Schicksalsgunst",
"midgard5.luckPoints": "Glückspunkte",
"midgard5.akrobatik": "Akrobatik",
"midgard5.alchimie": "Alchimie",
"midgard5.anfuehren": "Anführen",
"midgard5.athletik": "Athletik",
"midgard5.balancieren": "Balancieren",
"midgard5.beidhaendigerKampf": "Beidhändiger Kampf",
"midgard5.beredsamkeit": "Beredsamkeit",
"midgard5.betaeuben": "Betäuben",
"midgard5.bootfahren": "Bootfahren",
"midgard5.ersteHilfe": "Erste Hilfe",
"midgard5.etikette": "Etikette",
"midgard5.fallenEntdecken": "Fallen entdecken",
"midgard5.fallenmechanik": "Fallenmechanik",
"midgard5.faelschen": "Fälschen",
"midgard5.fechten": "Fechten",
"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.klettern": "Klettern",
"midgard5.landeskunde": "Landeskunde",
"midgard5.laufen": "Laufen",
"midgard5.lesenVonZauberschrift": "Lesen von Zauberschrift",
"midgard5.meditieren": "Meditieren",
"midgard5.menschenkenntnis": "Menschenkenntnis",
"midgard5.meucheln": "Meucheln",
"midgard5.musizieren": "Musizieren",
"midgard5.naturkunde": "Naturkunde",
"midgard5.pflanzenkunde": "Pflanzenkunde",
"midgard5.reiten": "Reiten",
"midgard5.reiterkampf": "Reiterkampf",
"midgard5.scharfschiessen": "Scharfschießen",
"midgard5.schleichen": "Schleichen",
"midgard5.schloesserOeffnen": "Schlösser öffnen",
"midgard5.schwimmen": "Schwimmen",
"midgard5.seilkunst": "Seilkunst",
"midgard5.spurensuche": "Spurensuche",
"midgard5.stehlen": "Stehlen",
"midgard5.tarnen": "Tarnen",
"midgard5.tauchen": "Tauchen",
"midgard5.tierkunde": "Tierkunde",
"midgard5.ueberleben": "Überleben",
"midgard5.verfuehren": "Verführen",
"midgard5.verhoeren": "Verhören",
"midgard5.verstellen": "Verstellen",
"midgard5.wagenlenken": "Wagenlenken",
"midgard5.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": "Giftresistenz",
"midgard5.enduranceBonus": "Ausdauerbonus",
"midgard5.new-skill": "Neue Fertigkeit",
"midgard5.special": "Spezial",
"midgard5.learned-skill": "Gelernte Fertigkeit",
"midgard5.language": "Sprache",
"midgard5.weapon-skill": "Waffenfertigkeit",
"midgard5.unlearned-skill": "Ungelernte Fertigkeit",
"midgard5.innate-ability": "Angeborene Fähigkeit",
"midgard5.base-damage": "Grundschaden",
"midgard5.defensive-weapon": "Verteidigungswaffe",
"midgard5.no-skill": "Keine Fertigkeit",
"midgard5.magic": "magisch",
"midgard5.rangedWeapon": "Schusswaffe",
"midgard5.assignItemToCharacter": "Füge Gegenstand einem Charakter hinzu, um Fähigkeit auwählen zu können",
"midgard5.pw": "Prüfwurf",
"midgard5.attack": "Angriff",
"midgard5.damage": "Schaden",
"midgard5.spell-process-none": "Ohne",
"midgard5.spell-process-beherrschen": "Beherrschen",
"midgard5.spell-process-bewegen": "Bewegen",
"midgard5.spell-process-erkennen": "Erkennen",
"midgard5.spell-process-erschaffen": "Erschaffen",
"midgard5.spell-process-formen": "Formen",
"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-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-type-gedanke": "Gedanke",
"midgard5.spell-type-geste": "Geste",
"midgard5.spell-type-wort": "Wort",
"midgard5.spell-target-umgebung": "Umgebung",
"midgard5.spell-target-geist": "Geist",
"midgard5.spell-target-koerper": "Körper",
"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.mod-operation-add100": "Addieren (max 100)",
"midgard5.mod-operation-add": "Addieren",
"midgard5.mod-operation-set": "Basiswert",
"midgard5.mod-operation-fixed": "Fester Wert",
"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": "Giftresistenz",
"midgard5.mod-stat-lp": "Lebenspunkte",
"midgard5.mod-stat-ap": "Ausdauerpunkte",
"midgard5.mod-type": "Typ der Modifikation",
"midgard5.mod-id": "Was soll modifiziert werden",
"midgard5.mod-operation": "Wie soll modifiziert werden",
"midgard5.mod-value": "Wert",
"midgard5.type": "Typ",
"midgard5.formula": "Formel",
"midgard5.roll": "Wurf"
}

View File

@ -1 +0,0 @@
{"name":"Grad 01","type":"character","img":"icons/svg/mystery-man.svg","system":{"lp":{"value":15,"min":0,"max":15},"ap":{"value":20,"min":0,"max":20},"attributes":{"st":{"value":50,"bonus":0},"gs":{"value":50,"bonus":0},"gw":{"value":50,"bonus":0},"ko":{"value":50,"bonus":0},"in":{"value":50,"bonus":0},"zt":{"value":50,"bonus":0},"au":{"value":50,"bonus":0},"pa":{"value":50,"bonus":0},"wk":{"value":50,"bonus":0}},"info":{"description":"","class":"","race":"","magicUsing":false,"gender":"","weight":"","height":"","shape":"","age":"","caste":"","occupation":"","origin":"","faith":""},"es":0,"ep":0,"gg":0,"sg":0,"gp":2,"skills":{"general":{"akrobatik":{"fw":6,"attribute":"gw","initial":8,"pp":0},"alchimie":{"fw":0,"attribute":"in","initial":8,"pp":0},"anfuehren":{"fw":6,"attribute":"pa","initial":8,"pp":0},"athletik":{"fw":0,"attribute":"st","initial":8,"pp":0},"balancieren":{"fw":6,"attribute":"gw","initial":8,"pp":0},"beidhaendigerKampf":{"fw":0,"attribute":"gs","initial":8,"pp":0},"beredsamkeit":{"fw":3,"attribute":"pa","initial":8,"pp":0},"betaeuben":{"fw":6,"attribute":"gs","initial":8,"pp":0},"bootfahren":{"fw":3,"attribute":"gs","initial":8,"pp":0},"ersteHilfe":{"fw":0,"attribute":"gs","initial":8,"pp":0},"etikette":{"fw":0,"attribute":"in","initial":8,"pp":0},"fallenEntdecken":{"fw":0,"attribute":"in","initial":8,"pp":0},"fallenmechanik":{"fw":0,"attribute":"gs","initial":8,"pp":0},"faelschen":{"fw":0,"attribute":"gs","initial":8,"pp":0},"fechten":{"fw":0,"attribute":"gs","initial":8,"pp":0},"gassenwissen":{"fw":0,"attribute":"in","initial":8,"pp":0},"gaukeln":{"fw":0,"attribute":"gs","initial":8,"pp":0},"gelaendelauf":{"fw":6,"attribute":"gw","initial":8,"pp":0},"geraetekunde":{"fw":0,"attribute":"in","initial":8,"pp":0},"geschaeftssinn":{"fw":0,"attribute":"in","initial":8,"pp":0},"gluecksspiel":{"fw":0,"attribute":"gs","initial":8,"pp":0},"heilkunde":{"fw":0,"attribute":"in","initial":8,"pp":0},"kampfInVollruestung":{"fw":0,"attribute":"st","initial":8,"pp":0},"klettern":{"fw":6,"attribute":"st","initial":8,"pp":0},"landeskunde":{"fw":6,"attribute":"in","initial":8,"pp":0},"laufen":{"fw":0,"attribute":"ko","initial":8,"pp":0},"lesenVonZauberschrift":{"fw":0,"attribute":"in","initial":8,"pp":0},"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":8,"pp":0},"naturkunde":{"fw":0,"attribute":"in","initial":8,"pp":0},"pflanzenkunde":{"fw":0,"attribute":"in","initial":8,"pp":0},"reiten":{"fw":6,"attribute":"gw","initial":8,"pp":0},"reiterkampf":{"fw":0,"attribute":"gw","initial":8,"pp":0},"scharfschiessen":{"fw":0,"attribute":"gs","initial":8,"pp":0},"schleichen":{"fw":3,"attribute":"gw","initial":8,"pp":0},"schloesserOeffnen":{"fw":0,"attribute":"gs","initial":8,"pp":0},"schwimmen":{"fw":3,"attribute":"gw","initial":8,"pp":0},"seilkunst":{"fw":3,"attribute":"gs","initial":8,"pp":0},"spurensuche":{"fw":0,"attribute":"in","initial":8,"pp":0},"stehlen":{"fw":3,"attribute":"gs","initial":8,"pp":0},"tarnen":{"fw":3,"attribute":"gw","initial":8,"pp":0},"tauchen":{"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},"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},"wagenlenken":{"fw":3,"attribute":"gs","initial":8,"pp":0},"zauberkunde":{"fw":0,"attribute":"in","initial":8,"pp":0}}},"calc":{}},"prototypeToken":{"name":"Spielfigur","displayName":0,"actorLink":false,"texture":{"src":"icons/svg/mystery-man.svg","scaleX":1,"scaleY":1,"offsetX":0,"offsetY":0,"rotation":0,"tint":null},"width":1,"height":1,"lockRotation":false,"rotation":0,"alpha":1,"disposition":-1,"displayBars":0,"bar1":{"attribute":"lp"},"bar2":{"attribute":"ap"},"light":{"alpha":0.5,"angle":360,"bright":0,"color":null,"coloration":1,"dim":0,"attenuation":0.5,"luminosity":0.5,"saturation":0,"contrast":0,"shadows":0,"animation":{"type":null,"speed":5,"intensity":5,"reverse":false},"darkness":{"min":0,"max":1}},"sight":{"enabled":false,"range":null,"angle":360,"visionMode":"basic","color":null,"attenuation":0.1,"brightness":0,"saturation":0,"contrast":0},"detectionModes":[],"flags":{},"randomImg":false},"items":[],"effects":[],"flags":{"core":{"sourceId":"Actor.25UihsoT43jms4Rx"}},"_stats":{"systemId":"midgard5e","systemVersion":"1.1.0","coreVersion":"10.291","createdTime":1681861642287,"modifiedTime":1681862257893,"lastModifiedBy":"Fphp3NQlJ6KWctyq"},"folder":null,"sort":0,"ownership":{"default":0,"Fphp3NQlJ6KWctyq":3},"_id":"k21WA0JziDJ7yJ1U"}

View File

@ -1,10 +0,0 @@
{"name":"Fernkampfwaffe","type":"weapon","img":"icons/svg/item-bag.svg","data":{"description":"","stats":{"damageBonus":0,"attackBonus":0,"defenseBonus":0,"movementBonus":0,"resistanceMind":0,"resistanceBody":0,"spellBonus":0},"equippable":false,"equipped":true,"value":0,"magic":false,"special":false,"ranged":true,"skillId":"","damageBase":"1d6","rolls":{"formulas":{"0":{"formula":"1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.attackBonus.value + @i.stats.attackBonus","label":"Angriff","enabled":true},"1":{"formula":"@i.damageBase + @i.stats.damageBonus","label":"Schaden","enabled":true}},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"h1inVuRJQI42JTCs"}
{"name":"Gewöhnliche Fertigkeit","type":"skill","img":"icons/svg/item-bag.svg","data":{"description":"","attributes":{"st":{"short":"midgard5.actor-st","long":"midgard5.actor-st-long"},"gs":{"short":"midgard5.actor-gs","long":"midgard5.actor-gs-long"},"gw":{"short":"midgard5.actor-gw","long":"midgard5.actor-gw-long"},"ko":{"short":"midgard5.actor-ko","long":"midgard5.actor-ko-long"},"in":{"short":"midgard5.actor-in","long":"midgard5.actor-in-long"},"zt":{"short":"midgard5.actor-zt","long":"midgard5.actor-zt-long"},"au":{"short":"midgard5.actor-au","long":"midgard5.actor-au-long"},"pa":{"short":"midgard5.actor-pa","long":"midgard5.actor-pa-long"},"wk":{"short":"midgard5.actor-wk","long":"midgard5.actor-wk-long"}},"fw":8,"attribute":"st","skill":"","type":"general","rolls":{"formulas":{"0":{"formula":"1d20 + @i.fw + @i.calc.bonus","enabled":true,"label":"EW"}},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"4N0IgVDj1eee0hSB"}
{"name":"Angeborene Fähigkeit","type":"skill","img":"icons/svg/item-bag.svg","data":{"description":"","attributes":{"st":{"short":"midgard5.actor-st","long":"midgard5.actor-st-long"},"gs":{"short":"midgard5.actor-gs","long":"midgard5.actor-gs-long"},"gw":{"short":"midgard5.actor-gw","long":"midgard5.actor-gw-long"},"ko":{"short":"midgard5.actor-ko","long":"midgard5.actor-ko-long"},"in":{"short":"midgard5.actor-in","long":"midgard5.actor-in-long"},"zt":{"short":"midgard5.actor-zt","long":"midgard5.actor-zt-long"},"au":{"short":"midgard5.actor-au","long":"midgard5.actor-au-long"},"pa":{"short":"midgard5.actor-pa","long":"midgard5.actor-pa-long"},"wk":{"short":"midgard5.actor-wk","long":"midgard5.actor-wk-long"}},"fw":6,"attribute":"","skill":"","type":"innate","rolls":{"formulas":{"0":{"formula":"1d20 + @i.fw + @i.calc.bonus","type":"ew","label":"EW"}},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"nkMkMFNDSdvlP1Jt"}
{"name":"Gegenstand","type":"item","img":"icons/svg/item-bag.svg","system":{"description":"","equippable":false,"equipped":true,"value":0,"magic":false,"rolls":{"formulas":{},"output":""},"mods":{},"calc":{}},"effects":[],"flags":{"core":{"sourceId":"Item.8GrWgO1jjysZPnxc"}},"_stats":{"systemId":"midgard5e","systemVersion":"1.1.0","coreVersion":"10.291","createdTime":1681862229001,"modifiedTime":1681862253981,"lastModifiedBy":"Fphp3NQlJ6KWctyq"},"folder":null,"sort":0,"ownership":{"default":0,"Fphp3NQlJ6KWctyq":3},"_id":"ERcxMh7hWiv42rfx"}
{"name":"Rüstung","type":"armor","img":"icons/svg/item-bag.svg","data":{"description":"","stats":{"damageBonus":0,"attackBonus":0,"defenseBonus":0,"movementBonus":0,"resistanceMind":0,"resistanceBody":0,"spellBonus":0},"equippable":false,"equipped":true,"attributeMod":{"st":0,"gs":0,"gw":0,"ko":0,"in":0,"zt":0,"au":0,"pa":0,"wk":0},"magic":false,"lpProtection":0,"apProtection":0,"rolls":{"formulas":{},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"pV1hNavlQGJ9UaEf"}
{"name":"Sprache","type":"skill","img":"icons/svg/item-bag.svg","data":{"description":"","attributes":{"st":{"short":"midgard5.actor-st","long":"midgard5.actor-st-long"},"gs":{"short":"midgard5.actor-gs","long":"midgard5.actor-gs-long"},"gw":{"short":"midgard5.actor-gw","long":"midgard5.actor-gw-long"},"ko":{"short":"midgard5.actor-ko","long":"midgard5.actor-ko-long"},"in":{"short":"midgard5.actor-in","long":"midgard5.actor-in-long"},"zt":{"short":"midgard5.actor-zt","long":"midgard5.actor-zt-long"},"au":{"short":"midgard5.actor-au","long":"midgard5.actor-au-long"},"pa":{"short":"midgard5.actor-pa","long":"midgard5.actor-pa-long"},"wk":{"short":"midgard5.actor-wk","long":"midgard5.actor-wk-long"}},"fw":8,"attribute":"in","skill":"","type":"language","rolls":{"formulas":{"0":{"formula":"1d20 + @i.calc.fw + @i.calc.bonus","enabled":true,"label":"EW"}},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"rDN14z3lNJISWTdO"}
{"name":"Verteidigungswaffe","type":"defensiveWeapon","img":"icons/svg/item-bag.svg","data":{"description":"","stats":{"damageBonus":0,"attackBonus":0,"defenseBonus":0,"movementBonus":0,"resistanceMind":0,"resistanceBody":0,"spellBonus":0},"equippable":false,"equipped":true,"special":false,"magic":false,"skillId":"","rolls":{"formulas":{"0":{"formula":"1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.defense.value + @c.calc.stats.defenseBonus.value + @i.stats.defenseBonus","enabled":true,"label":"Abwehr"}},"output":""},"calc":{},"damageBase":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"BNAoHN0vHfcwNUTl"}
{"name":"Waffe","type":"weapon","img":"icons/svg/item-bag.svg","data":{"description":"","stats":{"damageBonus":0,"attackBonus":0,"defenseBonus":0,"movementBonus":0,"resistanceMind":0,"resistanceBody":0,"spellBonus":0},"equippable":false,"equipped":true,"special":false,"magic":false,"ranged":false,"skillId":"","damageBase":"1d6","rolls":{"formulas":{"0":{"formula":"1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.attackBonus.value + @i.stats.attackBonus","enabled":true,"label":"Angriff"},"1":{"formula":"@i.damageBase + @i.stats.damageBonus + @c.calc.stats.damageBonus.value","enabled":true,"label":"Schaden"}},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"uGQJ4VPhh135e79a"}
{"name":"Waffenfertigkeit","type":"skill","img":"icons/svg/item-bag.svg","data":{"description":"","attributes":{"st":{"short":"midgard5.actor-st","long":"midgard5.actor-st-long"},"gs":{"short":"midgard5.actor-gs","long":"midgard5.actor-gs-long"},"gw":{"short":"midgard5.actor-gw","long":"midgard5.actor-gw-long"},"ko":{"short":"midgard5.actor-ko","long":"midgard5.actor-ko-long"},"in":{"short":"midgard5.actor-in","long":"midgard5.actor-in-long"},"zt":{"short":"midgard5.actor-zt","long":"midgard5.actor-zt-long"},"au":{"short":"midgard5.actor-au","long":"midgard5.actor-au-long"},"pa":{"short":"midgard5.actor-pa","long":"midgard5.actor-pa-long"},"wk":{"short":"midgard5.actor-wk","long":"midgard5.actor-wk-long"}},"fw":5,"attribute":"","skill":"","type":"combat","rolls":{"formulas":{"0":{"formula":"1d20 + @i.calc.fw + @i.calc.bonus","enabled":true,"label":"EW"}},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"1E4XHTGZlned2ofY"}
{"name":"Zauber","type":"spell","img":"icons/svg/item-bag.svg","data":{"description":"","spellProcessSelection":{"none":"midgard5.spell-process-none","beherrschen":"midgard5.spell-process-beherrschen","bewegen":"midgard5.spell-process-bewegen","erkennen":"midgard5.spell-process-erkennen","erschaffen":"midgard5.spell-process-erschaffen","formen":"midgard5.spell-process-formen","veraendern":"midgard5.spell-process-veraendern","zerstoeren":"midgard5.spell-process-zerstoeren","wundertat":"midgard5.spell-process-wundertat","dweomer":"midgard5.spell-process-dweomer","zauberlied":"midgard5.spell-process-zauberlied","salz":"midgard5.spell-process-salz","thaumagraphie":"midgard5.spell-process-thaumagraphie","beschwoeren":"midgard5.spell-process-beschwoeren","nekromantie":"midgard5.spell-process-nekromantie","thaumatherapie":"midgard5.spell-process-thaumatherapie","zaubermittel":"midgard5.spell-process-zaubermittel","zauberschutz":"midgard5.spell-process-zauberschutz"},"spellTypeSelection":{"gedanke":"midgard5.spell-type-gedanke","geste":"midgard5.spell-type-geste","wort":"midgard5.spell-type-wort"},"spellTargetSelection":{"umgebung":"midgard5.spell-target-umgebung","geist":"midgard5.spell-target-geist","koerper":"midgard5.spell-target-koerper"},"bonus":0,"type":"gedanke","process":"none","ap":0,"castDuration":"","range":"","effectTarget":"umgebung","effectArea":"","effectDuration":"","origin":"","rolls":{"formulas":{"0":{"formula":"1d20 + @c.calc.stats.spellCasting.value + @i.bonus","enabled":true,"label":"Zaubern"}},"output":""},"calc":{}},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"XD0IpWT6bN4AJiYQ":3},"_id":"HQ469FvZkwKfzFfu"}

View File

@ -1,5 +0,0 @@
{"name":"Kritischer Erfolg bei der Abwehr","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"script","flags":{"core":{"sourceId":"Macro.P6jQGko7PdG6Xlhe"}},"scope":"global","command":"await game.tables.getName(\"Kritischer Erfolg bei der Abwehr\").draw()","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/assets/icons/macro/kriterfolgabwehr.svg","actorIds":[],"_id":"qWyrwvh7g9CbTKg9"}
{"name":"Kritischer Fehler bei Angriffen","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"script","flags":{"core":{"sourceId":"Macro.FZUermrYHSbrEluS"}},"scope":"global","command":"await game.tables.getName(\"Kritischer Fehler bei Angriffen\").draw()","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/assets/icons/macro/kritfehlerangriff.svg","actorIds":[],"_id":"798kmgnTkpfP89Z9"}
{"name":"Kritischer Fehler bei der Abwehr","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"script","flags":{"core":{"sourceId":"Macro.k1tLp8Q2NY9twiZ6"}},"scope":"global","command":"await game.tables.getName(\"Kritischer Fehler bei der Abwehr\").draw()","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/assets/icons/macro/kritfehlerabwehr.svg","actorIds":[],"_id":"W7rYb00B6rtabV05"}
{"name":"Kritischer Schaden","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"script","flags":{"core":{"sourceId":"Macro.QZlbT0tgD2aYW5YJ"}},"scope":"global","command":"await game.tables.getName(\"Kritischer Schaden\").draw()","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/assets/icons/macro/kriterfolgangriff.svg","actorIds":[],"_id":"48DUqxdpHDCGKOHp"}
{"name":"Kritische Fehler beim Zaubern","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"script","flags":{"core":{"sourceId":"Macro.e4KLlTBq8Z4Pt7In"}},"scope":"global","command":"await game.tables.getName(\"Kritischer Fehler beim Zaubern\").draw()","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/assets/icons/macro/kritfehlerzauber.svg","actorIds":[],"_id":"XtzGuyYRyX8wVi1e"}

View File

@ -1,4 +0,0 @@
{"name":"1W10","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"chat","flags":{"core":{"sourceId":"Macro.TqmUKpMpY4GhiTML"}},"scope":"global","command":"/r 1d10","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/assets/icons/wurfel/w10.svg","actorIds":[],"_id":"YWsPRUpZpgLBKIB3"}
{"name":"1W100","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"chat","flags":{"core":{"sourceId":"Macro.S01PfXnvLPeuKOH8"}},"scope":"global","command":"/r 1d100","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/assets/icons/wurfel/w100.svg","actorIds":[],"_id":"pXZIfqDIX9VKYonr"}
{"name":"1W20","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"chat","flags":{"core":{"sourceId":"Macro.mj9nIEgk0UDz8tbH"}},"scope":"global","command":"/r 1d20","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/assets/icons/wurfel/w20.svg","actorIds":[],"_id":"qBoxslCQXxR22xKc"}
{"name":"1W6","permission":{"default":2,"CBq5YXAqbO7HoJ03":3},"type":"chat","flags":{"core":{"sourceId":"Macro.QBhV6De80g1wH6ot"}},"scope":"global","command":"/r 1d6","author":"CBq5YXAqbO7HoJ03","img":"systems/midgard5e/assets/icons/wurfel/w6.svg","actorIds":[],"_id":"5tpfRgbM5sTL9gur"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,73 +0,0 @@
{
"id": "midgard5e",
"title": "Midgard 5. Edition",
"description": "The German RPG Midgard 5. Edition",
"version": "1.2.3",
"compatibility": {
"minimum": "10",
"verified": "10"
},
"authors": [{ "name": "Byroks" }],
"scripts": ["bundle.js"],
"styles": ["bundle.css"],
"packs": [
{
"name": "blaupause-spielfiguren",
"label": "Blaupausen für Spielfiguren",
"system": "midgard5e",
"path": "./packs/actors/blaupause-spielfiguren.db",
"type": "Actor"
},
{
"name": "blaupause-gegenstaende",
"label": "Blaupausen für Gegenstände",
"system": "midgard5e",
"path": "./packs/items/blaupause-gegenstaende.db",
"type": "Item"
},
{
"name": "tabellen-kritische-ereignisse",
"label": "Tabellen Kritische Ereignisse",
"system": "midgard5e",
"path": "./packs/rolltables/tabellen-kritische-ereignisse.db",
"type": "RollTable"
},
{
"name": "makros-kritische-ereignisse",
"label": "Makros Kritische Ereignisse",
"system": "midgard5e",
"path": "./packs/macros/makros-kritische-ereignisse.db",
"type": "Macro"
},
{
"name": "makros-standardwurfel",
"label": "Standardwürfel",
"system": "midgard5e",
"path": "./packs/macros/makros-standardwurfel.db",
"type": "Macro"
},
{
"name": "scenes-midgard-karten",
"label": "Midgard-Karten",
"system": "midgard5e",
"path": "./packs/scenes/scenes-midgard-karten.db",
"type": "Scene"
}
],
"languages": [
{
"lang": "de",
"name": "Deutsch",
"path": "lang/de.json"
}
],
"gridDistance": 1,
"gridUnits": "m",
"primaryTokenAttribute": "lp",
"secondaryTokenAttribute": "ap",
"url": "https://github.com/Byroks/foundry-vtt-system-midgard5",
"manifest": "https://github.com/Byroks/foundry-vtt-system-midgard5/releases/download/v1.2.2/system.json",
"download": "https://github.com/Byroks/foundry-vtt-system-midgard5/releases/download/v1.2.2/midgard5-v1.2.2.zip",
"initiative": "@calc.attributes.gw.value",
"license": "LICENSE.txt"
}

View File

@ -1,309 +0,0 @@
{
"Actor": {
"types": ["character"],
"templates": {
"characterDescription": {
"info": {
"description": "",
"class": "",
"race": "",
"magicUsing": false,
"gender": "",
"weight": "",
"height": "",
"shape": "",
"age": "",
"caste": "",
"occupation": "",
"origin": "",
"faith": ""
}
},
"characterBars": {
"lp": {
"value": 15,
"min": 0,
"max": 15
},
"ap": {
"value": 20,
"min": 0,
"max": 20
}
},
"characterHeader": {
"es": 0,
"ep": 0,
"gg": 0,
"sg": 0,
"gp": 2
},
"attributes": {
"attributes": {
"st": { "value": 50, "bonus": 0 },
"gs": { "value": 50, "bonus": 0 },
"gw": { "value": 50, "bonus": 0 },
"ko": { "value": 50, "bonus": 0 },
"in": { "value": 50, "bonus": 0 },
"zt": { "value": 50, "bonus": 0 },
"au": { "value": 50, "bonus": 0 },
"pa": { "value": 50, "bonus": 0 },
"wk": { "value": 50, "bonus": 0 }
}
},
"skills": {
"skills": {
"general": {
"akrobatik": { "fw": 6, "attribute": "gw", "initial": 8, "pp": 0 },
"alchimie": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"anfuehren": { "fw": 6, "attribute": "pa", "initial": 8, "pp": 0 },
"athletik": { "fw": 0, "attribute": "st", "initial": 8, "pp": 0 },
"balancieren": { "fw": 6, "attribute": "gw", "initial": 8, "pp": 0 },
"beidhaendigerKampf": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"beredsamkeit": { "fw": 3, "attribute": "pa", "initial": 8, "pp": 0 },
"betaeuben": { "fw": 6, "attribute": "gs", "initial": 8, "pp": 0 },
"bootfahren": { "fw": 3, "attribute": "gs", "initial": 8, "pp": 0 },
"ersteHilfe": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"etikette": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"fallenEntdecken": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"fallenmechanik": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"faelschen": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"fechten": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"gassenwissen": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"gaukeln": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"gelaendelauf": { "fw": 6, "attribute": "gw", "initial": 8, "pp": 0 },
"geraetekunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"geschaeftssinn": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"gluecksspiel": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"heilkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"kampfInVollruestung": { "fw": 0, "attribute": "st", "initial": 8, "pp": 0 },
"klettern": { "fw": 6, "attribute": "st", "initial": 8, "pp": 0 },
"landeskunde": { "fw": 6, "attribute": "in", "initial": 8, "pp": 0 },
"laufen": { "fw": 0, "attribute": "ko", "initial": 8, "pp": 0 },
"lesenVonZauberschrift": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"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": 8, "pp": 0 },
"naturkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"pflanzenkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"reiten": { "fw": 6, "attribute": "gw", "initial": 8, "pp": 0 },
"reiterkampf": { "fw": 0, "attribute": "gw", "initial": 8, "pp": 0 },
"scharfschiessen": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"schleichen": { "fw": 3, "attribute": "gw", "initial": 8, "pp": 0 },
"schloesserOeffnen": { "fw": 0, "attribute": "gs", "initial": 8, "pp": 0 },
"schwimmen": { "fw": 3, "attribute": "gw", "initial": 8, "pp": 0 },
"seilkunst": { "fw": 3, "attribute": "gs", "initial": 8, "pp": 0 },
"spurensuche": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 },
"stehlen": { "fw": 3, "attribute": "gs", "initial": 8, "pp": 0 },
"tarnen": { "fw": 3, "attribute": "gw", "initial": 8, "pp": 0 },
"tauchen": { "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 },
"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 },
"wagenlenken": { "fw": 3, "attribute": "gs", "initial": 8, "pp": 0 },
"zauberkunde": { "fw": 0, "attribute": "in", "initial": 8, "pp": 0 }
}
}
}
},
"character": {
"templates": ["characterBars", "attributes", "characterDescription", "characterHeader", "skills"],
"calc": {}
}
},
"Item": {
"types": ["skill", "weapon", "defensiveWeapon", "armor", "spell", "item"],
"templates": {
"itemDescription": {
"description": ""
},
"stats": {
"stats": {
"damageBonus": 0,
"attackBonus": 0,
"defenseBonus": 0,
"movementBonus": 0,
"resistanceMind": 0,
"resistanceBody": 0,
"spellBonus": 0
}
},
"attributeSelection": {
"attributes": {
"st": { "short": "midgard5.actor-st", "long": "midgard5.actor-st-long" },
"gs": { "short": "midgard5.actor-gs", "long": "midgard5.actor-gs-long" },
"gw": { "short": "midgard5.actor-gw", "long": "midgard5.actor-gw-long" },
"ko": { "short": "midgard5.actor-ko", "long": "midgard5.actor-ko-long" },
"in": { "short": "midgard5.actor-in", "long": "midgard5.actor-in-long" },
"zt": { "short": "midgard5.actor-zt", "long": "midgard5.actor-zt-long" },
"au": { "short": "midgard5.actor-au", "long": "midgard5.actor-au-long" },
"pa": { "short": "midgard5.actor-pa", "long": "midgard5.actor-pa-long" },
"wk": { "short": "midgard5.actor-wk", "long": "midgard5.actor-wk-long" }
}
},
"attributeMod": {
"attributeMod": {
"st": 0,
"gs": 0,
"gw": 0,
"ko": 0,
"in": 0,
"zt": 0,
"au": 0,
"pa": 0,
"wk": 0
}
},
"rollable": {
"rolls": {
"formulas": {},
"output": ""
}
},
"equippable": {
"equippable": false,
"equipped": true
},
"physical": {
"value": 0,
"magic": false
},
"spellSelection": {
"spellProcessSelection": {
"none": "midgard5.spell-process-none",
"beherrschen": "midgard5.spell-process-beherrschen",
"bewegen": "midgard5.spell-process-bewegen",
"erkennen": "midgard5.spell-process-erkennen",
"erschaffen": "midgard5.spell-process-erschaffen",
"formen": "midgard5.spell-process-formen",
"veraendern": "midgard5.spell-process-veraendern",
"zerstoeren": "midgard5.spell-process-zerstoeren",
"wundertat": "midgard5.spell-process-wundertat",
"dweomer": "midgard5.spell-process-dweomer",
"zauberlied": "midgard5.spell-process-zauberlied",
"salz": "midgard5.spell-process-salz",
"thaumagraphie": "midgard5.spell-process-thaumagraphie",
"beschwoeren": "midgard5.spell-process-beschwoeren",
"nekromantie": "midgard5.spell-process-nekromantie",
"thaumatherapie": "midgard5.spell-process-thaumatherapie",
"zaubermittel": "midgard5.spell-process-zaubermittel",
"zauberschutz": "midgard5.spell-process-zauberschutz"
},
"spellTypeSelection": {
"gedanke": "midgard5.spell-type-gedanke",
"geste": "midgard5.spell-type-geste",
"wort": "midgard5.spell-type-wort"
},
"spellTargetSelection": {
"umgebung": "midgard5.spell-target-umgebung",
"geist": "midgard5.spell-target-geist",
"koerper": "midgard5.spell-target-koerper"
}
}
},
"skill": {
"templates": ["itemDescription", "attributeSelection"],
"fw": 0,
"attribute": "st",
"skill": "",
"type": "general",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus",
"label": "EW",
"enabled": true
}
},
"output": ""
},
"pp": 0,
"calc": {}
},
"item": {
"templates": ["itemDescription", "equippable", "physical"],
"rolls": {
"formulas": {},
"output": ""
},
"mods": {},
"calc": {}
},
"weapon": {
"templates": ["itemDescription", "stats", "equippable", "physical"],
"special": false,
"ranged": false,
"skillId": "",
"damageBase": "1d6",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.attackBonus.value + @i.stats.attackBonus",
"label": "Angriff",
"enabled": true
},
"1": {
"formula": "@i.damageBase + @i.stats.damageBonus + @c.calc.stats.damageBonus.value",
"label": "Schaden",
"enabled": true
}
},
"output": ""
},
"calc": {}
},
"defensiveWeapon": {
"templates": ["itemDescription", "stats", "equippable", "physical"],
"special": false,
"skillId": "",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.defense.value + @c.calc.stats.defenseBonus.value + @i.stats.defenseBonus",
"label": "Abwehr",
"enabled": true
}
},
"output": ""
},
"calc": {}
},
"armor": {
"templates": ["itemDescription", "stats", "equippable", "attributeMod", "physical"],
"lpProtection": 0,
"apProtection": 0,
"rolls": {
"formulas": {},
"output": ""
},
"calc": {}
},
"spell": {
"templates": ["itemDescription", "spellSelection"],
"bonus": 0,
"type": "",
"process": "",
"ap": "",
"castDuration": "",
"range": "",
"effectTarget": "",
"effectArea": "",
"effectDuration": "",
"origin": "",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @c.calc.stats.spellCasting.value + @i.bonus",
"label": "Zaubern",
"enabled": true
}
},
"output": ""
},
"calc": {}
}
}
}

View File

@ -1,60 +0,0 @@
<div class="dice-roll m5-roll">
<div class="flexcol">
<h3 class="roll-title">{{res.label}}</h3>
<table>
<tbody>
{{#if (eq iType "spell")}}
<tr>
<td>{{localize "midgard5.actor-ap"}}</td>
<td class="roll-spell-details">{{i.ap}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-castDuration"}}</td>
<td class="roll-spell-details">{{i.castDuration}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-range"}}</td>
<td class="roll-spell-details">{{i.range}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-effectTarget"}}</td>
<td class="roll-spell-details">{{localize (m5concat "midgard5.spell-target-" i.effectTarget)}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-effectArea"}}</td>
<td class="roll-spell-details">{{i.effectArea}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-effectDuration"}}</td>
<td class="roll-spell-details">{{i.effectDuration}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-origin"}}</td>
<td class="roll-spell-details">{{i.origin}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-type"}}</td>
<td class="roll-spell-details">{{localize (m5concat "midgard5.spell-type-" i.type)}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spell-process"}}</td>
<td class="roll-spell-details">{{localize (m5concat "midgard5.spell-process-" i.process)}}</td>
</tr>
{{/if}}
{{#each rolls as |roll index|}}
{{#if roll.enabled}}
<tr class="roll-row {{roll.css}}">
<td>{{roll.label}}</td>
<td class="roll-result">
<span class="roll-total">{{roll.totalStr}}</span>
<span class="roll-detail">{{roll.result}}</span>
</td>
</tr>
{{/if}}
{{/each}}
</tbody>
</table>
</div>
</div>

View File

@ -1,13 +0,0 @@
<div class="attribute" data-attribute="{{attributeId}}" data-value="{{calc.value}}">
<div class="attribute-header">{{localize (m5concat "midgard5.actor-" attributeId "-long")}}</div>
<div class="attribute-main roll-attribute-button">
<div class="attribute-main-value">{{calc.value}}</div>
<div class="attribute-main-bonus">{{calc.bonus}}</div>
</div>
<div class="attribute-footer">
<input class="attribute-footer-value" name="data.attributes.{{attributeId}}.value" value="{{attribute.value}}" type="text" data-dtype="Number" />
<input class="attribute-footer-bonus" name="data.attributes.{{attributeId}}.bonus" value="{{attribute.bonus}}" type="text" data-dtype="Number" />
</div>
</div>

View File

@ -1,169 +0,0 @@
<h3>{{localize "midgard5.actor-lp"}}</h3>
<div>
<div class="health-bar">
<input name="data.lp.value" type="text" value="{{data.lp.value}}" data-dtype="Number" />
{{#times data.lp.max}}
{{#if (lt this ../data.lp.value)}}
<div class="lp-bar-item update-lp" data-value="{{this}}"></div>
{{else}}
<div class="lp-bar-item-empty update-lp" data-value="{{this}}"></div>
{{/if}}
{{/times}}
<input name="data.lp.max" type="text" value="{{data.lp.max}}" data-dtype="Number" />
</div>
</div>
<h3>{{localize "midgard5.actor-ap"}}</h3>
<div>
<div class="health-bar">
<input name="data.ap.value" type="text" value="{{data.ap.value}}" data-dtype="Number" />
{{#times data.ap.max}}
{{#if (lt this ../data.ap.value)}}
<div class="ap-bar-item update-ap" data-value="{{this}}"></div>
{{else}}
<div class="ap-bar-item-empty update-ap" data-value="{{this}}"></div>
{{/if}}
{{/times}}
<input name="data.ap.max" type="text" value="{{data.ap.max}}" data-dtype="Number" />
</div>
</div>
<h3>Eigenschaften</h3>
<div class="flexrow">
<span class="flex0">{{localize "midgard5.class"}}</span>
<input class="flex3" name="data.info.class" type="text" value="{{data.info.class}}" data-dtype="String" />
<input id="data.info.magicUsing" type="checkbox" name="data.info.magicUsing" {{checked data.info.magicUsing}}>
<label class="flex0" for="data.info.magicUsing">{{localize "midgard5.magicUsing"}}</label>
<span class="level-display">Grad {{data.calc.level}}</span>
</div>
<table>
<tbody>
<tr>
<td>{{localize "midgard5.grace"}}</td>
<td><input name="data.gg" type="text" value="{{data.gg}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.exp-overall"}}</td>
<td><input name="data.es" type="text" value="{{data.es}}" data-dtype="Number" /></td>
</tr>
<tr>
<td>{{localize "midgard5.destiny"}}</td>
<td><input name="data.sg" type="text" value="{{data.sg}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.exp-available"}}</td>
<td><input name="data.ep" type="text" value="{{data.ep}}" data-dtype="Number" /></td>
</tr>
<tr>
<td>{{localize "midgard5.luckPoints"}}</td>
<td><input name="data.gp" type="text" value="{{data.gp}}" data-dtype="Number" /></td>
</tr>
</tbody>
</table>
<h3>Leiteigenschaften</h3>
<div class="attributes">
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="st" attribute=data.attributes.st calc=data.calc.attributes.st}}
<div class="filler"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="gs" attribute=data.attributes.gs calc=data.calc.attributes.gs}}
<div class="filler"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="gw" attribute=data.attributes.gw calc=data.calc.attributes.gw}}
<div class="filler"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="ko" attribute=data.attributes.ko calc=data.calc.attributes.ko}}
<div class="filler"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="in" attribute=data.attributes.in calc=data.calc.attributes.in}}
</div>
<div class="attributes">
<div class="filler"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="zt" attribute=data.attributes.zt calc=data.calc.attributes.zt}}
<div class="attribute-filler-fixed"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="au" attribute=data.attributes.au calc=data.calc.attributes.au}}
<div class="attribute-filler-fixed"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="pa" attribute=data.attributes.pa calc=data.calc.attributes.pa}}
<div class="attribute-filler-fixed"></div>
{{> "systems/midgard5e/templates/sheets/character/attribute.hbs" attributeId="wk" attribute=data.attributes.wk calc=data.calc.attributes.wk}}
<div class="filler"></div>
</div>
<h3>Berechnete Werte</h3>
<table>
<tbody>
<tr>
<td>{{localize "midgard5.brawl"}}</td>
<td class="fixed-value">{{data.calc.stats.brawl.value}}</td>
<td>{{localize "midgard5.enduranceBonus"}}</td>
<td class="fixed-value">{{data.calc.stats.enduranceBonus}}</td>
</tr>
<tr>
<td>{{localize "midgard5.defense"}}</td>
<td class="fixed-value">{{data.calc.stats.defense.value}}</td>
<td>{{localize "midgard5.defenseBonus"}}</td>
<td class="fixed-value">{{data.calc.stats.defenseBonus.value}}</td>
</tr>
<tr>
<td>{{localize "midgard5.damageBonus"}}</td>
<td class="fixed-value">{{data.calc.stats.damageBonus.value}}</td>
<td>{{localize "midgard5.attackBonus"}}</td>
<td class="fixed-value">{{data.calc.stats.attackBonus.value}}</td>
</tr>
<tr>
<td>{{localize "midgard5.spellCasting"}}</td>
<td class="fixed-value">{{data.calc.stats.spellCasting.value}}</td>
<td>{{localize "midgard5.poisonResistance"}}</td>
<td class="fixed-value">{{data.calc.stats.poisonResistance.value}}</td>
</tr>
<tr>
<td>{{localize "midgard5.resistanceMind"}}</td>
<td class="fixed-value">{{data.calc.stats.resistanceMind.value}}</td>
<td>{{localize "midgard5.resistanceBody"}}</td>
<td class="fixed-value">{{data.calc.stats.resistanceBody.value}}</td>
</tr>
</tbody>
</table>
<h3>Beschreibung</h3>
<table>
<tbody>
<tr>
<td>{{localize "midgard5.race"}}</td>
<td>
<input list="races" type="search" name="data.info.race" value="{{data.info.race}}" />
<datalist id="races">
<option value="Mensch">
<option value="Elf">
<option value="Gnom">
<option value="Halbling">
<option value="Zwerg">
</datalist>
</td>
<td>{{localize "midgard5.gender"}}</td>
<td><input name="data.info.gender" type="text" value="{{data.info.gender}}" data-dtype="String" /></td>
</tr>
<tr>
<td>{{localize "midgard5.weight"}}</td>
<td><input name="data.info.weight" type="text" value="{{data.info.weight}}" data-dtype="String" /></td>
<td>{{localize "midgard5.height"}}</td>
<td><input name="data.info.height" type="text" value="{{data.info.height}}" data-dtype="String" /></td>
</tr>
<tr>
<td>{{localize "midgard5.shape"}}</td>
<td><input name="data.info.shape" type="text" value="{{data.info.shape}}" data-dtype="String" /></td>
<td>{{localize "midgard5.age"}}</td>
<td><input name="data.info.age" type="text" value="{{data.info.age}}" data-dtype="String" /></td>
</tr>
<tr>
<td>{{localize "midgard5.caste"}}</td>
<td><input name="data.info.caste" type="text" value="{{data.info.caste}}" data-dtype="String" /></td>
<td>{{localize "midgard5.occupation"}}</td>
<td><input name="data.info.occupation" type="text" value="{{data.info.occupation}}" data-dtype="String" /></td>
</tr>
<tr>
<td>{{localize "midgard5.origin"}}</td>
<td><input name="data.info.origin" type="text" value="{{data.info.origin}}" data-dtype="String" /></td>
<td>{{localize "midgard5.faith"}}</td>
<td><input name="data.info.faith" type="text" value="{{data.info.faith}}" data-dtype="String" /></td>
</tr>
</tbody>
</table>
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}

View File

@ -1,115 +0,0 @@
<table>
<thead>
<tr>
<th>{{localize "ITEM.TypeWeapon"}}</th>
<th class="fixed-value">{{localize "midgard5.ew"}}</th>
<th class="fixed-value"></th>
<th class="fixed-value"></th>
</tr>
</thead>
<tbody>
{{#each data.calc.gear.weapons as |item itemId|}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{item.label}}</td>
<td class="fixed-value">{{item.calc.ew}}</td>
<td class="fixed-value"><button class="roll-button roll-weapon-button"></button></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{localize "midgard5.brawl"}}</td>
<td class="center">{{data.calc.stats.brawlEw}}</td>
<td class="fixed-value"><button class="roll-button roll-brawl-button"></button></td>
<td class="fixed-value"></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>{{localize "ITEM.TypeDefensiveWeapon"}}</th>
<th class="fixed-value">{{localize "midgard5.ew"}}</th>
<th class="fixed-value"></th>
<th class="fixed-value"></th>
</tr>
</thead>
<tbody>
{{#each data.calc.gear.defensiveWeapons as |item itemId|}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{item.label}}</td>
<td class="fixed-value">{{item.calc.ew}}</td>
<td class="fixed-value"><button class="roll-button roll-weapon-button"></button></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{localize "midgard5.defense"}}</td>
<td class="center">{{add data.calc.stats.defense.value data.calc.stats.defenseBonus.value}}</td>
<td class="fixed-value"><button class="roll-button roll-defense-button"></button></td>
<td class="fixed-value"></td>
</tr>
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{localize "midgard5.resistanceMind"}}</td>
<td class="center">{{data.calc.stats.resistanceMind.value}}</td>
<td class="fixed-value"><button class="roll-button roll-resistanceMind-button"></button></td>
<td class="fixed-value"></td>
</tr>
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{localize "midgard5.resistanceBody"}}</td>
<td class="center">{{data.calc.stats.resistanceBody.value}}</td>
<td class="fixed-value"><button class="roll-button roll-resistanceBody-button"></button></td>
<td class="fixed-value"></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>{{localize "ITEM.TypeArmor"}}</th>
<th class="fixed-value">{{localize "midgard5.actor-lp-short"}}</th>
<th class="fixed-value">{{localize "midgard5.actor-ap-short"}}</th>
<th class="fixed-value">{{localize "midgard5.attackBonus-short"}}</th>
<th class="fixed-value">{{localize "midgard5.defenseBonus-short"}}</th>
<th class="fixed-value">B</th>
<th class="fixed-value">Gw</th>
<th class="fixed-value"></th>
</tr>
</thead>
<tbody>
{{#each data.calc.gear.armor as |item itemId|}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{item.label}}</td>
<td class="fixed-value">{{actorItemValue ../actor._id itemId "lpProtection"}}</td>
<td class="fixed-value">{{actorItemValue ../actor._id itemId "apProtection"}}</td>
<td class="fixed-value">{{actorItemValue ../actor._id itemId "stats.attackBonus"}}</td>
<td class="fixed-value">{{actorItemValue ../actor._id itemId "stats.defenseBonus"}}</td>
<td class="fixed-value">{{actorItemValue ../actor._id itemId "stats.movementBonus"}}</td>
<td class="fixed-value">{{actorItemValue ../actor._id itemId "attributeMod.gw"}}</td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>
<table>
<thead>
<tr>
<th>{{localize "ITEM.TypeItem"}}</th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.calc.gear.items as |item itemId|}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">{{item.label}}</td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>

View File

@ -1,34 +0,0 @@
<form class="actor-sheet {{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" />
<h1 class="charname"><input name="name" type="text" value="{{actor.name}}" placeholder="Name" /></h1>
</header>
{{!-- Character Sheet Navigation --}}
<nav class="sheet-navigation tabs" data-group="primary">
<a class="item active" data-tab="base_values">{{ localize "midgard5.base_values" }}</a>
<a class="item" data-tab="skills">{{ localize "midgard5.skills" }}</a>
<a class="item" data-tab="gear">{{ localize "midgard5.gear" }}</a>
<a class="item" data-tab="spells">{{ localize "midgard5.spells" }}</a>
</nav>
<section class="sheet-content">
<div class="tab base_values flexcol" data-group="primary" data-tab="base_values">
{{> "systems/midgard5e/templates/sheets/character/base_values.hbs"}}
</div>
<div class="tab base_values flexcol" data-group="primary" data-tab="skills">
{{> "systems/midgard5e/templates/sheets/character/skills.hbs"}}
</div>
<div class="tab base_values flexcol" data-group="primary" data-tab="gear">
{{> "systems/midgard5e/templates/sheets/character/gear.hbs"}}
</div>
<div class="tab base_values flexcol" data-group="primary" data-tab="spells">
{{> "systems/midgard5e/templates/sheets/character/spells.hbs"}}
</div>
</section>
</form>

View File

@ -1,136 +0,0 @@
<table>
<thead>
<tr>
<th>{{localize "midgard5.learned-skill"}}</th>
<th>{{localize "midgard5.fw"}}</th>
<th>{{localize "midgard5.bonus"}}</th>
<th>{{localize "midgard5.ew"}}</th>
<th>{{localize "midgard5.pp-short"}}</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.calc.skills.general as |skill skillId|}}
<tr data-item="{{skillId}}">
<td class="padding edit-item">{{skill.label}}</td>
<td class="fixed-value">{{skill.fw}}</td>
<td class="fixed-value">{{skill.calc.bonus}}</td>
<td class="fixed-value">{{skill.calc.ew}}</td>
<td class="fixed-value">{{skill.pp}}</td>
<td class="fixed-value"><button class="roll-button roll-learned-button"></button></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>
<table>
<thead>
<tr>
<th>{{localize "midgard5.language"}}</th>
<th>{{localize "midgard5.fw"}}</th>
<th>{{localize "midgard5.bonus"}}</th>
<th>{{localize "midgard5.ew"}}</th>
<th>{{localize "midgard5.pp-short"}}</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.calc.skills.language as |skill skillId|}}
<tr data-item="{{skillId}}">
<td class="padding edit-item">{{skill.label}}</td>
<td class="fixed-value">{{skill.fw}}</td>
<td class="fixed-value">{{skill.calc.bonus}}</td>
<td class="fixed-value">{{skill.calc.ew}}</td>
<td class="fixed-value">{{skill.pp}}</td>
<td class="fixed-value"><button class="roll-button roll-learned-button"></button></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>
<table>
<thead>
<tr>
<th>{{localize "midgard5.innate-ability"}}</th>
<th>{{localize "midgard5.fw"}}</th>
<th>{{localize "midgard5.bonus"}}</th>
<th>{{localize "midgard5.ew"}}</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.calc.skills.innate as |skill skillId|}}
<tr data-item="{{skillId}}">
<td class="padding edit-item">{{skill.label}}</td>
<td class="fixed-value">{{skill.fw}}</td>
<td class="fixed-value">{{skill.calc.bonus}}</td>
<td class="fixed-value">{{skill.calc.ew}}</td>
<td class="fixed-value"><button class="roll-button roll-learned-button"></button></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>
<table>
<thead>
<tr>
<th>{{localize "midgard5.weapon-skill"}}</th>
<th>{{localize "midgard5.fw"}}</th>
<th>{{localize "midgard5.bonus"}}</th>
<th>{{localize "midgard5.ew"}}</th>
<th>{{localize "midgard5.pp-short"}}</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.calc.skills.combat as |skill skillId|}}
<tr data-item="{{skillId}}">
<td class="padding edit-item">{{skill.label}}</td>
<td class="fixed-value">{{skill.fw}}</td>
<td class="fixed-value">{{skill.calc.bonus}}</td>
<td class="fixed-value">{{skill.calc.ew}}</td>
<td class="fixed-value">{{skill.pp}}</td>
<td class="fixed-value"><button class="roll-button roll-learned-button"></button></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>
<table>
<thead>
<tr>
<th></th>
<th>{{localize "midgard5.unlearned-skill"}}</th>
<th>{{localize "midgard5.fw"}}</th>
<th>{{localize "midgard5.bonus"}}</th>
<th>{{localize "midgard5.ew"}}</th>
<th>{{localize "midgard5.pp-short"}}</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.skills.general as |skill key|}}
{{#unless (isSkillInList (localizeMidgard key) ../actor.system.calc.skills.general) }}
<tr data-skill="{{key}}">
<td><button class="learn-button">{{localize "midgard5.learn"}}</button></td>
<td class="padding">{{localizeMidgard key}}</td>
<td class="fixed-value">{{skill.fw}}</td>
<td class="fixed-value">{{skillBonus ../actor._id skill}}</td>
<td class="fixed-value">{{skillEw ../actor._id skill}}</td>
<td class="fixed-value"><input name="data.skills.general.{{key}}.pp" type="text" value="{{skill.pp}}" data-dtype="Number" /></td>
<td class="fixed-value"><button class="roll-button roll-general-button"></button></td>
<td class="fixed-value"></td>
</tr>
{{/unless}}
{{/each}}
</tbody>
</table>

View File

@ -1,23 +0,0 @@
<table>
<thead>
<tr>
<th>{{localize "ITEM.TypeSpell"}}</th>
<th>{{localize "midgard5.ew"}}</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{{#each data.calc.spells as |item itemId|}}
<tr data-item="{{itemId}}">
<td class="padding edit-item">
<span>{{item.label}}</span>
<span class="spell-process">{{localize item.process}}</span>
</td>
<td class="fixed-value">{{item.calc.ew}}</td>
<td class="fixed-value"><button class="roll-button roll-weapon-button" /></td>
<td class="fixed-value"><a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a></td>
</tr>
{{/each}}
</tbody>
</table>

View File

@ -1,37 +0,0 @@
<form class="item-sheet {{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tbody>
<tr>
<td>{{localize "midgard5.actor-lp"}}</td>
<td><input name="data.lpProtection" type="text" value="{{data.lpProtection}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.actor-ap"}}</td>
<td><input name="data.apProtection" type="text" value="{{data.apProtection}}" data-dtype="Number" /></td>
</tr>
<tr>
<td>{{localize "midgard5.attackBonus"}}</td>
<td><input name="data.stats.attackBonus" type="text" value="{{data.stats.attackBonus}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.defenseBonus"}}</td>
<td><input name="data.stats.defenseBonus" type="text" value="{{data.stats.defenseBonus}}" data-dtype="Number" /></td>
</tr>
<tr>
<td>{{localize "midgard5.movementRange"}}</td>
<td><input name="data.stats.movementBonus" type="text" value="{{data.stats.movementBonus}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.actor-gw-long"}}</td>
<td><input name="data.attributeMod.gw" type="text" value="{{data.attributeMod.gw}}" data-dtype="Number" /></td>
</tr>
</tbody>
</table>
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>

View File

@ -1,51 +0,0 @@
<form class="item-sheet {{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tbody>
<tr>
<td colspan=4>
<div class="flexrow">
<span>
<input id="data.magic" type="checkbox" name="data.magic" {{checked data.magic}}>
<label for="data.magic">{{localize "midgard5.magic"}}</label>
</span>
<span>
<input id="data.special" type="checkbox" name="data.special" {{checked data.special}}>
<label for="data.special">{{localize "midgard5.special"}}</label>
</span>
</div>
</td>
</tr>
<tr>
<td>{{localize "midgard5.defenseBonus"}}</td>
<td><input name="data.stats.defenseBonus" type="text" value="{{data.stats.defenseBonus}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.weapon-skill"}}</td>
<td>
{{#if data.calc.combatSkills}}
<select class="select-skill" name="data.skillId" data-type="String">
{{#select data.skillId}}
<option value="">{{localize "midgard5.no-skill"}}</option>
{{#each data.calc.combatSkills as |skill key|}}
<option value="{{key}}">{{skill.label}}</option>
{{/each}}
{{/select}}
</select>
{{else}}
<span>Assign item to character to select weapon skill</span>
{{/if}}
</td>
</tr>
</tbody>
</table>
{{> "systems/midgard5e/templates/sheets/item/rolls.hbs"}}
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>

View File

@ -1,78 +0,0 @@
<form class="item-sheet {{cssClass}} m5item-item" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tr>
<td>
<input id="data.magic" type="checkbox" name="data.magic" {{checked data.magic}}>
<label for="data.magic">{{localize "midgard5.magic"}}</label>
</td>
<td>
<div class="flexrow">
<span>{{localize "midgard5.item-value"}}</span>
<input name="data.value" type="text" value="{{data.value}}" data-dtype="Number" />
</div>
</td>
</tr>
</table>
<table>
<thead>
<tr>
<th>Mods</th>
<th></th>
<th></th>
<th><button class="add-mod">+</button></th>
</tr>
</thead>
<tbody>
{{#each data.mods as |mod modId|}}
<tr>
<td>
<select class="select-mod-type" name="data.mods.{{modId}}.type" data-type="String">
{{#select mod.type}}
<option value="attribute">{{localize "midgard5.attribute"}}</option>
<option value="stat">{{localize "midgard5.bonus"}}</option>
<option value="skill">{{localize "midgard5.skill"}}</option>
{{/select}}
</select>
</td>
<td>
<select class="select-id" name="data.mods.{{modId}}.id" data-type="String">
{{#select mod.id}}
<option value="">{{localize "midgard5.no-skill"}}</option>
{{#each (lookup ../data.calc.mods modId) as |name key|}}
<option value="{{key}}">{{name}}</option>
{{/each}}
{{/select}}
</select>
</td>
<td>
<select class="select-mod-operation" name="data.mods.{{modId}}.operation" data-type="String">
{{#select mod.operation}}
{{#if (eq mod.type "attribute")}}
<option value="add100">{{localize "midgard5.mod-operation-add100"}}</option>
{{/if}}
<option value="add">{{localize "midgard5.mod-operation-add"}}</option>
<option value="set">{{localize "midgard5.mod-operation-set"}}</option>
<option value="fixed">{{localize "midgard5.mod-operation-fixed"}}</option>
{{/select}}
</select>
</td>
<td>
<input name="data.mods.{{modId}}.value" type="text" value="{{mod.value}}" data-dtype="Number" />
</td>
</tr>
{{/each}}
</tbody>
</table>
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>

View File

@ -1,61 +0,0 @@
<form class="item-sheet {{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tbody>
<tr>
<td>{{localize "midgard5.mod-type"}}</td>
<td>
<select class="select-mod-type" name="data.type" data-type="String">
{{#select data.type}}
<option value="attribute">{{localize "midgard5.attribute"}}</option>
<option value="stat">{{localize "midgard5.bonus"}}</option>
<option value="skill">{{localize "midgard5.skill"}}</option>
{{/select}}
</select>
</td>
</tr>
<tr>
<td>{{localize "midgard5.mod-id"}}</td>
<td>
<select class="select-id" name="data.id" data-type="String">
{{#select data.id}}
<option value="">{{localize "midgard5.no-skill"}}</option>
{{#each data.calc.ids as |name key|}}
<option value="{{key}}">{{name}}</option>
{{/each}}
{{/select}}
</select>
</td>
</tr>
<tr>
<td>{{localize "midgard5.mod-operation"}}</td>
<td>
<select class="select-mod-operation" name="data.operation" data-type="String">
{{#select data.operation}}
{{#if (eq data.type "attribute")}}
<option value="add100">{{localize "midgard5.mod-operation-add100"}}</option>
{{/if}}
<option value="add">{{localize "midgard5.mod-operation-add"}}</option>
<option value="set">{{localize "midgard5.mod-operation-set"}}</option>
<option value="fixed">{{localize "midgard5.mod-operation-fixed"}}</option>
{{/select}}
</select>
</td>
</tr>
<tr>
<td>{{localize "midgard5.mod-value"}}</td>
<td><input name="data.value" type="text" value="{{data.value}}" data-dtype="Number" /></td>
</tr>
</tbody>
</table>
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>

View File

@ -1,22 +0,0 @@
<table class="rolls-table">
<thead>
<tr>
<th class="col-enabled"></th>
<th class="col-label">{{localize "midgard5.label"}}</th>
<th class="col-formula">{{localize "midgard5.formula"}}</th>
<th class="col-delete"><button class="roll-create">+</button></th>
</tr>
</thead>
<tbody>
{{#each data.rolls.formulas as |roll rollIndex|}}
{{#if roll}}
<tr data-roll="{{rollIndex}}">
<td><input type="checkbox" name="data.rolls.formulas.{{rollIndex}}.enabled" {{checked roll.enabled}} /></td>
<td><input type="text" name="data.rolls.formulas.{{rollIndex}}.label" value="{{roll.label}}" data-dtype="String" /></td>
<td><input type="text" name="data.rolls.formulas.{{rollIndex}}.formula" value="{{roll.formula}}" data-dtype="String" /></td>
<td class="fixed-value"><a class="roll-delete" title="Delete Roll"><i class="fas fa-trash"></i></a></td>
</tr>
{{/if}}
{{/each}}
</tbody>
</table>

View File

@ -1,41 +0,0 @@
<form class="item-sheet {{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tbody>
<tr>
<td>{{localize "midgard5.skill-value"}}</td>
<td><input name="data.fw" type="text" value="{{data.fw}}" data-dtype="Number" /></td>
</tr>
{{#unless (eq data.type "combat")}}
<tr>
<td>{{localize "midgard5.attribute"}}</td>
<td>
<select class="select-attribute" name="data.attribute" data-type="String">
{{#select data.attribute}}
<option value="">{{localize "midgard5.no-skill"}}</option>
{{#each data.attributes as |attribute key|}}
<option value="{{key}}">{{localize attribute.long}}</option>
{{/each}}
{{/select}}
</select>
</td>
</tr>
{{/unless}}
<tr>
<td>{{localize "midgard5.pp"}}</td>
<td><input name="data.pp" type="text" value="{{data.pp}}" data-dtype="Number" /></td>
</tr>
</tbody>
</table>
{{> "systems/midgard5e/templates/sheets/item/rolls.hbs"}}
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>

View File

@ -1,70 +0,0 @@
<form class="item-sheet {{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tbody>
<tr>
<td>{{localize "midgard5.bonus"}}</td>
<td><input name="data.bonus" type="text" value="{{data.bonus}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.actor-ap"}}</td>
<td><input name="data.ap" type="text" value="{{data.ap}}" data-dtype="String" /></td>
</tr>
<tr>
<td>{{localize "midgard5.spell-castDuration"}}</td>
<td><input name="data.castDuration" type="text" value="{{data.castDuration}}" data-dtype="String" /></td>
<td>{{localize "midgard5.spell-range"}}</td>
<td><input name="data.range" type="text" value="{{data.range}}" data-dtype="String" /></td>
</tr>
<tr>
<td>{{localize "midgard5.spell-effectTarget"}}</td>
<td>
<select class="select-effectTarget" name="data.effectTarget" data-type="String">
{{#select data.effectTarget}}
{{#each data.spellTargetSelection as |label key|}}
<option value="{{key}}">{{localize label}}</option>
{{/each}}
{{/select}}
</select>
</td>
<td>{{localize "midgard5.spell-effectArea"}}</td>
<td><input name="data.effectArea" type="text" value="{{data.effectArea}}" data-dtype="String" /></td>
</tr>
<tr>
<td>{{localize "midgard5.spell-effectDuration"}}</td>
<td><input name="data.effectDuration" type="text" value="{{data.effectDuration}}" data-dtype="String" /></td>
<td>{{localize "midgard5.spell-origin"}}</td>
<td><input name="data.origin" type="text" value="{{data.origin}}" data-dtype="String" /></td>
</tr>
<tr>
<td>{{localize "midgard5.spell-type"}}</td>
<td>
<select class="select-type" name="data.type" data-type="String">
{{#select data.type}}
{{#each data.spellTypeSelection as |label key|}}
<option value="{{key}}">{{localize label}}</option>
{{/each}}
{{/select}}
</select>
</td>
<td>{{localize "midgard5.spell-process"}}</td>
<td>
<select class="select-process" name="data.process" data-type="String">
{{#select data.process}}
{{#each data.spellProcessSelection as |label key|}}
<option value="{{key}}">{{localize label}}</option>
{{/each}}
{{/select}}
</select>
</td>
</tr>
</tbody>
</table>
{{> "systems/midgard5e/templates/sheets/item/rolls.hbs"}}
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>

View File

@ -1,68 +0,0 @@
<form class="item-sheet {{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
</header>
<div class="sheet-content">
<table>
<tbody>
<tr>
<td colspan=4>
<div class="flexrow">
<span>
<input id="data.magic" type="checkbox" name="data.magic" {{checked data.magic}}>
<label for="data.magic">{{localize "midgard5.magic"}}</label>
</span>
<span>
<input id="data.ranged" type="checkbox" name="data.ranged" {{checked data.ranged}}>
<label for="data.ranged">{{localize "midgard5.rangedWeapon"}}</label>
</span>
<span>
<input id="data.special" type="checkbox" name="data.special" {{checked data.special}}>
<label for="data.special">{{localize "midgard5.special"}}</label>
</span>
</div>
</td>
</tr>
<tr>
<td>{{localize "midgard5.base-damage"}}</td>
<td>
{{#if data.defensive}}
<span>Not available for defensive weapons</span>
{{else}}
<input name="data.damageBase" type="text" value="{{data.damageBase}}" data-dtype="String" />
{{/if}}
</td>
<td>{{localize "midgard5.weapon-skill"}}</td>
<td>
{{#if data.calc.combatSkills}}
<select class="select-skill" name="data.skillId" data-type="String">
{{#select data.skillId}}
<option value="">{{localize "midgard5.no-skill"}}</option>
{{#each data.calc.combatSkills as |skill key|}}
<option value="{{key}}">{{skill.label}}</option>
{{/each}}
{{/select}}
</select>
{{else}}
<span>{{localize "midgard5.assignItemToCharacter"}}</span>
{{/if}}
</td>
</tr>
<tr>
<td>{{localize "midgard5.attackBonus"}}</td>
<td><input name="data.stats.attackBonus" type="text" value="{{data.stats.attackBonus}}" data-dtype="Number" /></td>
<td>{{localize "midgard5.damageBonus"}}</td>
<td><input name="data.stats.damageBonus" type="text" value="{{data.stats.damageBonus}}" data-dtype="Number" /></td>
</tr>
</tbody>
</table>
{{> "systems/midgard5e/templates/sheets/item/rolls.hbs"}}
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
</div>
</form>

View File

@ -1,6 +1,6 @@
{
"name": "foundry-system-midgard5",
"version": "1.2.3",
"version": "2.7.2",
"description": "",
"main": "index.js",
"scripts": {

View File

@ -1,472 +0,0 @@
{
"name": "Grad 01",
"type": "character",
"img": "icons/svg/mystery-man.svg",
"system": {
"lp": {
"value": 15,
"min": 0,
"max": 15
},
"ap": {
"value": 20,
"min": 0,
"max": 20
},
"attributes": {
"st": {
"value": 50,
"bonus": 0
},
"gs": {
"value": 50,
"bonus": 0
},
"gw": {
"value": 50,
"bonus": 0
},
"ko": {
"value": 50,
"bonus": 0
},
"in": {
"value": 50,
"bonus": 0
},
"zt": {
"value": 50,
"bonus": 0
},
"au": {
"value": 50,
"bonus": 0
},
"pa": {
"value": 50,
"bonus": 0
},
"wk": {
"value": 50,
"bonus": 0
}
},
"info": {
"description": "",
"class": "",
"race": "",
"magicUsing": false,
"gender": "",
"weight": "",
"height": "",
"shape": "",
"age": "",
"caste": "",
"occupation": "",
"origin": "",
"faith": ""
},
"es": 0,
"ep": 0,
"gg": 0,
"sg": 0,
"gp": 2,
"skills": {
"general": {
"akrobatik": {
"fw": 6,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"alchimie": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"anfuehren": {
"fw": 6,
"attribute": "pa",
"initial": 8,
"pp": 0
},
"athletik": {
"fw": 0,
"attribute": "st",
"initial": 8,
"pp": 0
},
"balancieren": {
"fw": 6,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"beidhaendigerKampf": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"beredsamkeit": {
"fw": 3,
"attribute": "pa",
"initial": 8,
"pp": 0
},
"betaeuben": {
"fw": 6,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"bootfahren": {
"fw": 3,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"ersteHilfe": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"etikette": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"fallenEntdecken": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"fallenmechanik": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"faelschen": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"fechten": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"gassenwissen": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"gaukeln": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"gelaendelauf": {
"fw": 6,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"geraetekunde": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"geschaeftssinn": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"gluecksspiel": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"heilkunde": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"kampfInVollruestung": {
"fw": 0,
"attribute": "st",
"initial": 8,
"pp": 0
},
"klettern": {
"fw": 6,
"attribute": "st",
"initial": 8,
"pp": 0
},
"landeskunde": {
"fw": 6,
"attribute": "in",
"initial": 8,
"pp": 0
},
"laufen": {
"fw": 0,
"attribute": "ko",
"initial": 8,
"pp": 0
},
"lesenVonZauberschrift": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"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": 8,
"pp": 0
},
"naturkunde": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"pflanzenkunde": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"reiten": {
"fw": 6,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"reiterkampf": {
"fw": 0,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"scharfschiessen": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"schleichen": {
"fw": 3,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"schloesserOeffnen": {
"fw": 0,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"schwimmen": {
"fw": 3,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"seilkunst": {
"fw": 3,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"spurensuche": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
},
"stehlen": {
"fw": 3,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"tarnen": {
"fw": 3,
"attribute": "gw",
"initial": 8,
"pp": 0
},
"tauchen": {
"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
},
"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
},
"wagenlenken": {
"fw": 3,
"attribute": "gs",
"initial": 8,
"pp": 0
},
"zauberkunde": {
"fw": 0,
"attribute": "in",
"initial": 8,
"pp": 0
}
}
},
"calc": {}
},
"prototypeToken": {
"name": "Spielfigur",
"displayName": 0,
"actorLink": false,
"texture": {
"src": "icons/svg/mystery-man.svg",
"scaleX": 1,
"scaleY": 1,
"offsetX": 0,
"offsetY": 0,
"rotation": 0,
"tint": null
},
"width": 1,
"height": 1,
"lockRotation": false,
"rotation": 0,
"alpha": 1,
"disposition": -1,
"displayBars": 0,
"bar1": {
"attribute": "lp"
},
"bar2": {
"attribute": "ap"
},
"light": {
"alpha": 0.5,
"angle": 360,
"bright": 0,
"color": null,
"coloration": 1,
"dim": 0,
"attenuation": 0.5,
"luminosity": 0.5,
"saturation": 0,
"contrast": 0,
"shadows": 0,
"animation": {
"type": null,
"speed": 5,
"intensity": 5,
"reverse": false
},
"darkness": {
"min": 0,
"max": 1
}
},
"sight": {
"enabled": false,
"range": null,
"angle": 360,
"visionMode": "basic",
"color": null,
"attenuation": 0.1,
"brightness": 0,
"saturation": 0,
"contrast": 0
},
"detectionModes": [],
"flags": {},
"randomImg": false
},
"items": [],
"effects": [],
"flags": {
"core": {
"sourceId": "Actor.25UihsoT43jms4Rx"
}
},
"_stats": {
"systemId": "midgard5e",
"systemVersion": "1.1.0",
"coreVersion": "10.291",
"createdTime": 1681861642287,
"modifiedTime": 1681862257893,
"lastModifiedBy": "Fphp3NQlJ6KWctyq"
},
"folder": null,
"sort": 0,
"ownership": {
"default": 0,
"Fphp3NQlJ6KWctyq": 3
},
"_id": "k21WA0JziDJ7yJ1U"
}

1
packs/empty.md Normal file
View File

@ -0,0 +1 @@
JSON files for ompendium packs can be added here

View File

@ -1,49 +0,0 @@
{
"name": "Fernkampfwaffe",
"type": "weapon",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"stats": {
"damageBonus": 0,
"attackBonus": 0,
"defenseBonus": 0,
"movementBonus": 0,
"resistanceMind": 0,
"resistanceBody": 0,
"spellBonus": 0
},
"equippable": false,
"equipped": true,
"value": 0,
"magic": false,
"special": false,
"ranged": true,
"skillId": "",
"damageBase": "1d6",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.attackBonus.value + @i.stats.attackBonus",
"label": "Angriff",
"enabled": true
},
"1": {
"formula": "@i.damageBase + @i.stats.damageBonus",
"label": "Schaden",
"enabled": true
}
},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "h1inVuRJQI42JTCs"
}

View File

@ -1,69 +0,0 @@
{
"name": "Gewöhnliche Fertigkeit",
"type": "skill",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"attributes": {
"st": {
"short": "midgard5.actor-st",
"long": "midgard5.actor-st-long"
},
"gs": {
"short": "midgard5.actor-gs",
"long": "midgard5.actor-gs-long"
},
"gw": {
"short": "midgard5.actor-gw",
"long": "midgard5.actor-gw-long"
},
"ko": {
"short": "midgard5.actor-ko",
"long": "midgard5.actor-ko-long"
},
"in": {
"short": "midgard5.actor-in",
"long": "midgard5.actor-in-long"
},
"zt": {
"short": "midgard5.actor-zt",
"long": "midgard5.actor-zt-long"
},
"au": {
"short": "midgard5.actor-au",
"long": "midgard5.actor-au-long"
},
"pa": {
"short": "midgard5.actor-pa",
"long": "midgard5.actor-pa-long"
},
"wk": {
"short": "midgard5.actor-wk",
"long": "midgard5.actor-wk-long"
}
},
"fw": 8,
"attribute": "st",
"skill": "",
"type": "general",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.fw + @i.calc.bonus",
"enabled": true,
"label": "EW"
}
},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "4N0IgVDj1eee0hSB"
}

View File

@ -1,69 +0,0 @@
{
"name": "Angeborene Fähigkeit",
"type": "skill",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"attributes": {
"st": {
"short": "midgard5.actor-st",
"long": "midgard5.actor-st-long"
},
"gs": {
"short": "midgard5.actor-gs",
"long": "midgard5.actor-gs-long"
},
"gw": {
"short": "midgard5.actor-gw",
"long": "midgard5.actor-gw-long"
},
"ko": {
"short": "midgard5.actor-ko",
"long": "midgard5.actor-ko-long"
},
"in": {
"short": "midgard5.actor-in",
"long": "midgard5.actor-in-long"
},
"zt": {
"short": "midgard5.actor-zt",
"long": "midgard5.actor-zt-long"
},
"au": {
"short": "midgard5.actor-au",
"long": "midgard5.actor-au-long"
},
"pa": {
"short": "midgard5.actor-pa",
"long": "midgard5.actor-pa-long"
},
"wk": {
"short": "midgard5.actor-wk",
"long": "midgard5.actor-wk-long"
}
},
"fw": 6,
"attribute": "",
"skill": "",
"type": "innate",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.fw + @i.calc.bonus",
"type": "ew",
"label": "EW"
}
},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "nkMkMFNDSdvlP1Jt"
}

View File

@ -1,39 +0,0 @@
{
"name": "Gegenstand",
"type": "item",
"img": "icons/svg/item-bag.svg",
"system": {
"description": "",
"equippable": false,
"equipped": true,
"value": 0,
"magic": false,
"rolls": {
"formulas": {},
"output": ""
},
"mods": {},
"calc": {}
},
"effects": [],
"flags": {
"core": {
"sourceId": "Item.8GrWgO1jjysZPnxc"
}
},
"_stats": {
"systemId": "midgard5e",
"systemVersion": "1.1.0",
"coreVersion": "10.291",
"createdTime": 1681862229001,
"modifiedTime": 1681862253981,
"lastModifiedBy": "Fphp3NQlJ6KWctyq"
},
"folder": null,
"sort": 0,
"ownership": {
"default": 0,
"Fphp3NQlJ6KWctyq": 3
},
"_id": "ERcxMh7hWiv42rfx"
}

View File

@ -1,46 +0,0 @@
{
"name": "Rüstung",
"type": "armor",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"stats": {
"damageBonus": 0,
"attackBonus": 0,
"defenseBonus": 0,
"movementBonus": 0,
"resistanceMind": 0,
"resistanceBody": 0,
"spellBonus": 0
},
"equippable": false,
"equipped": true,
"attributeMod": {
"st": 0,
"gs": 0,
"gw": 0,
"ko": 0,
"in": 0,
"zt": 0,
"au": 0,
"pa": 0,
"wk": 0
},
"magic": false,
"lpProtection": 0,
"apProtection": 0,
"rolls": {
"formulas": {},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "pV1hNavlQGJ9UaEf"
}

View File

@ -1,69 +0,0 @@
{
"name": "Sprache",
"type": "skill",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"attributes": {
"st": {
"short": "midgard5.actor-st",
"long": "midgard5.actor-st-long"
},
"gs": {
"short": "midgard5.actor-gs",
"long": "midgard5.actor-gs-long"
},
"gw": {
"short": "midgard5.actor-gw",
"long": "midgard5.actor-gw-long"
},
"ko": {
"short": "midgard5.actor-ko",
"long": "midgard5.actor-ko-long"
},
"in": {
"short": "midgard5.actor-in",
"long": "midgard5.actor-in-long"
},
"zt": {
"short": "midgard5.actor-zt",
"long": "midgard5.actor-zt-long"
},
"au": {
"short": "midgard5.actor-au",
"long": "midgard5.actor-au-long"
},
"pa": {
"short": "midgard5.actor-pa",
"long": "midgard5.actor-pa-long"
},
"wk": {
"short": "midgard5.actor-wk",
"long": "midgard5.actor-wk-long"
}
},
"fw": 8,
"attribute": "in",
"skill": "",
"type": "language",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus",
"enabled": true,
"label": "EW"
}
},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "rDN14z3lNJISWTdO"
}

View File

@ -1,42 +0,0 @@
{
"name": "Verteidigungswaffe",
"type": "defensiveWeapon",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"stats": {
"damageBonus": 0,
"attackBonus": 0,
"defenseBonus": 0,
"movementBonus": 0,
"resistanceMind": 0,
"resistanceBody": 0,
"spellBonus": 0
},
"equippable": false,
"equipped": true,
"special": false,
"magic": false,
"skillId": "",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.defense.value + @c.calc.stats.defenseBonus.value + @i.stats.defenseBonus",
"enabled": true,
"label": "Abwehr"
}
},
"output": ""
},
"calc": {},
"damageBase": ""
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "BNAoHN0vHfcwNUTl"
}

View File

@ -1,48 +0,0 @@
{
"name": "Waffe",
"type": "weapon",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"stats": {
"damageBonus": 0,
"attackBonus": 0,
"defenseBonus": 0,
"movementBonus": 0,
"resistanceMind": 0,
"resistanceBody": 0,
"spellBonus": 0
},
"equippable": false,
"equipped": true,
"special": false,
"magic": false,
"ranged": false,
"skillId": "",
"damageBase": "1d6",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus + @i.calc.special + @c.calc.stats.attackBonus.value + @i.stats.attackBonus",
"enabled": true,
"label": "Angriff"
},
"1": {
"formula": "@i.damageBase + @i.stats.damageBonus + @c.calc.stats.damageBonus.value",
"enabled": true,
"label": "Schaden"
}
},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "uGQJ4VPhh135e79a"
}

View File

@ -1,69 +0,0 @@
{
"name": "Waffenfertigkeit",
"type": "skill",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"attributes": {
"st": {
"short": "midgard5.actor-st",
"long": "midgard5.actor-st-long"
},
"gs": {
"short": "midgard5.actor-gs",
"long": "midgard5.actor-gs-long"
},
"gw": {
"short": "midgard5.actor-gw",
"long": "midgard5.actor-gw-long"
},
"ko": {
"short": "midgard5.actor-ko",
"long": "midgard5.actor-ko-long"
},
"in": {
"short": "midgard5.actor-in",
"long": "midgard5.actor-in-long"
},
"zt": {
"short": "midgard5.actor-zt",
"long": "midgard5.actor-zt-long"
},
"au": {
"short": "midgard5.actor-au",
"long": "midgard5.actor-au-long"
},
"pa": {
"short": "midgard5.actor-pa",
"long": "midgard5.actor-pa-long"
},
"wk": {
"short": "midgard5.actor-wk",
"long": "midgard5.actor-wk-long"
}
},
"fw": 5,
"attribute": "",
"skill": "",
"type": "combat",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @i.calc.fw + @i.calc.bonus",
"enabled": true,
"label": "EW"
}
},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "1E4XHTGZlned2ofY"
}

View File

@ -1,67 +0,0 @@
{
"name": "Zauber",
"type": "spell",
"img": "icons/svg/item-bag.svg",
"data": {
"description": "",
"spellProcessSelection": {
"none": "midgard5.spell-process-none",
"beherrschen": "midgard5.spell-process-beherrschen",
"bewegen": "midgard5.spell-process-bewegen",
"erkennen": "midgard5.spell-process-erkennen",
"erschaffen": "midgard5.spell-process-erschaffen",
"formen": "midgard5.spell-process-formen",
"veraendern": "midgard5.spell-process-veraendern",
"zerstoeren": "midgard5.spell-process-zerstoeren",
"wundertat": "midgard5.spell-process-wundertat",
"dweomer": "midgard5.spell-process-dweomer",
"zauberlied": "midgard5.spell-process-zauberlied",
"salz": "midgard5.spell-process-salz",
"thaumagraphie": "midgard5.spell-process-thaumagraphie",
"beschwoeren": "midgard5.spell-process-beschwoeren",
"nekromantie": "midgard5.spell-process-nekromantie",
"thaumatherapie": "midgard5.spell-process-thaumatherapie",
"zaubermittel": "midgard5.spell-process-zaubermittel",
"zauberschutz": "midgard5.spell-process-zauberschutz"
},
"spellTypeSelection": {
"gedanke": "midgard5.spell-type-gedanke",
"geste": "midgard5.spell-type-geste",
"wort": "midgard5.spell-type-wort"
},
"spellTargetSelection": {
"umgebung": "midgard5.spell-target-umgebung",
"geist": "midgard5.spell-target-geist",
"koerper": "midgard5.spell-target-koerper"
},
"bonus": 0,
"type": "gedanke",
"process": "none",
"ap": 0,
"castDuration": "",
"range": "",
"effectTarget": "umgebung",
"effectArea": "",
"effectDuration": "",
"origin": "",
"rolls": {
"formulas": {
"0": {
"formula": "1d20 + @c.calc.stats.spellCasting.value + @i.bonus",
"enabled": true,
"label": "Zaubern"
}
},
"output": ""
},
"calc": {}
},
"effects": [],
"folder": null,
"sort": 0,
"permission": {
"default": 0,
"XD0IpWT6bN4AJiYQ": 3
},
"_id": "HQ469FvZkwKfzFfu"
}

View File

@ -1,19 +0,0 @@
{
"name": "Kritische Fehler beim Zaubern",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"type": "script",
"flags": {
"core": {
"sourceId": "Macro.e4KLlTBq8Z4Pt7In"
}
},
"scope": "global",
"command": "await game.tables.getName(\"Kritischer Fehler beim Zaubern\").draw()",
"author": "CBq5YXAqbO7HoJ03",
"img": "systems/midgard5e/assets/icons/macro/kritfehlerzauber.svg",
"actorIds": [],
"_id": "XtzGuyYRyX8wVi1e"
}

View File

@ -1,19 +0,0 @@
{
"name": "Kritischer Erfolg bei der Abwehr",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"type": "script",
"flags": {
"core": {
"sourceId": "Macro.P6jQGko7PdG6Xlhe"
}
},
"scope": "global",
"command": "await game.tables.getName(\"Kritischer Erfolg bei der Abwehr\").draw()",
"author": "CBq5YXAqbO7HoJ03",
"img": "systems/midgard5e/assets/icons/macro/kriterfolgabwehr.svg",
"actorIds": [],
"_id": "qWyrwvh7g9CbTKg9"
}

View File

@ -1,19 +0,0 @@
{
"name": "Kritischer Fehler bei Angriffen",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"type": "script",
"flags": {
"core": {
"sourceId": "Macro.FZUermrYHSbrEluS"
}
},
"scope": "global",
"command": "await game.tables.getName(\"Kritischer Fehler bei Angriffen\").draw()",
"author": "CBq5YXAqbO7HoJ03",
"img": "systems/midgard5e/assets/icons/macro/kritfehlerangriff.svg",
"actorIds": [],
"_id": "798kmgnTkpfP89Z9"
}

View File

@ -1,19 +0,0 @@
{
"name": "Kritischer Fehler bei der Abwehr",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"type": "script",
"flags": {
"core": {
"sourceId": "Macro.k1tLp8Q2NY9twiZ6"
}
},
"scope": "global",
"command": "await game.tables.getName(\"Kritischer Fehler bei der Abwehr\").draw()",
"author": "CBq5YXAqbO7HoJ03",
"img": "systems/midgard5e/assets/icons/macro/kritfehlerabwehr.svg",
"actorIds": [],
"_id": "W7rYb00B6rtabV05"
}

View File

@ -1,19 +0,0 @@
{
"name": "Kritischer Schaden",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"type": "script",
"flags": {
"core": {
"sourceId": "Macro.QZlbT0tgD2aYW5YJ"
}
},
"scope": "global",
"command": "await game.tables.getName(\"Kritischer Schaden\").draw()",
"author": "CBq5YXAqbO7HoJ03",
"img": "systems/midgard5e/assets/icons/macro/kriterfolgangriff.svg",
"actorIds": [],
"_id": "48DUqxdpHDCGKOHp"
}

View File

@ -1,19 +0,0 @@
{
"name": "1W10",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"type": "chat",
"flags": {
"core": {
"sourceId": "Macro.TqmUKpMpY4GhiTML"
}
},
"scope": "global",
"command": "/r 1d10",
"author": "CBq5YXAqbO7HoJ03",
"img": "systems/midgard5e/assets/icons/wurfel/w10.svg",
"actorIds": [],
"_id": "YWsPRUpZpgLBKIB3"
}

View File

@ -1,19 +0,0 @@
{
"name": "1W100",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"type": "chat",
"flags": {
"core": {
"sourceId": "Macro.S01PfXnvLPeuKOH8"
}
},
"scope": "global",
"command": "/r 1d100",
"author": "CBq5YXAqbO7HoJ03",
"img": "systems/midgard5e/assets/icons/wurfel/w100.svg",
"actorIds": [],
"_id": "pXZIfqDIX9VKYonr"
}

View File

@ -1,19 +0,0 @@
{
"name": "1W20",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"type": "chat",
"flags": {
"core": {
"sourceId": "Macro.mj9nIEgk0UDz8tbH"
}
},
"scope": "global",
"command": "/r 1d20",
"author": "CBq5YXAqbO7HoJ03",
"img": "systems/midgard5e/assets/icons/wurfel/w20.svg",
"actorIds": [],
"_id": "qBoxslCQXxR22xKc"
}

View File

@ -1,19 +0,0 @@
{
"name": "1W6",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"type": "chat",
"flags": {
"core": {
"sourceId": "Macro.QBhV6De80g1wH6ot"
}
},
"scope": "global",
"command": "/r 1d6",
"author": "CBq5YXAqbO7HoJ03",
"img": "systems/midgard5e/assets/icons/wurfel/w6.svg",
"actorIds": [],
"_id": "5tpfRgbM5sTL9gur"
}

View File

@ -1,133 +0,0 @@
{
"name": "Kritische Fehler beim Zaubern",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"flags": {
"exportSource": {
"world": "midgard-test",
"system": "midgard5e",
"coreVersion": "0.7.9",
"systemVersion": 0.02
}
},
"img": "icons/svg/book.svg",
"description": "<h2>Tabelle 1: Kritische Fehler Beim Zaubern</h2><h3><b>*</b>: Die Magie wirkt auf ein falsches Ziel oder hat einen unerwünschten Effekt. Werden dabei Wesen betroffen, die nicht verzaubert werden wollen, steht ihnen ein WW:Resistenz oder ein WW:Abwehr zu. Dabei zählt allerdings nicht das Würfelergebnis von 1, das zu dem kritischen Fehler geführt hat, sondern der ungeschickte Zauberer wiederholt in diesen Fällen den EW:Zaubern. Diesem neuen Gesamtergebnis müssen die Opfer \ndes kritischen Fehlers widerstehen, um der magischen Wirkung \nzu entgehen - auch wenn es unter 20 liegt. Fällt bei diesem wiederholten EW:Zaubern eine 1 oder eine 20, so hat dies keine besonderen Folgen.</br>Wird ein kritischer Fehler erwürfelt, der für einen Spruch sinnlos ist, wird stattdessen der Zauberer geschwächt. Er kann [[1d6]] Runden nicht zaubern.</h3>",
"results": [
{
"_id": "LW9UnEaonREGKzTy",
"flags": {},
"type": 0,
"text": "Keine besonderen Auswirkungen.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [1, 10],
"drawn": false
},
{
"_id": "G7GgXxFcsfsbUcwi",
"flags": {},
"type": 0,
"text": "<h3><b>*</b> Der Zauberer verspricht sich oder kann seine Gedanken nicht zusammenhalten.</h3>Es kommt zu einer Entladung magischer Energie, die wirkungslos verpufft, dem Zauberer aber einen leichten thaumatischen Schock versetzt. Er kann [[1d6]] Runden (*10 sec) lang nicht zaubern.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 20,
"range": [11, 30],
"drawn": false
},
{
"_id": "7vVkIs4duqhpJaKq",
"flags": {},
"type": 0,
"text": "<h3>Der Zauberer unterschätzt das Ausmaß des Flusses arkaner Energie.</h3>Der Zauberer setzt mehr Magan in Bewegung als nötig. Der Überfluss entzieht sich seiner Kontrolle und breitet sich schlagartig in seinem Astralleib aus. Diese Störung lässt den Spruch fehlschlagen. Der Zauberer verliert dadurch doppelt so viele AP wie üblich.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 20,
"range": [31, 50],
"drawn": false
},
{
"_id": "S5d86WFP7bCmatNp",
"flags": {},
"type": 0,
"text": "<h3><b>*</b> Der Zauberer irrt sich bei der Festlegung des Effekts.</h3>Das Opfer wird gestärkt statt geschwächt, verwundet statt geheilt, es wird wärmer statt kühler usw. Soweit möglich, geschieht das Gegenteil dessen, was der Zauberer erreichen wollte.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [51, 60],
"drawn": false
},
{
"_id": "I3XXLhTRCdE19Vmd",
"flags": {},
"type": 0,
"text": "<h3><b>*</b> Der Zauberer irrt sich bei der Auswahl des Opfers/ des Wirkungsbereichs.</h3>Der Spruch wirkt auf ein zufällig bestimmtes Wesen oder Objekt innerhalb der Reichweite. Bei räumlichen Wirkungsbereichen breitet sich die Magie in die genau entgegengesetzte Richtung (Kegel oder Strahl) aus bzw. liegt das Zentrum der Wirkung in entgegengesetzter Richtung vom Zauberer aus gesehen (Umkreis).",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [61, 70],
"drawn": false
},
{
"_id": "ciB0pGZyV4KjV5iO",
"flags": {},
"type": 0,
"text": "<h3>Der Zauberer wird geschwächt.</h3>Der Spruch misslingt, aber die bereits freigesetzte Energie schwächt Körper und Geist des Zauberers. Er verliert [[1d6]] AP und kann [[1d6*10]] min lang nicht zaubern.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [71, 80],
"drawn": false
},
{
"_id": "xx6BVgf3NbpFJLaQ",
"flags": {},
"type": 0,
"text": "<h3>Es kommt zu einer magischen Stauung.</h3>Die falsche Ausführung des Zaubers verhindert die Weiterleitung der erzeugten arkanen Energie. Die starke Ansammlung von Magan im Argyriston des Zauberers zieht dieses in Mitleidenschaft. Sein Zaubertalent sinkt für [[1d6]] Tage auf die Hälfte des normalen Wertes - mit entsprechenden Folgen für seinen persönlichen Zauberbonus. Dieser negative Effekt kann mit Allheilung vorzeitig aufgehoben werden.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [81, 90],
"drawn": false
},
{
"_id": "Q3QjCiHYzLVtrXz3",
"flags": {},
"type": 0,
"text": "<h3>Der Zauberer erleidet eine schwere Bewusstseinsstörung.</h3>Die Entladung magischer Energie beim Scheitern des Spruches versetzt dem Zauberer einen schweren thaumatischen Schock. Er verliert dadurch [[1d6]] LP und AP und kann in der nächsten Stunde nicht zaubern. Übersteigen die LP-Verluste ein Drittel des LP Maximums, so fällt der Zauberer in ein Koma, aus dem er nach [[1d6]] Tagen erwacht. Mit Allheilung kann er vorher aufgeweckt werden.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 5,
"range": [91, 95],
"drawn": false
},
{
"_id": "QICP7DgbyTmp1Nns",
"flags": {},
"type": 0,
"text": "<h3><b>*</b>Der Zauberer verzaubert sich selbst.</h3>Bei einem Geistes- oder Körperzauber trifft die volle Wirkung der Magie den Zauberer selbst, wenn ihm ein WW:Resistenz misslingt. Schützende Zauber funktionieren also gegebenenfalls ganz normal (Glück im Unglück). Kontrollzauber wie Macht über Menschen führen zur vorübergehenden Handlungsunfähigkeit des Zauberers; sein Geist versucht, die Kontrolle über sich selbst zu übernehmen, so dass er völlig mit sich selbst beschäftigt ist, bis ihm ein alle 2 min erlaubter EW:Resistenz gelingt. Sprü- che, die wie Macht über die belebte Natur nur auf Tiere wirken, haben keinen Effekt. Bei Umgebungszaubern tritt stattdessen der unter 91-95 beschriebene Effekt ein.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 4,
"range": [96, 99],
"drawn": false
},
{
"_id": "qY2J5MqMZvNzspnt",
"flags": {},
"type": 0,
"text": "<h3>Zauberwerk wird in Mitleidenschaft gezogen.</h3>Der Spruch misslingt; die dabei freigesetzte Energie stört die Magie von Zauberwerk, das der Zauberer mit sich führt. Jeder magische Gegenstand in bis zu 1 m Entfernung ist mit einer Chance von 10%+Stufe des misslungenen Zaubers betroffen: Zaubermittel (Trünke, Kräuter usw.) verlieren ihre Eigenschaften, Amulette werden wirkungslos, Spruchrollen leeren sich. Bei verzauberten Waffen oder Rüstungen gehen [[1d63]] von allen magischen Zuschlägen verloren. Bei Artefakten mit mehreren Wirkungen wird für jede einzeln gewürfelt, ob sie betroffen ist.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 1,
"range": [100, 100],
"drawn": false
}
],
"formula": "1d100",
"replacement": true,
"displayRoll": true,
"_id": "PRovcPRqdrvFRpFN"
}

View File

@ -1,142 +0,0 @@
{
"name": "Kritischer Erfolg bei der Abwehr",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"flags": {},
"img": "icons/svg/holy-shield.svg",
"description": "<h2>Tabelle 6: Kritischer Erfolg bei der Abwehr</h2>",
"results": [
{
"_id": "ImLGlzC3AuyT5VMl",
"flags": {},
"type": 0,
"text": "Keine besonderen Auswirkungen.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [
1,
10
],
"drawn": false
},
{
"_id": "PPQUPOo5JGRkKPXQ",
"flags": {},
"type": 0,
"text": "Die Waffenhand des Angreifers wird geprellt. In der folgenden Runde kann er mit dieser Hand nicht angreifen. Tiere verlieren einen Angriff mit Pranke, Zähnen, Stachel usw.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 20,
"range": [
11,
30
],
"drawn": false
},
{
"_id": "IpRVlty1p1it0eMm",
"flags": {},
"type": 0,
"text": "Der Angreifer wird entwaffnet. Die Waffe fliegt vom Angreifer aus gesehen geradlinig um [[1d61]] m nach links. Bei waffenlosen Angriffen gibt es keine besonderen Auswirkungen.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [
31,
40
],
"drawn": false
},
{
"_id": "fh01DVN6rFKrTdcg",
"flags": {},
"type": 0,
"text": "Der Angreifer wird entwaffnet. Die Waffe fliegt nach rechts (s. 31-40).",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [
41,
50
],
"drawn": false
},
{
"_id": "k1rD7t7YnayTcV9P",
"flags": {},
"type": 0,
"text": "Der Angreifer wird entwaffnet. Die Waffe fliegt nach hinten (s. 31-40).",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [
51,
60
],
"drawn": false
},
{
"_id": "9WFBq8PAy1fFxe4I",
"flags": {},
"type": 0,
"text": "Der Angreifer stürzt zu Boden. Er ist vom Abwehrenden umgestoßen worden oder gestolpert. In einem Handgemenge treten keine besonderen Folgen auf.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 20,
"range": [
61,
80
],
"drawn": false
},
{
"_id": "u5kKsW1vnvWvF79s",
"flags": {},
"type": 0,
"text": "Der Angreifer wird leicht verwundet. Er verliert [[1d6]] AP.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 15,
"range": [
81,
95
],
"drawn": false
},
{
"_id": "gTvVtavg5GElh0pg",
"flags": {},
"type": 0,
"text": "Der Angreifer wird schwer verwundet. Er erleidet [[1d6]] schweren Schaden.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 4,
"range": [
96,
99
],
"drawn": false
},
{
"_id": "507Nvm6dWIlN8Ip1",
"flags": {},
"type": 0,
"text": "Der Angreifer verliert das Bewusstsein. Er stürzt zu Boden und kommt erst [[1d6]] Runden später wieder zu sich.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 1,
"range": [
100,
100
],
"drawn": false
}
],
"formula": "1d100",
"replacement": true,
"displayRoll": true,
"_id": "JOQf46Cj29MwcKsY"
}

View File

@ -1,133 +0,0 @@
{
"name": "Kritischer Fehler bei Angriffen",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"flags": {
"exportSource": {
"world": "midgard-test",
"system": "midgard5e",
"coreVersion": "0.7.9",
"systemVersion": 0.02
}
},
"img": "icons/svg/d20-grey.svg",
"description": "<h2>Tabelle 4: Kritische Fehler bei Angriffen</h2>",
"results": [
{
"_id": "dIX62PrnwNTY929l",
"flags": {},
"type": 0,
"text": "<h3>Keine besonderen Auswirkungen.</h3>",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [1, 10],
"drawn": false
},
{
"_id": "IgEkc7L4KlW745gH",
"flags": {},
"type": 0,
"text": "<h3>Der Angreifer verliert kurz das Gleichgewicht.</h3>Er braucht etwas Zeit, um wieder kampfbereit zu sein, und kann in der folgenden Runde nicht angreifen.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [11, 20],
"drawn": false
},
{
"_id": "lXeIddddllhBc5aj",
"flags": {},
"type": 0,
"text": "<h3>Der Angreifer lässt seine Waffe fallen.</h3>Sie fällt auf das Feld, auf dem er sich befi ndet. Fäuste, Pranken usw. werden leicht geprellt und können in der folgenden Runde nicht eingesetzt werden.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 15,
"range": [21, 35],
"drawn": false
},
{
"_id": "hNjE2KIIGCvgcBjf",
"flags": {},
"type": 0,
"text": "<h3>Die Angriffswaffe wird zerstört.</h3>Bei magischen Waffen wird 1W61 ([[1d6-1]])gewürfelt; die Waffe wird nur zerstört, wenn das Ergebnis über dem höheren der beiden magischen Bonuswerte für Angriff und Schaden liegt. Bei Angriffen mit Fäusten, Zähnen usw. wird der betreffende Körperteil geprellt und kann 10 min lang nicht eingesetzt werden.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 15,
"range": [36, 50],
"drawn": false
},
{
"_id": "2mW1vM6xy0emVwDM",
"flags": {},
"type": 0,
"text": "<h3>Der Angreifer verletzt sich selbst.</h3>Im Nahkampf und Handgemenge mit einer Waffe erleidet er durch seine Ungeschicklichkeit [[1d61]] schweren Schaden. Bei Angriffen mit der bloßen Hand und anderen natürlichen Waffen oder mit Wurfwaffen verliert der Angreifer [[1d61]] AP durch eine Muskel zerrung und kann eine Runde lang nicht angreifen. Bei einem Bogen- oder Armbrustschuss reißt die Sehne und verletzt den Schützen leicht ([[1d61]] AP Verlust). Sie kann in [[1d6+3]] Runden durch eine neue ersetzt werden.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 5,
"range": [51, 55],
"drawn": false
},
{
"_id": "bd5AxyNFZ2RQ7Aq0",
"flags": {},
"type": 0,
"text": "<h3>Der Angreifer trifft aus Versehen die nächststehende befreundete Person.</h3>Er fügt ihr [[1d61]] schweren Schaden zu. Befi ndet sich kein Gefährte in Reichweite, hat der Fehler keine Folgen. Kommen mehrere Personen als Opfer in Frage, wird eine von ihnen ausgewürfelt.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 5,
"range": [56, 60],
"drawn": false
},
{
"_id": "CY9a5ajPDQGns8CN",
"flags": {},
"type": 0,
"text": "<h3>Der Angreifer läuft in die Waffe des Gegners hinein.</h3>Der Angegriffene darf sofort außer der Reihe einen zusätzlichen EW:Angriff machen, der nicht abgewehrt werden darf.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [61, 70],
"drawn": false
},
{
"_id": "pVHTa2JuXutMDar7",
"flags": {},
"type": 0,
"text": "<h3>Der Angreifer verstaucht sich den Fuß.</h3>Seine Bewegungsweite verringert sich für [[2d6]] Runden um ein Drittel. Bei einem Schuss mit Bogen oder Armbrust schlägt die Sehne gegen den Arm des Abenteurers, der dadurch [[1d61]] AP verliert und eine Runde lang nicht schießen kann.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 20,
"range": [71, 90],
"drawn": false
},
{
"_id": "q4hhhMPXWJlmFMY7",
"flags": {},
"type": 0,
"text": "<h3>Der Angreifer stolpert und stürzt zu Boden.</h3>Bei Armbrust- oder Bogenschuss reißt stattdessen die Sehne und verletzt den Schützen leicht [[1d61]] AP Verlust - s. 51-55). Im Handgemenge hat dieser Wurf dieselben Folgen wie 71-90.<p>51-55</p><p>Der Angreifer trifft aus Versehen die nächststehende befreundete Person. Er fügt ihr [[1d61]] schweren Schaden zu. Befi ndet sich kein Gefährte in Reichweite, hat der Fehler keine Folgen. Kommen mehrere Personen als Opfer in Frage, wird eine von ihnen ausgewürfelt. </p><p>71-90</p><p>Der Angreifer verstaucht sich den Fuß.Seine Bewegungsweite verringert sich für [[2d6]] Runden um ein Drittel. Bei einem Schuss mit Bogen oder Armbrust schlägt die Sehne gegen den Arm des Abenteurers, der dadurch [[1d61]] AP verliert und eine Runde lang nicht schießen kann.</p>",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 9,
"range": [91, 99],
"drawn": false
},
{
"_id": "huSeP6mv8OeNYJDj",
"flags": {},
"type": 0,
"text": "<h3>Der Angreifer stürzt zu Boden und zerstört dabei seine Waffe</h3>. Bei einem Angriff mit natürlichen Waffen kann der betreffende Körperteil wie bei 36-50 10 min lang nicht eingesetzt werden. Bei einem Angriff mit Schusswaffen fällt der Abenteurer nicht hin.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 1,
"range": [100, 100],
"drawn": false
}
],
"formula": "1d100",
"replacement": true,
"displayRoll": true,
"_id": "sVgHbAxseIoeIMz8"
}

View File

@ -1,144 +0,0 @@
{
"name": "Kritischer Fehler bei der Abwehr",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"flags": {
"exportSource": {
"world": "midgard-test",
"system": "midgard5e",
"coreVersion": "0.7.9",
"systemVersion": 0.02
}
},
"img": "icons/svg/fire-shield.svg",
"description": "<h2>Tabelle 5: Kritischer Fehler bei der Abwehr</h2>",
"results": [
{
"_id": "Xdzk7cvwwnI2i18M",
"flags": {},
"type": 0,
"text": "<h3>Keine besonderen Auswirkungen.</h3>",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [1, 10],
"drawn": false
},
{
"_id": "8xuz2YsB90Z0KbLs",
"flags": {},
"type": 0,
"text": "<h3>Der Angegriffene verliert kurz das Gleichgewicht.</h3>Er braucht etwas Zeit, um wieder kampfbereit zu sein, und kann in der folgenden Runde nicht angreifen.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [11, 20],
"drawn": false
},
{
"_id": "gpzhwQyLX429zUz0",
"flags": {},
"type": 0,
"text": "<h3>Die Verteidigungswaffe ist zerstört.</h3>Benutzt der Abenteurer weder Schild noch Parierwaffe, hat dieser Wurf dieselben Folgen wie 81 - 90. Bei magischen Waffen wird 1W61 ([[1d6-1]]) gewürfelt; die Waffe wird nur zerstört, wenn das Ergebnis größer als ihr magischer Abwehrbonus ist.<p>81-90</p>Der Verteidiger prallt unglücklich mit seinem Gegner zusammen (Nahkampf und Handgemenge) oder gegen ein Hindernis (Fernkampf) und ist kurzzeitig benommen. Im Nahkampf oder Handgemenge kann er in der folgenden Runde weder angreifen noch abwehren. Sein Gegner leidet unter denselben Folgen - aber nur, wenn ihm ein PW:Gewandtheit misslingt. Im Fernkampf kann der Angegriffene wie bei 61-70 dem nächsten Schuss nicht ausweichen und darf außerdem in dieser und der folgenden Runde nicht mehr angreifen.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [21, 30],
"drawn": false
},
{
"_id": "Znrv6r6SHSBEclYd",
"flags": {},
"type": 0,
"text": "<h3>Der Angegriffene lässt seine Verteidigungswaffe fallen.</h3>Die Waffe fällt ihm zu Füßen. Benutzt er weder Schild noch Parierwaffe, hat dieser Wurf dieselben Folgen wie 41-50.<p>41-50</p>Der Verteidiger wird nach hinten gedrängt (Nahkampf), oder der Schwung seiner Ausweichbewegung reißt ihn mit (Fernkampf). Im Nahkampf bewegt sich der Angegriffene 1 m geradlinig vom Gegner weg, wenn ihn kein massives Hindernis daran hindert - selbst wenn er dadurch in ein Lagerfeuer oder einen Abgrund hineingerät. Der Angreifer kann sofort folgen und den Kontakt aufrechterhalten, wenn er will. Im Fernkampf bewegt sich der Angegriffene von seinem Standort aus um 1 m nach links (bei 1-2 mit [[1d6]]), nach rechts (bei 3-4), nach vorne (5) bzw. nach hinten (6), wenn ihn kein Hindernis daran hindert. Im Handgemenge hat der Wurf dieselben Folgen wie 51-60.<p>51-60</p>Die Sicht des Angegriffenen wird behindert. Er kann in der folgenden Runde nicht angreifen, da er Blut oder Schweiß aus den Augen wischen oder eine verrutschte Kopfbedeckung zurechtrücken muss.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [31, 40],
"drawn": false
},
{
"_id": "wLeOWz8B21WCkEwK",
"flags": {},
"type": 0,
"text": "<h3>Der Verteidiger wird nach hinten gedrängt (Nahkampf), oder der Schwung seiner Ausweichbewegung reißt ihn mit (Fernkampf).</h3>Im Nahkampf bewegt sich der Angegriffene 1 m geradlinig vom Gegner weg, wenn ihn kein massives Hindernis daran hindert - selbst wenn er dadurch in ein Lagerfeuer oder einen Abgrund hineingerät. Der Angreifer kann sofort folgen und den Kontakt aufrechterhalten, wenn er will. Im Fernkampf bewegt sich der Angegriffene von seinem Standort aus um 1 m nach links (bei 1-2 mit [[1d6]]), nach rechts (bei 3-4), nach vorne (5) bzw. nach hinten (6), wenn ihn kein Hindernis daran hindert. Im Handgemenge hat der Wurf dieselben Folgen wie 51-60.<p>51-60</p>Die Sicht des Angegriffenen wird behindert. Er kann in der folgenden Runde nicht angreifen, da er Blut oder Schweiß aus den Augen wischen oder eine verrutschte Kopfbedeckung zurechtrücken muss.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [41, 50],
"drawn": false
},
{
"_id": "OK1TzYWgPDqvBF6K",
"flags": {},
"type": 0,
"text": "<h3>Die Sicht des Angegriffenen wird behindert.</h3>Er kann in der folgenden Runde nicht angreifen, da er Blut oder Schweiß aus den Augen wischen oder eine verrutschte Kopfbedeckung zurechtrücken muss.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [51, 60],
"drawn": false
},
{
"_id": "jmWy6vH4NYiGghPE",
"flags": {},
"type": 0,
"text": "<h3>Der Verteidiger gibt sich eine Blöße.</h3>Im Nahkampf oder Handgemenge darf der Angreifer sofort außer der Reihe einen zusätzlichen EW:Angriff machen, der nicht abgewehrt werden darf. Im Fernkampf kann der Angegriffene dem nächsten Schuss oder Wurf (in der laufenden oder folgenden Runde, nicht aber später) nicht ausweichen und daher keinen WW:Abwehr würfeln.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [61, 70],
"drawn": false
},
{
"_id": "o6r0hJ0iufMsINa1",
"flags": {},
"type": 0,
"text": "<h3>Der Angegriffene verstaucht sich den Fuß.</h3>Die Bewegungsweite verringert sich für [[2d6]] Runden um ein Drittel.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [71, 80],
"drawn": false
},
{
"_id": "azc8c9daJPxkmg1P",
"flags": {},
"type": 0,
"text": "<h3>Der Verteidiger prallt unglücklich mit seinem Gegner zusammen (Nahkampf und Handgemenge) oder gegen ein Hindernis (Fernkampf) und ist kurzzeitig benommen.</h3>Im Nahkampf oder Handgemenge kann er in der folgenden Runde weder angreifen noch abwehren. Sein Gegner leidet unter denselben Folgen - aber nur, wenn ihm ein PW:Gewandtheit misslingt. Im Fernkampf kann der Angegriffene wie bei 61-70 dem nächsten Schuss nicht ausweichen und darf außerdem in dieser und der folgenden Runde nicht mehr angreifen.<p>61-70</p>Im Fernkampf kann der Angegriffene dem nächsten Schuss oder Wurf (in der laufenden oder folgenden Runde, nicht aber später) nicht ausweichen und daher keinen WW:Abwehr würfeln.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [81, 90],
"drawn": false
},
{
"_id": "fT5NKtySSqN8Yzlu",
"flags": {},
"type": 0,
"text": "<h3>Der Angegriffene rutscht aus und stürzt zu Boden.</h3>Im Handgemenge hat dieser Wurf dieselben Folgen wie 61-70.<p>61-70</p>Im Nahkampf oder Handgemenge darf der Angreifer sofort außer der Reihe einen zusätzlichen EW:Angriff machen, der nicht abgewehrt werden darf.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 9,
"range": [91, 99],
"drawn": false
},
{
"_id": "gxzElw6oBZTjj15Z",
"flags": {},
"type": 0,
"text": "<h3>Der Angegriffene stürzt und verliert das Bewusstsein.</h3>Er kommt nach [[1d6]] Runden wieder zu sich.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 1,
"range": [100, 100],
"drawn": false
}
],
"formula": "1d100",
"replacement": true,
"displayRoll": true,
"_id": "XKbuKI8F08WdFfWV"
}

View File

@ -1,210 +0,0 @@
{
"name": "Kritischer Schaden",
"permission": {
"default": 2,
"CBq5YXAqbO7HoJ03": 3
},
"flags": {
"exportSource": {
"world": "midgard-test",
"system": "midgard5e",
"coreVersion": "0.7.9",
"systemVersion": 0.02
}
},
"img": "icons/svg/d20-highlight.svg",
"description": "<h2>Tabelle 7: Kritischer Schaden</h2><h3>Die Folgen schwerer Verletzungen werden auf S. 63 (Kodex) beschrieben.\nEin Treffer hat besonders schwerwiegende Folgen (mit * markiert), wenn die Lebenspunkteverluste ein Drittel des LP-Maximums übersteigen. \nKostet ein kritischer Treffer das Opfer einschließlich der Zusatzschäden keine LP, richtet er keine längerfristigen Schädenan. Gliedmaßen (+) sind nur geprellt und nach 30 min wieder einsatzbereit. Ein Kopf- oder Wirbelsäulentreffer (++) macht nur wegen Schmerzen 30 min lang handlungsunfähig. Treffer im Gesicht/am Auge haben keine besonderen Auswirkungen.</h3>",
"results": [
{
"_id": "YXyhoVz5EAMuc05m",
"flags": {},
"type": 0,
"text": "<h3>normaler schwerer Schaden</h3>",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [1, 10],
"drawn": false
},
{
"_id": "jwBN8gCTqMgaPuc4",
"flags": {},
"type": 0,
"text": "<h3>kurzer SchockDas Opfer kann durch den Schock der Verwundung eine Runde lang nicht angreifen.</h3>",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [11, 20],
"drawn": false
},
{
"_id": "g1zQk3AHDdlq3sqH",
"flags": {},
"type": 0,
"text": "<h3>Rumpftreffer mit Rippenbrüchen</h3>[[1d3]] Rippen des Opfers brechen.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 10,
"range": [21, 30],
"drawn": false
},
{
"_id": "XdF7xn83ChS4Qrzf",
"flags": {},
"type": 0,
"text": "<h3>Rumpftreffer mit Gefahr innerer Verletzungen</h3>Das Opfer verliert zusätzlich zum normalen Schaden [[1d6]] LP und AP.<br /><b>*</b>: Schwere innere Verletzungen",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 5,
"range": [31, 35],
"drawn": false
},
{
"_id": "UjqhkUyUaBZ7n6CC",
"flags": {},
"type": 0,
"text": "<h3>schwere Verletzung der Wirbelsäule <b>++</b></h3>Nur ein wuchtiger Hieb, z.B. mit einer Schlagwaffe, einer zweihändigen Hiebwaffe, einem Morgenstern, einem Kampfstab oder mit einer Pranke, richtet diese Art von kritischem Schaden an. Treffer mit anderen Waffen verursachen normalen schweren Schaden.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 5,
"range": [36, 40],
"drawn": false
},
{
"_id": "W7yzr5lC0z5NDt77",
"flags": {},
"type": 0,
"text": "<h3>schwere Verletzung am rechten Arm <b>+</b></h3><b>*</b>: Mit 20% wird der Arm abgetrennt (bei einer Waffe mit Schneide) oder dauerhaft verkrüppelt. Mit Armschutz führt auch der Treffer mit einer scharfen Waffe nicht zum Abtrennen, sondern nur zur Verkrüppelung des Armes. Treffer mit Stich-, Wurf- oder Schusswaffen haben keine derart schwerwiegenden Auswirkungen.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 7,
"range": [41, 47],
"drawn": false
},
{
"_id": "1dFkXxy7VhtSbahw",
"flags": {},
"type": 0,
"text": "<h3>schwere Verletzung am linken Arm <b>+</b></h3><b>*</b>: Mit 20% wird der Arm abgetrennt (bei einer Waffe mit Schneide) oder dauerhaft verkrüppelt. Mit Armschutz führt auch der Treffer mit einer scharfen Waffe nicht zum Abtrennen, sondern nur zur Verkrüppelung des Armes. Treffer mit Stich-, Wurf- oder Schusswaffen haben keine derart schwerwiegenden Auswirkungen.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 8,
"range": [48, 55],
"drawn": false
},
{
"_id": "CiAwKT1ZhOGKplBr",
"flags": {},
"type": 0,
"text": "<h3>schwere Verletzung am rechten Bein <b>+</b></h3><b>*</b>: Mit 20% wird das Bein abgetrennt (ohne Beinschutz bei einer Waffe mit Schneide) oder dauerhaft verkrüppelt. Treffer mit Stich-, Wurf- oder Schusswaffen haben keine derart schwerwiegenden Auswirkungen.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 9,
"range": [56, 64],
"drawn": false
},
{
"_id": "PZa6plWsSiQFmu5c",
"flags": {},
"type": 0,
"text": "<h3>schwere Verletzung am linken Bein <b>+</b></h3><b>*</b>: Mit 20% wird das Bein abgetrennt (ohne Beinschutz bei einer Waffe mit Schneide) oder dauerhaft verkrüppelt. Treffer mit Stich-, Wurf- oder Schusswaffen haben keine derart schwerwiegenden Auswirkungen.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 9,
"range": [65, 73],
"drawn": false
},
{
"_id": "5xXKfpkaOap9WV0o",
"flags": {},
"type": 0,
"text": "<h3>schwerer Kopftreffer <b>++</b></h3>Helmlose Opfer verlieren zusätzlich zum normalen Schaden [[1d3]] LP und AP.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 7,
"range": [74, 80],
"drawn": false
},
{
"_id": "5OTWkWQxchPs6SQI",
"flags": {},
"type": 0,
"text": "<h3>Treffer im Gesicht</h3>Das Aussehen des Getroffenen sinkt durch eine entstellende Narbe dauerhaft um ein Zehntel (mindestens aber um 1). Der Träger eines Helms mit Visier ist vor dieser Art von Schaden sicher.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 5,
"range": [81, 85],
"drawn": false
},
{
"_id": "GaZZENfKk81MI1IK",
"flags": {},
"type": 0,
"text": "<h3>Kopftreffer mit Hörschaden <b>&lt;++&gt;</b></h3>Helmlose Opfer verlieren zusätzlich zum normalen Schaden [[1d3]] LP und AP. Zusätzlich schwere Verletzung am Ohr. Helmträger sind vor dieser Art von Schaden sicher.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 4,
"range": [86, 89],
"drawn": false
},
{
"_id": "OsfxiUi4dg0RM9XV",
"flags": {},
"type": 0,
"text": "<h3>Augenverletzung</h3>Der Träger eines Helms mit Visier ist vor dieser Art von Schaden sicher.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 4,
"range": [90, 93],
"drawn": false
},
{
"_id": "TGtUlGPANVjZLgZH",
"flags": {},
"type": 0,
"text": "<h3>Halstreffer</h3><b>*</b>: Eine spitze oder scharfe Waffe verletzt die Halsschlagader. Eine stumpfe Waffe verursacht eine schwere Halswirbelverletzung.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 3,
"range": [94, 96],
"drawn": false
},
{
"_id": "98WnvS1A35Vr0rOv",
"flags": {},
"type": 0,
"text": "<h3>schwere Schädelverletzung <b>++</b></h3>Helmlose Opfer verlieren zusätzlich zum normalen Schaden [[1d6]] LP und AP. Fällt das Opfer ins Koma, sinkt seine Intelligenz durch Hirnschäden dauerhaft um ein Zehntel (mindestens aber um 1).",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 1,
"range": [97, 97],
"drawn": false
},
{
"_id": "8g1FJIsxKFVWvyxe",
"flags": {},
"type": 0,
"text": "<h3>Augenverlust</h3>Bei einem Treffer mit einer scharfen oder spitzen Waffe oder einer Schusswaffe verliert das Opfer ein Auge. Der Träger eines Helms mit Visier ist vor dieser Art von Schaden sicher.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 2,
"range": [98, 99],
"drawn": false
},
{
"_id": "U1SXJI4yzfzcQM01",
"flags": {},
"type": 0,
"text": "<h3>tödlicher Treffer</h3>Ein Treffer ins Herz, an der Kehle usw. tötet den Getroffenen augenblicklich.",
"img": "icons/svg/d20-black.svg",
"resultId": "",
"weight": 1,
"range": [100, 100],
"drawn": false
}
],
"formula": "1d100",
"replacement": true,
"displayRoll": true,
"_id": "cQX6GAYWErokE8ks"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,9 +1,9 @@
import assert from "assert";
import assert from "assert"
export default {
name: "midgard5e",
name: "midgard5",
isModule: false, // If you are developing a system rather than a module, change this to false
};
}
// Pop some fairly universal types that we might use

View File

@ -1,20 +1,30 @@
import Globals from "./Globals"
import Globals from "./Globals";
const preloadTemplates = async (): Promise<Handlebars.TemplateDelegate<any>[]> => {
const rootPath = `${Globals.isModule ? "modules" : "systems"}/${Globals.name}/templates/`
const rootPath = `${Globals.isModule ? "modules" : "systems"}/${Globals.name}/templates/`;
// Place relative paths in array below, e.g.:
// const templates = [ rootPath + "actor/actor-sheet.hbs" ]
// This would map to our local folder of /Assets/Templates/Actor/actor-sheet.hbs
const templates: Array<string> = [
"sheets/character/description.hbs",
"sheets/character/attribute.hbs",
"sheets/character/base_values.hbs",
"sheets/character/main.hbs",
"sheets/character/skills.hbs",
"sheets/character/gear.hbs",
"sheets/character/spells.hbs",
"sheets/character/combat.hbs",
"sheets/character/effects.hbs",
"sheets/npc/main.hbs",
"sheets/npc/combat.hbs",
"sheets/npc/properties.hbs",
"sheets/npc/description.hbs",
"sheets/npc/attribute.hbs",
"sheets/partial/mod.hbs",
"sheets/item/rolls.hbs",
"chat/roll-m5.hbs"
]
return loadTemplates(templates.map(s => rootPath + s))
}
"chat/roll-m5.hbs",
];
return loadTemplates(templates.map((s) => rootPath + s));
};
export default preloadTemplates
export default preloadTemplates;

114
source/helpers.ts Normal file
View File

@ -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);
});
};

View File

@ -2,84 +2,18 @@ import Logger from "./utils/Logger";
import M5CharacterSheet from "./module/sheets/M5CharacterSheet";
import preloadTemplates from "./PreloadTemplates";
import { M5Character } from "./module/actors/M5Character";
import { M5Skill } 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) => {
//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/midgard5e/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;
});
// Load settings into Foundry
loadSettings();
// Default Sheet für Items definieren und das Standardsheet deaktivieren
Items.unregisterSheet("core", ItemSheet);
@ -91,15 +25,179 @@ Hooks.once("init", async () => {
CONFIG.Actor.documentClass = M5Character;
CONFIG.Item.documentClass = M5Item;
//RegisterSettings();
await preloadTemplates();
loadHelpers();
});
Hooks.once("setup", () => {
Logger.log("Template module is being setup.");
});
Hooks.on("getChatLogEntryContext", function (html, options) {
options.push(
{
name: "LP & AP Schaden",
icon: '<i class="fas fa-tint"></i>',
condition: (li) => {
const damageRolls = li.find(".damage").length;
// All must be true to show the reroll dialogue
return (game["user"].character || game["canvas"].tokens.controlled) && damageRolls > 0;
},
callback: (li) => applyDamage(li, 2),
},
{
name: "AP Schaden",
icon: '<i class="fas fa-shield-alt"></i>',
condition: (li) => {
const damageRolls = li.find(".damage").length;
// All must be true to show the reroll dialogue
return (game["user"].character || game["canvas"].tokens.controlled) && damageRolls > 0;
},
callback: (li) => applyDamage(li, 1),
},
{
name: "LP & AP Heilen",
icon: '<i class="fas fa-heart"></i>',
condition: (li) => {
const damageRolls = li.find(".heal").length;
// All must be true to show the reroll dialogue
return (game["user"].character || game["canvas"].tokens.controlled) && damageRolls > 0;
},
callback: (li) => applyDamage(li, -1),
},
{
name: "AP Heilen",
icon: '<i class="far fa-heart"></i>',
condition: (li) => {
const damageRolls = li.find(".heal").length;
// All must be true to show the reroll dialogue
return (game["user"].character || game["canvas"].tokens.controlled) && damageRolls > 0;
},
callback: (li) => applyDamage(li, -2),
},
{
name: "Redo",
icon: '<i class="far fa-arrow-rotate-left"></i>',
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),
}
);
});
Hooks.on("updateCombat", function (combat: Combat, updateData: { round: number; turn: number }, updateOptions: { advanceTime: number; direction: number }) {
if (combat.round % 2 === 0 && combat.turn !== null) {
const tokenId = combat.current.tokenId;
const actorId = combat.combatant["actorId"];
let currentToken = game["actors"].tokens[tokenId];
if (!currentToken) {
currentToken = game["actors"].get(actorId);
}
let activeEffects = currentToken.items.filter((x) => x.type === "effect" && x.system.equipped) || [];
activeEffects.forEach((effect) => {
if (effect.system?.duration?.time > 0) {
if (effect.system.duration.unit === M5TimeUnit.ROUND) {
effect.system.duration.time -= 1;
}
}
if (effect.system?.duration.time === 0 && effect.system.duration.unit !== M5TimeUnit.LIMITLESS) {
effect.system.equipped = false;
}
for (const key in effect.system.mods) {
if (effect.system.mods[key].operation === M5ModOperation.SUBTRACT) {
switch (effect.system.mods[key].id) {
case "lp":
currentToken["system"].lp.value -= effect.system.mods[key].value;
break;
case "ap":
currentToken["system"].ap.value -= effect.system.mods[key].value;
break;
}
} else if (effect.system.mods[key].operation === M5ModOperation.ADD) {
switch (effect.system.mods[key].id) {
case "lp":
currentToken["system"].lp.value += limitHeal(effect.system.mods[key].value, currentToken["system"].lp.value, currentToken["system"].lp.max);
break;
case "ap":
currentToken["system"].ap.value += limitHeal(effect.system.mods[key].value, currentToken["system"].ap.value, currentToken["system"].ap.max);
break;
}
}
}
});
currentToken.render();
}
});
Hooks.on("renderCombatTracker", (combatTracker, html, context) => {
if (context.combat === null) {
html.find("h3.encounter-title")[0].innerHTML = game["i18n"].localize("midgard5.no-encounter");
} else if (Math.ceil(context.round / 2) === 0) {
html.find("h3.encounter-title")[0].innerHTML = game["i18n"].localize("midgard5.encounter-not-started");
} else {
html.find("h3.encounter-title")[0].innerHTML =
(context.round % 2 == 1 ? game["i18n"].localize("midgard5.phase-movement") : game["i18n"].localize("midgard5.phase-action")) + " " + Math.ceil(context.round / 2);
}
});
Hooks.once("ready", () => {
Logger.ok("Template module is now ready.");
});
async function applyDamage(roll, direction) {
const damageValue = Array.from(roll.find(".apply") as HTMLElement[])
.map((x) => Math.max(0, Number(x.innerText)))
.reduce((prev, curr) => prev + curr, 0);
const controlledTokens = game["canvas"].tokens.controlled;
const actor = game["user"].character;
if (controlledTokens) {
controlledTokens.forEach((controlledToken) => {
let token = controlledToken.document.delta.syntheticActor;
switch (direction) {
case 2:
token["system"].lp.value -= Math.max(0, damageValue - token["system"].calc.stats.lpProtection.value);
case 1:
token["system"].ap.value -= Math.max(0, damageValue - token["system"].calc.stats.apProtection.value);
break;
case -1:
token["system"].lp.value += limitHeal(damageValue, token["system"].lp.value, token["system"].lp.max);
case -2:
token["system"].ap.value += limitHeal(damageValue, token["system"].ap.value, token["system"].ap.max);
}
token.render();
});
} else {
switch (direction) {
case 2:
actor["system"].lp.value -= Math.max(0, damageValue - actor["system"].calc.stats.lpProtection.value);
case 1:
actor["system"].ap.value -= Math.max(0, damageValue - actor["system"].calc.stats.apProtection.value);
break;
case -1:
actor["system"].lp.value += limitHeal(damageValue, actor["system"].lp.value, actor["system"].lp.max);
case -2:
actor["system"].ap.value += limitHeal(damageValue, actor["system"].ap.value, actor["system"].ap.max);
}
actor.render();
}
}
function limitHeal(heal: number, current: number, max: number): number {
if (current === max) {
return 0;
} else if (heal + current > max) {
return max - current;
}
return heal;
}

View File

@ -1,52 +1,72 @@
import { BooleanField } from "@league-of-foundry-developers/foundry-vtt-types/src/foundry/common/data/fields.mjs"
import { BooleanField } from "@league-of-foundry-developers/foundry-vtt-types/src/foundry/common/data/fields.mjs";
export interface M5Skill {
fw: number
attribute: string
pp: number
fw: number;
attribute: string;
pp: number;
}
export interface M5SkillUnlearned extends M5Skill {
initial: number
initial: number;
}
export interface M5SkillLearned extends M5Skill {
skill: string
type: string
skill: string;
type: string;
}
export interface M5SkillCalculated extends M5Skill {
label: string,
calc: any
label: string;
calc: any;
}
export interface M5Attribute {
value: number
bonus: number
value: number;
bonus: number;
}
export interface M5RollData {
c: any
i: any
iType: string
rolls: {}
c: any;
i: any;
b: any;
iType: string;
rolls: any;
res: {
label: string
}
label: string;
};
}
export interface M5RollTemplate {
formula: string
label: string
enabled: boolean
formula: string;
label: string;
enabled: boolean;
}
export interface M5RollResult extends M5RollTemplate {
total: number
totalStr: string
result: string
dice: {}
css: string
total: number;
totalStr: string;
result: string;
dice: {};
css: string;
}
export enum M5ItemType {
SKILL = "skill",
ITEM = "item",
WEAPON = "weapon",
DEFENSIVE_WEAPON = "defensiveWeapon",
ARMOR = "armor",
CONTAINER = "container",
SPELL = "spell",
KAMPFKUNST = "kampfkunst",
EFFECT = "effect",
}
export enum M5SkillType {
INNATE = "innate",
GENERAL = "general",
LANGUAGE = "language",
COMBAT = "combat",
}
export enum M5EwResult {
@ -55,7 +75,7 @@ export enum M5EwResult {
CRITICAL = "roll-ew-result-critical",
HIGH = "roll-ew-result-high",
FAIL = "roll-ew-result-fail",
PASS = "roll-ew-result-pass"
PASS = "roll-ew-result-pass",
}
export enum M5Attributes {
@ -67,7 +87,7 @@ export enum M5Attributes {
ZT = "zt",
AU = "au",
PA = "pa",
WK = "wk"
WK = "wk",
}
export enum M5Stats {
@ -81,96 +101,130 @@ export enum M5Stats {
BRAWL = "brawl",
POISON_RESISTANCE = "poisonResistance",
LP = "lp",
AP = "ap"
AP = "ap",
PROTECTION_LP = "lpProtection",
PROTECTION_AP = "apProtection",
DEPRIVATION_COLD = "deprivationCold",
DEPRIVATION_HEAT = "deprivationHeat",
DEPRIVATION_FOOD = "deprivationFood",
}
export enum M5ModType {
ATTRIBUTE = "attribute",
STAT = "stat",
SKILL = "skill"
SKILL = "skill",
}
export enum M5ModOperation {
ADD_100 = "add100",
ROLL = "roll",
ADD = "add",
SET = "set",
FIXED = "fixed"
FIXED = "fixed",
MULTIPLY = "multiply",
SUBTRACT = "subtract",
DIVISION = "division",
}
export enum M5TimeUnit {
ROUND = "round",
MINUTE = "minute",
HOUR = "hour",
LIMITLESS = "limitless",
}
export interface M5ItemMod {
type: M5ModType
id: string
operation: M5ModOperation
value: number
type: M5ModType;
id: string;
operation: M5ModOperation;
value: number;
}
export interface M5ModPair {
mod: M5ItemMod
source: string
mod: M5ItemMod;
source: string;
}
export interface M5ModSource {
item: string
operation: M5ModOperation
value: number
item: string;
operation: M5ModOperation;
value: number;
}
export interface M5ModResult {
mods: Array<M5ModSource>
value: number
mods: Array<M5ModSource>;
value: number;
}
export interface M5AttributeCalculated extends M5ModResult {
bonus: number
bonus: number;
}
export interface M5CharacterCalculatedData {
level: number
level: number;
movement: number;
attributes: {
st: M5AttributeCalculated
gs: M5AttributeCalculated
gw: M5AttributeCalculated
ko: M5AttributeCalculated
in: M5AttributeCalculated
zt: M5AttributeCalculated
au: M5AttributeCalculated
pa: M5AttributeCalculated
wk: M5AttributeCalculated
}
st: M5AttributeCalculated;
gs: M5AttributeCalculated;
gw: M5AttributeCalculated;
ko: M5AttributeCalculated;
in: M5AttributeCalculated;
zt: M5AttributeCalculated;
au: M5AttributeCalculated;
pa: M5AttributeCalculated;
wk: M5AttributeCalculated;
};
stats: {
lp: M5ModResult
ap: M5ModResult
armor: number
defense: M5ModResult
damageBonus: M5ModResult
attackBonus: M5ModResult
defenseBonus: M5ModResult
movementBonus: M5ModResult
resistanceMind: M5ModResult
resistanceBody: M5ModResult
spellCasting: M5ModResult
brawl: M5ModResult
brawlEw: number
poisonResistance: M5ModResult
enduranceBonus: number
}
skillMods: {}
lp: M5ModResult;
ap: M5ModResult;
lpProtection: M5ModResult;
apProtection: M5ModResult;
defense: M5ModResult;
damageBonus: M5ModResult;
attackBonus: M5ModResult;
defenseBonus: M5ModResult;
movement: M5ModResult;
resistanceMind: M5ModResult;
resistanceBody: M5ModResult;
spellCasting: M5ModResult;
brawl: M5ModResult;
brawlFw: number;
poisonResistance: M5ModResult;
enduranceBonus: number;
deprivationCold: M5ModResult;
deprivationHeat: M5ModResult;
deprivationFood: M5ModResult;
hoard: number;
hoardNext: number;
hoardMin: number;
wealth: number;
load: number;
heavyLoad: number;
loadMax: number;
thrustLoad: number;
encumbrance: number;
};
skillMods: {};
skills: {
innate: {}
general: {}
combat: {}
language: {}
custom: {}
}
innate: {};
general: {};
combat: {};
language: {};
custom: {};
};
gear: {
weapons: {}
defensiveWeapons: {}
armor: {}
items: {}
}
spells: {}
weapons: {};
defensiveWeapons: {};
armor: {};
items: {};
containers: {};
effects: {};
};
spells: {};
kampfkuenste: {};
}
export function enumKeys<O extends object, K extends keyof O = keyof O>(obj: O): K[] {
return Object.keys(obj).filter(k => Number.isNaN(+k)) as K[]
return Object.keys(obj).filter((k) => Number.isNaN(+k)) as K[];
}

View File

@ -1,7 +1,6 @@
import { M5Item } from "../items/M5Item";
import { M5Attribute, M5CharacterCalculatedData, M5ItemMod, M5ModOperation, M5ModResult, M5RollData, M5Skill, M5SkillCalculated, M5SkillLearned } from "../M5Base";
import { M5Attribute, M5CharacterCalculatedData, M5ItemMod, M5ItemType, M5ModOperation, M5ModResult, M5RollData, M5Skill, M5SkillCalculated } from "../M5Base";
import M5ModAggregate from "./M5ModAggregate";
export class M5Character extends Actor {
// constructor(
// data: ConstructorParameters<typeof foundry.documents.BaseActor>[0],
@ -24,7 +23,67 @@ export class M5Character extends Actor {
return -2;
}
derivedData(skip: { mods?: boolean; skills?: boolean; weapons?: boolean; defensiveWeapons?: boolean; armor?: boolean; items?: boolean; spells?: boolean } = {}): M5CharacterCalculatedData {
static loadValue(attribute: M5Attribute) {
const value = this.attributeMinMax(attribute);
if (value > 99) return 35;
if (value > 95) return 30;
if (value > 80) return 25;
if (value > 60) return 20;
if (value > 30) return 15;
if (value > 10) return 10;
if (value > 0) return 5;
return 0;
}
static heavyLoadValue(attribute: M5Attribute) {
const value = this.attributeMinMax(attribute);
if (value > 99) return 50;
if (value > 95) return 45;
if (value > 80) return 40;
if (value > 60) return 35;
if (value > 30) return 30;
if (value > 10) return 25;
if (value > 0) return 20;
return 0;
}
static maxLoadValue(attribute: M5Attribute) {
const value = this.attributeMinMax(attribute);
if (value > 99) return 90;
if (value > 95) return 80;
if (value > 80) return 75;
if (value > 60) return 70;
if (value > 30) return 60;
if (value > 10) return 50;
if (value > 0) return 40;
return 0;
}
static thrustLoadValue(attribute: M5Attribute) {
const value = this.attributeMinMax(attribute);
if (value > 99) return 200;
if (value > 95) return 170;
if (value > 80) return 150;
if (value > 60) return 140;
if (value > 30) return 120;
if (value > 10) return 70;
if (value > 0) return 50;
return 0;
}
derivedData(
skip: {
mods?: boolean;
skills?: boolean;
items?: boolean;
spells?: boolean;
effects?: boolean;
containers?: boolean;
kampfkuenste?: boolean;
encumbrance?: boolean;
class?: boolean;
} = {}
): M5CharacterCalculatedData {
let ret: M5CharacterCalculatedData = {
level: 0,
attributes: {
@ -41,19 +100,29 @@ export class M5Character extends Actor {
stats: {
lp: { value: 0, mods: [] },
ap: { value: 0, mods: [] },
armor: 0,
lpProtection: { value: 0, mods: [] },
apProtection: { value: 0, mods: [] },
defense: { value: 0, mods: [] },
damageBonus: { value: 0, mods: [] },
attackBonus: { value: 0, mods: [] },
defenseBonus: { value: 0, mods: [] },
movementBonus: { value: 0, mods: [] },
movement: { value: 0, mods: [] },
resistanceMind: { value: 0, mods: [] },
resistanceBody: { value: 0, mods: [] },
spellCasting: { value: 0, mods: [] },
brawl: { value: 0, mods: [] },
brawlEw: 0,
brawlFw: 0,
poisonResistance: { value: 0, mods: [] },
enduranceBonus: 0,
deprivationCold: { value: 0, mods: [] },
deprivationHeat: { value: 0, mods: [] },
deprivationFood: { value: 0, mods: [] },
hoard: 0,
encumbrance: 0,
load: 0,
heavyLoad: 0,
thrustLoad: 0,
loadMax: 0,
},
skillMods: {},
skills: {
@ -68,8 +137,11 @@ export class M5Character extends Actor {
defensiveWeapons: {},
armor: {},
items: {},
containers: {},
effects: {},
},
spells: {},
kampfkuenste: {},
} as M5CharacterCalculatedData;
const context = this as any;
@ -78,8 +150,9 @@ export class M5Character extends Actor {
const data = (this as any).system;
if (!data) return null;
ret.level = M5Character.levelFromExp(data.es);
ret.level = M5Character.levelFromExp(data.info.race === "Zwerg" ? Math.min(data.calc.stats?.hoard * 2 || 0, data.es) : data.es);
//Set all values that are not dependent on another Value
ret.attributes.st.value = M5Character.attributeMinMax(data.attributes.st); // TODO item effects
ret.attributes.gs.value = M5Character.attributeMinMax(data.attributes.gs);
ret.attributes.gw.value = M5Character.attributeMinMax(data.attributes.gw);
@ -102,29 +175,23 @@ export class M5Character extends Actor {
ret.stats.lp = this.modResult(data.lp);
ret.stats.ap = this.modResult(data.ap);
ret.stats.armor = 0;
ret.stats.defense = this.modResult(M5Character.defenseFromLevel(ret.level));
ret.stats.damageBonus = this.modResult(Math.floor(ret.attributes.st.value / 20) + Math.floor(ret.attributes.gs.value / 30) - 3);
ret.stats.attackBonus = this.modResult(ret.attributes.gs.bonus);
ret.stats.defenseBonus = this.modResult(ret.attributes.gw.bonus);
ret.stats.movementBonus = this.modResult(0);
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.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.brawlEw = ret.stats.brawl.value + ret.stats.attackBonus.value;
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.lpProtection = this.modResult(0);
ret.stats.apProtection = this.modResult(0);
ret.stats.movement = this.modResult(data.movement);
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(10));
ret.stats.hoard = 0;
ret.stats.encumbrance = 0;
if (!skip?.mods) {
const aggregate = new M5ModAggregate(data, ret);
context.items
?.filter((item) => item.type === "item")
?.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)
@ -137,9 +204,49 @@ export class M5Character extends Actor {
ret.skillMods = aggregate.calculate();
}
if (!skip?.items) {
ret.stats.defense = this.modResult(M5Character.defenseFromLevel(ret.level));
ret.stats.damageBonus = this.modResult(Math.floor(ret.attributes.st.value / 20) + Math.floor(ret.attributes.gs.value / 30) - 3);
ret.stats.attackBonus = this.modResult(ret.attributes.gs.bonus);
ret.stats.defenseBonus = this.modResult(ret.attributes.gw.bonus);
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.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.load = M5Character.loadValue(data.attributes.st);
ret.stats.heavyLoad = M5Character.heavyLoadValue(data.attributes.st);
ret.stats.loadMax = M5Character.maxLoadValue(data.attributes.st);
ret.stats.thrustLoad = M5Character.thrustLoadValue(data.attributes.st);
if (!skip?.mods) {
const aggregate = new M5ModAggregate(data, ret);
context.items
?.filter((item) => item.type === "item")
?.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)
Object.keys(mods).forEach((modIndex) => {
const mod = mods[modIndex] as M5ItemMod;
aggregate.push(mod, item.name);
});
});
ret.skillMods = aggregate.calculate();
}
if (!skip?.containers) {
context.items
?.filter((item) => item.type === "container")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
@ -148,33 +255,93 @@ export class M5Character extends Actor {
label += "*";
}
ret.gear.items[item.id] = {
let icon = item.img;
let rollable = false;
for (let key in item.system.rolls.formulas) {
rollable = item.system.rolls.formulas[key]?.enabled;
if (rollable) {
break;
}
}
ret.gear.containers[item.id] = {
label: label,
icon: icon,
magic: item.system.magic,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
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,
rollExist: rollable,
};
});
}
if (!skip?.skills) {
if (!skip?.items) {
context.items
?.filter((item) => item.type === "skill")
?.filter((item) => item.type === "item")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
const skillMap = ret.skills[item.system.type];
skillMap[item.id] = {
label: item.name,
fw: item.system.fw,
attribute: item.system.attribute,
pp: item.system.pp,
calc: item.system.calc,
} as M5SkillCalculated;
});
}
if (!skip?.weapons) {
let label = item.name;
if (item.system.magic) {
label += "*";
}
if (item.system.valuable) {
ret.stats.wealth += parseFloat(this.calculateValue(item.system.value * item.system.quantity, item.system.currency).toPrecision(3));
}
if (item.system.hoarded) {
ret.stats.hoard += parseFloat(this.calculateValue(item.system.value * item.system.quantity, item.system.currency).toPrecision(3));
}
if (!!item.system.containerId) {
ret.gear.containers[item.system.containerId].weight += parseFloat((item.system.weight * item.system.quantity).toPrecision(4));
ret.gear.containers[item.system.containerId].value += parseFloat(this.calculateValue(item.system.value * item.system.quantity, item.system.currency).toPrecision(3));
if (ret.gear.containers[item.system.containerId].equipped) {
ret.stats.encumbrance += item.system.weight * item.system.quantity;
}
} else if (item.system.equipped) {
ret.stats.encumbrance += item.system.weight * item.system.quantity;
}
let icon = item.img;
let rollable = false;
// console.log(item.system.rolls.formulas.map((p) => p.enabled));
for (let key in item.system.rolls.formulas) {
rollable = item.system.rolls.formulas[key]?.enabled;
if (rollable) {
break;
}
}
ret.gear.items[item.id] = {
label: label,
icon: icon,
magic: item.system.magic,
abw: item.system.abw || 0,
calc: item.system.calc,
equipped: item.system?.equipped,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
weight: item.system.weight || 0,
containerId: item.system.containerId || "",
value: item.system.value || 0,
currency: item.system.currency || "",
quantity: item.system.quantity || 0,
rollExist: rollable,
};
});
context.items
?.filter((item) => item.type === "weapon")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
@ -189,19 +356,43 @@ export class M5Character extends Actor {
item.system.stats.damageBonus +
")";
}
if (item.system.valuable) {
ret.stats.wealth += this.calculateValue(item.system.value * item.system.quantity, item.system.currency);
}
if (item.system.hoarded) {
ret.stats.hoard += this.calculateValue(item.system.value * item.system.quantity, item.system.currency);
}
if (!!item.system.containerId) {
ret.gear.containers[item.system.containerId].weight += item.system.weight;
if (ret.gear.containers[item.system.containerId].equipped) {
ret.stats.encumbrance += item.system.weight;
}
} else if (item.system.equipped) {
ret.stats.encumbrance += item.system.weight || 0;
}
ret.gear.weapons[item.id] = {
label: label,
icon: item.img,
skillId: item.system.skillId,
magic: item.system.magic,
abw: item.system.abw || 0,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
value: item.system.value || 0,
currency: item.system.currency || "",
calc: item.system.calc,
special: item.system.special,
damageBase: item.system.damageBase,
equipped: item.system?.equipped,
weight: item.system.weight || 0,
containerId: item.system.containerId || "",
};
});
}
if (!skip?.defensiveWeapons) {
context.items
?.filter((item) => item.type === "defensiveWeapon")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
@ -209,19 +400,108 @@ export class M5Character extends Actor {
if (item.system.magic) {
label += "*(" + (item.system.stats.defenseBonus < 0 ? "" : "+") + item.system.stats.defenseBonus + ")";
}
if (item.system.valuable) {
ret.stats.wealth += this.calculateValue(item.system.value * item.system.quantity, item.system.currency);
}
if (item.system.hoarded) {
ret.stats.hoard += this.calculateValue(item.system.value * item.system.quantity, item.system.currency);
}
if (!!item.system.containerId) {
ret.gear.containers[item.system.containerId].weight += item.system.weight;
if (ret.gear.containers[item.system.containerId].equipped) {
ret.stats.encumbrance += item.system.weight;
}
} else if (item.system.equipped) {
ret.stats.encumbrance += item.system.weight || 0;
}
ret.gear.defensiveWeapons[item.id] = {
label: label,
icon: item.img,
skillId: item.system.skillId,
magic: item.system.magic,
abw: item.system.abw || 0,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
value: item.system.value || 0,
currency: item.system.currency || "",
defenseBonus: item.system.stats.defenseBonus,
calc: item.system.calc,
equipped: item.system?.equipped,
weight: item.system.weight || 0,
containerId: item.system.containerId || "",
};
});
context.items
?.filter((item) => item.type === "armor")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
let label = item.name;
if (item.system.magic) {
label += "*";
}
if (item.system.valuable) {
ret.stats.wealth += this.calculateValue(item.system.value * item.system.quantity, item.system.currency);
}
if (item.system.hoarded) {
ret.stats.hoard += this.calculateValue(item.system.value * item.system.quantity, item.system.currency);
}
if (!!item.system.containerId) {
ret.gear.containers[item.system.containerId].weight += item.system.weight;
if (ret.gear.containers[item.system.containerId].equipped) {
ret.stats.encumbrance += item.system.weight;
}
} else if (item.system.equipped) {
ret.stats.encumbrance += 0;
} else {
ret.stats.encumbrance += item.system.weight || 0;
}
ret.gear.armor[item.id] = {
label: label,
icon: item.img,
magic: item.system.magic,
abw: item.system.abw || 0,
valuable: item.system?.valuable,
hoarded: item.system?.hoarded,
value: item.system.value || 0,
currency: item.system.currency || "",
lpProtection: item.system.lpProtection,
calc: item.system.calc,
equipped: item.system?.equipped,
weight: item.system.weight || 0,
containerId: item.system.containerId || "",
};
});
}
if (!skip?.armor) {
if (!skip?.class) {
context.items
?.filter((item) => item.type === "armor")
?.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 (typeof data.info.class === "string") {
data.info.class = {};
}
data.info.class[item.id] = item.name;
});
}
if (!skip?.effects) {
context.items
?.filter((item) => item.type === "effect")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
@ -230,24 +510,73 @@ export class M5Character extends Actor {
label += "*";
}
ret.gear.armor[item.id] = {
ret.gear.effects[item.id] = {
label: label,
icon: item.img,
magic: item.system.magic,
calc: item.system.calc,
equipped: item.system?.equipped || false,
duration: item.system?.duration || { time: 0, unit: "" },
};
});
}
if (!skip?.skills) {
context.items
?.filter((item) => item.type === "skill")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
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;
});
}
if (!skip?.spells) {
context.items
?.filter((item) => item.type === "spell")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
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,
};
});
}
if (!skip?.kampfkuenste) {
context.items
?.filter((item) => item.type === "kampfkunst")
.sort((a, b) => a?.sort - b?.sort)
.forEach((item) => {
item.prepareDerivedData();
ret.kampfkuenste[item.id] = {
label: item.name,
icon: item.img,
isKido: item.system.isKido,
type: item.system.type,
variante: item.system.variante,
calc: item.system.calc,
};
});
}
@ -342,7 +671,7 @@ export class M5Character extends Actor {
return data?.attributes[name];
}
createSkill(skillName: string): Promise<M5Item> {
async createSkill(skillName: string): Promise<M5Item> {
const itemData = {
name: skillName,
type: "skill",
@ -354,17 +683,57 @@ export class M5Character extends Actor {
});
}
createItem(itemName: string, itemType: M5ItemType, options?: any): Promise<M5Item> {
const itemData = {
name: itemName,
type: itemType,
data: options,
};
return (this as any).createEmbeddedDocuments("Item", [itemData]).then((docs) => {
const item = docs[0];
return item;
});
}
async createEffect(itemName: string, mods: M5ItemMod[]): Promise<M5Item> {
const itemData = {
name: itemName,
type: "effect",
system: { mods: mods, equipped: true },
};
return (this as any).createEmbeddedDocuments("Item", [itemData]).then((docs) => {
const item = docs[0];
return item;
});
}
getItem(itemId: string): any {
if (!(this as any).items) return null;
return (this as any).getEmbeddedDocument("Item", itemId);
}
private calculateValue(value: number, currency: string): number {
switch (currency) {
case "gold":
return value;
case "silver":
return parseFloat((value / 10).toPrecision(3));
case "copper":
return parseFloat((value / 100).toPrecision(3));
default:
return 0;
}
}
private modResult(value: number): M5ModResult {
return {
value: value,
mods: [
{
item: (game as Game).i18n.localize("ACTOR.TypeCharacter"),
item: (game as Game).i18n.localize("TYPES.Actor.character"),
operation: M5ModOperation.SET,
value: value,
},

View File

@ -1,158 +1,173 @@
import { M5Attribute, M5AttributeCalculated, M5Attributes, M5CharacterCalculatedData, M5ItemMod, M5ModOperation, M5ModResult, M5ModSource, M5ModType, M5Stats, M5ModPair } from "../M5Base"
import { M5Attribute, M5AttributeCalculated, M5Attributes, M5CharacterCalculatedData, M5ItemMod, M5ModOperation, M5ModResult, M5ModSource, M5ModType, M5Stats, M5ModPair } from "../M5Base";
export default class M5ModAggregate {
private attributes = new Map<string, Array<M5ModPair>>()
private stats = new Map<string, Array<M5ModPair>>()
private skills = new Map<string, Array<M5ModPair>>()
private attributes = new Map<string, Array<M5ModPair>>();
private stats = new Map<string, Array<M5ModPair>>();
private skills = new Map<string, Array<M5ModPair>>();
constructor(public data: any, public calc: M5CharacterCalculatedData) {
const characterString = (game as Game).i18n.localize("ACTOR.TypeCharacter")
const characterString = (game as Game).i18n.localize("TYPES.Actor.character");
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ST, operation: M5ModOperation.SET, value: data.attributes.st.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GS, operation: M5ModOperation.SET, value: data.attributes.gs.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GW, operation: M5ModOperation.SET, value: data.attributes.gw.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.KO, operation: M5ModOperation.SET, value: data.attributes.ko.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.IN, operation: M5ModOperation.SET, value: data.attributes.in.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ZT, operation: M5ModOperation.SET, value: data.attributes.zt.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.AU, operation: M5ModOperation.SET, value: data.attributes.au.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.PA, operation: M5ModOperation.SET, value: data.attributes.pa.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.WK, operation: M5ModOperation.SET, value: data.attributes.wk.value }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ST, operation: M5ModOperation.SET, value: data.attributes.st.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GS, operation: M5ModOperation.SET, value: data.attributes.gs.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GW, operation: M5ModOperation.SET, value: data.attributes.gw.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.KO, operation: M5ModOperation.SET, value: data.attributes.ko.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.IN, operation: M5ModOperation.SET, value: data.attributes.in.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ZT, operation: M5ModOperation.SET, value: data.attributes.zt.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.AU, operation: M5ModOperation.SET, value: data.attributes.au.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.PA, operation: M5ModOperation.SET, value: data.attributes.pa.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.WK, operation: M5ModOperation.SET, value: data.attributes.wk.value }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ST, operation: M5ModOperation.ADD_100, value: data.attributes.st.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GS, operation: M5ModOperation.ADD_100, value: data.attributes.gs.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GW, operation: M5ModOperation.ADD_100, value: data.attributes.gw.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.KO, operation: M5ModOperation.ADD_100, value: data.attributes.ko.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.IN, operation: M5ModOperation.ADD_100, value: data.attributes.in.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ZT, operation: M5ModOperation.ADD_100, value: data.attributes.zt.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.AU, operation: M5ModOperation.ADD_100, value: data.attributes.au.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.PA, operation: M5ModOperation.ADD_100, value: data.attributes.pa.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.WK, operation: M5ModOperation.ADD_100, value: data.attributes.wk.bonus }, characterString)
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ST, operation: M5ModOperation.ADD_100, value: data.attributes.st.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GS, operation: M5ModOperation.ADD_100, value: data.attributes.gs.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.GW, operation: M5ModOperation.ADD_100, value: data.attributes.gw.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.KO, operation: M5ModOperation.ADD_100, value: data.attributes.ko.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.IN, operation: M5ModOperation.ADD_100, value: data.attributes.in.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.ZT, operation: M5ModOperation.ADD_100, value: data.attributes.zt.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.AU, operation: M5ModOperation.ADD_100, value: data.attributes.au.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.PA, operation: M5ModOperation.ADD_100, value: data.attributes.pa.bonus }, characterString);
this.push({ type: M5ModType.ATTRIBUTE, id: M5Attributes.WK, operation: M5ModOperation.ADD_100, value: data.attributes.wk.bonus }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.DEFENSE, operation: M5ModOperation.SET, value: calc.stats.defenseBonus.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.ATTACK, operation: M5ModOperation.SET, value: calc.stats.attackBonus.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.DAMAGE, operation: M5ModOperation.SET, value: calc.stats.damageBonus.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.MOVEMENT, operation: M5ModOperation.SET, value: calc.stats.movementBonus.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.RESISTANCE_MIND, operation: M5ModOperation.SET, value: calc.stats.resistanceMind.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.RESISTANCE_BODY, operation: M5ModOperation.SET, value: calc.stats.resistanceBody.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.SPELL_CASTING, operation: M5ModOperation.SET, value: calc.stats.spellCasting.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.BRAWL, operation: M5ModOperation.SET, value: calc.stats.brawl.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.POISON_RESISTANCE, operation: M5ModOperation.SET, value: calc.stats.poisonResistance.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.LP, operation: M5ModOperation.SET, value: calc.stats.lp.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.AP, operation: M5ModOperation.SET, value: calc.stats.ap.value }, characterString)
this.push({ type: M5ModType.STAT, id: M5Stats.DEFENSE, operation: M5ModOperation.SET, value: calc.stats.defenseBonus.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.ATTACK, operation: M5ModOperation.SET, value: calc.stats.attackBonus.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.DAMAGE, operation: M5ModOperation.SET, value: calc.stats.damageBonus.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.MOVEMENT, operation: M5ModOperation.SET, value: calc.stats.movement.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.RESISTANCE_MIND, operation: M5ModOperation.SET, value: calc.stats.resistanceMind.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.RESISTANCE_BODY, operation: M5ModOperation.SET, value: calc.stats.resistanceBody.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.SPELL_CASTING, operation: M5ModOperation.SET, value: calc.stats.spellCasting.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.BRAWL, operation: M5ModOperation.SET, value: calc.stats.brawl.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.POISON_RESISTANCE, operation: M5ModOperation.SET, value: calc.stats.poisonResistance.value }, characterString);
this.push({ type: M5ModType.STAT, id: M5Stats.LP, operation: M5ModOperation.SET, value: calc.stats.lp.value }, characterString);
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.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) {
if (!mod?.id || mod.id === "")
return
if (!mod?.id || mod.id === "") return;
let map: Map<string, Array<M5ModPair>> = null
if (mod.type === M5ModType.ATTRIBUTE)
map = this.attributes
else if (mod.type === M5ModType.STAT)
map = this.stats
else if (mod.type === M5ModType.SKILL)
map = this.skills
let map: Map<string, Array<M5ModPair>> = null;
if (mod.type === M5ModType.ATTRIBUTE) map = this.attributes;
else if (mod.type === M5ModType.STAT) map = this.stats;
else if (mod.type === M5ModType.SKILL) map = this.skills;
if (map) {
const pair: M5ModPair = {
mod: mod,
source: source
}
source: source,
};
if (map.has(mod.id))
map.get(mod.id).push(pair)
else
map.set(mod.id, [pair])
if (map.has(mod.id)) map.get(mod.id).push(pair);
else map.set(mod.id, [pair]);
}
}
calculate() {
const calc = this.calc
const calc = this.calc;
this.attributes.forEach((pairs, id) => {
const res = M5ModAggregate.processPairs(pairs)
const res = M5ModAggregate.processPairs(pairs);
calc.attributes[id] = {
value: res.value,
bonus: M5ModAggregate.attributeBonus(res.value),
mods: res.mods
} as M5AttributeCalculated
mods: res.mods,
} as M5AttributeCalculated;
//console.log("calc.attributes." + id, calc.attributes[id])
})
});
this.stats.forEach((pairs, id) => {
const res = M5ModAggregate.processPairs(pairs)
calc.stats[id] = res
})
const res = M5ModAggregate.processPairs(pairs);
calc.stats[id] = res;
});
const ret = {}
const ret = {};
this.skills.forEach((pairs, id) => {
ret[id] = pairs
})
ret[id] = pairs;
});
return ret
return ret;
}
static pairAsSource(pair: M5ModPair): M5ModSource {
return {
operation: pair.mod.operation,
value: pair.mod.value,
item: pair.source
}
item: pair.source,
};
}
static processPairs(arr: Array<M5ModPair>): M5ModResult {
let ret: M5ModResult = {
mods: [],
value: 0
}
value: 0,
};
let mods = arr.filter(pair => pair.mod.operation === M5ModOperation.FIXED).sort((a, b) => b.mod.value - a.mod.value)
let pair = mods.length === 0 ? null : mods[0]
let mods = arr.filter((pair) => pair.mod.operation === M5ModOperation.FIXED).sort((a, b) => b.mod.value - a.mod.value);
let pair = mods.length === 0 ? null : mods[0];
if (pair) {
ret.mods.push(this.pairAsSource(pair))
ret.value = pair.mod.value
ret.mods.push(this.pairAsSource(pair));
ret.value = pair.mod.value;
} else {
mods = arr.filter(pair => pair.mod.operation === M5ModOperation.SET).sort((a, b) => b.mod.value - a.mod.value)
mods = arr.filter((pair) => pair.mod.operation === M5ModOperation.SET).sort((a, b) => b.mod.value - a.mod.value);
if (mods.length !== 0) {
ret.mods.push(this.pairAsSource(mods[0]))
ret.value = mods[0].mod.value
ret.mods.push(this.pairAsSource(mods[0]));
ret.value = mods[0].mod.value;
}
mods = arr.filter(pair => pair.mod.operation === M5ModOperation.ADD_100)
mods = arr.filter((pair) => pair.mod.operation === M5ModOperation.ADD_100);
if (mods.length !== 0) {
ret.mods = ret.mods.concat(mods.map(this.pairAsSource))
const bonus = mods.map(p => p.mod.value).reduce((a, b) => a + b, 0)
ret.value = Math.min(100, Math.max(0, ret.value + bonus))
ret.mods = ret.mods.concat(mods.map(this.pairAsSource));
const bonus = mods.map((p) => p.mod.value).reduce((a, b) => a + b, 0);
ret.value = Math.min(100, Math.max(0, ret.value + bonus));
}
mods = arr.filter(pair => pair.mod.operation === M5ModOperation.ADD)
mods = arr.filter((pair) => pair.mod.operation === M5ModOperation.ADD);
if (mods.length !== 0) {
ret.mods = ret.mods.concat(mods.map(this.pairAsSource))
const bonus = mods.map(p => p.mod.value).reduce((a, b) => a + b, 0)
ret.value = Math.max(0, ret.value + bonus)
ret.mods = ret.mods.concat(mods.map(this.pairAsSource));
const bonus = mods.map((p) => p.mod.value).reduce((a, b) => a + b, 0);
ret.value = Math.max(0, ret.value + bonus);
}
mods = arr.filter((pair) => pair.mod.operation === M5ModOperation.SUBTRACT);
if (mods.length !== 0) {
ret.mods = ret.mods.concat(mods.map(this.pairAsSource));
const bonus = mods.map((p) => p.mod.value).reduce((a, b) => a + b, 0);
ret.value = ret.value - bonus;
}
mods = arr.filter((pair) => pair.mod.operation === M5ModOperation.MULTIPLY);
if (mods.length !== 0) {
ret.mods = ret.mods.concat(mods.map(this.pairAsSource));
const bonus = mods.map((p) => p.mod.value).reduce((a, b) => a * b, 1);
ret.value = Math.max(0, ret.value * bonus);
}
mods = arr.filter((pair) => pair.mod.operation === M5ModOperation.DIVISION);
if (mods.length !== 0) {
ret.mods = ret.mods.concat(mods.map(this.pairAsSource));
const bonus = mods.map((p) => p.mod.value).reduce((a, b) => a * b, 1);
ret.value = Math.max(0, Math.floor(ret.value / bonus));
}
}
return ret
return ret;
}
static attributeMinMax(attribute: M5Attribute) {
return Math.min(100, Math.max(0, attribute.value + attribute.bonus))
return Math.min(100, Math.max(0, attribute.value + attribute.bonus));
}
static attributeBonus(value: number) {
if (value > 95)
return 2
if (value > 80)
return 1
if (value > 20)
return 0
if (value > 5)
return -1
return -2
if (value > 95) return 2;
if (value > 80) return 1;
if (value > 20) return 0;
if (value > 5) return -1;
return -2;
}
//static modToString(mod: M5ItemMod): string { }
}

View File

@ -13,8 +13,24 @@ 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 === "skill") {
if (itemType === "item") {
calc.containers = null;
if (actor) {
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;
}
const container = character.getItem(itemData.containerId);
//console.log("M5Item.prepareDerivedData:containers", itemData, container?.system)
if (container) {
container.prepareDerivedData();
const containerData = container.system;
}
}
} else if (itemType === "skill") {
calc.fw = itemData.fw;
calc.bonus = 0;
@ -30,8 +46,40 @@ 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({ skills: true, weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true });
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]);
}
@ -52,7 +100,8 @@ export class M5Item extends Item {
const res = M5ModAggregate.processPairs(pairs);
res.mods.forEach((mod) => {
if ([M5ModOperation.SET, M5ModOperation.FIXED].includes(mod.operation)) calc.fw = mod.value;
else calc.bonus += mod.value;
else if ([M5ModOperation.SUBTRACT].includes(mod.operation)) calc.bonus -= mod.value;
else if ([M5ModOperation.ADD].includes(mod.operation)) calc.bonus += mod.value;
});
calc.ew = calc.fw + calc.bonus;
@ -63,12 +112,20 @@ export class M5Item extends Item {
calc.special = itemData.special ? 2 : 0;
calc.ew = calc.special + itemData.stats.attackBonus;
calc.combatSkills = null;
calc.containers = null;
if (actor) {
const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: 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;
calc.containers = actorCalc.gear.containers;
}
const container = character.getItem(itemData.containerId);
//console.log("M5Item.prepareDerivedData:containers", itemData, container?.system)
if (container) {
container.prepareDerivedData();
const containerData = container.system;
}
const skill = character.getItem(itemData.skillId);
@ -79,6 +136,9 @@ export class M5Item extends Item {
calc.ew += skillData.calc.ew;
calc.bonus += skillData.calc.bonus;
calc.fw += skillData.fw;
} else {
calc.ew += 4;
calc.fw += 4;
}
}
} else if (itemType === "defensiveWeapon") {
@ -87,12 +147,21 @@ export class M5Item extends Item {
calc.special = itemData.special ? 2 : 0;
calc.ew = calc.special + itemData.stats.defenseBonus;
calc.combatSkills = null;
calc.containers = null;
if (actor) {
const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: 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;
calc.containers = actorCalc.gear.containers;
}
const container = character.getItem(itemData.containerId);
//console.log("M5Item.prepareDerivedData:containers", itemData, container?.system)
if (container) {
container.prepareDerivedData();
const containerData = container.system;
}
const skill = character.getItem(itemData.skillId);
@ -105,16 +174,67 @@ export class M5Item extends Item {
calc.fw += skillData.fw;
}
}
} else if (itemType === "armor") {
itemData.mods[0] = { type: "stat", id: "defenseBonus", operation: "add", value: itemData.stats.defenseBonus };
itemData.mods[1] = { type: "stat", id: "attackBonus", operation: "add", value: itemData.stats.attackBonus };
itemData.mods[2] = { type: "stat", id: "movement", operation: "add", value: itemData.stats.movementBonus };
itemData.mods[3] = { type: "attribute", id: "gw", operation: "add100", value: itemData.attributeMod.gw };
itemData.mods[4] = { type: "stat", id: "lpProtection", operation: "set", value: itemData.lpProtection };
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, class: true });
if (actorCalc) {
calc.containers = actorCalc.gear.containers;
}
const container = character.getItem(itemData.containerId);
//console.log("M5Item.prepareDerivedData:containers", itemData, container?.system)
if (container) {
container.prepareDerivedData();
const containerData = container.system;
}
}
} else if (itemType === "spell") {
calc.fw = 0;
if (actor) {
const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: 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;
}
}
} else if (itemType === "item") {
} else if (itemType === "kampfkunst") {
calc.fw = 0;
calc.bonus = 0;
calc.ew = 0;
calc.generalSkills = null;
if (actor) {
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;
}
const skill = character.getItem(itemData.skillId);
if (skill) {
skill.prepareDerivedData();
const skillData = skill.system;
calc.ew = skillData.calc.ew;
calc.fw = skillData.fw + calc.bonus;
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 = {};
for (let modKey in itemData.mods) {
if (itemData.mods[modKey].type === M5ModType.SKILL && itemData.mods[modKey].id?.includes("midgard5")) {
itemData.mods[modKey].id = actor?.items.find((x) => x.name === game["i18n"].localize(itemData.mods[modKey].id))?.id;
}
}
Object.keys(itemData?.mods).forEach((key) => {
const mod = itemData.mods[key];
const modCalc = {};
@ -135,7 +255,13 @@ export class M5Item extends Item {
}
case M5ModType.SKILL: {
if (character) {
const actorCalc = character.derivedData({ weapons: true, defensiveWeapons: true, armor: true, items: true, spells: true });
const actorCalc = character.derivedData({
items: true,
spells: true,
effects: true,
kampfkuenste: true,
encumbrance: true,
});
if (actorCalc) {
let category = (game as Game).i18n.localize("midgard5.skill");
Object.keys(actorCalc.skills.general).forEach((skillId) => {
@ -188,7 +314,7 @@ export class M5Item extends Item {
return ret;
}
async roll() {
async roll(toggleAutomatedRoll = false) {
const item = this as any;
// Initialize chat data.
@ -215,8 +341,20 @@ export class M5Item extends Item {
}
});
const roll = new M5Roll(rollData, this.actor, item.name);
return roll.toMessage();
const roll = new M5Roll(rollData, this.actor, item.name, item.id);
if (await roll.toMessage(toggleAutomatedRoll)) {
if (item.type === "spell" || item.type === "kampfkunst") {
if (this.actor["system"].ap.value >= item.system.ap) {
this.actor["update"]({
data: {
ap: {
value: this.actor["system"].ap.value - item.system.ap,
},
},
});
}
}
}
} else {
ChatMessage.create({
speaker: speaker,

View File

@ -1,16 +1,22 @@
import { Evaluated } from "@league-of-foundry-developers/foundry-vtt-types/src/foundry/client/dice/roll";
import { M5Character } from "../actors/M5Character";
import { M5EwResult, M5RollData, M5RollResult, M5SkillUnlearned } from "../M5Base";
import { M5EwResult, M5ModOperation, M5ModType, M5RollData, M5RollResult, M5SkillUnlearned, M5Stats } from "../M5Base";
import { stat } from "fs";
export class M5Roll {
// extends Roll<M5RollData>
static readonly TEMPLATE_PATH = "systems/midgard5e/templates/chat/roll-m5.hbs";
static readonly TEMPLATE_PATH = "systems/midgard5/templates/chat/roll-m5.hbs";
public _evaluated: boolean = false;
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
}
@ -25,10 +31,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 + `+ ${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) => {
@ -65,7 +71,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;
@ -87,6 +93,55 @@ 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) {
ui.notifications.notify(`Praxispunkt eingetragen für ${this.actor.items.get(this.id).name}`);
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") {
ui.notifications.notify(`Praxispunkt eingetragen für ${this.actor.items.get(this.id).name}`);
// Rolling through skill
this.actor.items.get(this.id).update({
system: {
pp: this.data.i.pp + 1,
},
});
} else if (this.data.iType === "weapon") {
ui.notifications.notify(`Praxispunkt eingetragen für ${this.actor.items.get(this.id).name}`);
// 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") {
ui.notifications.notify(`Praxispunkt eingetragen für ${this.actor.items.get(this.id).name}`);
// 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") {
ui.notifications.notify(`Praxispunkt eingetragen für ${this.data.i.process}`);
// 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;
@ -97,10 +152,25 @@ export class M5Roll {
return renderTemplate(M5Roll.TEMPLATE_PATH, this.data);
}
async toMessage() {
if (!this._evaluated) await this.evaluate();
async toMessage(toggleAutomatedRoll = false) {
let automatedRoll = (game as Game).settings.get("midgard5", "automatedRoll");
automatedRoll = toggleAutomatedRoll ? !automatedRoll : automatedRoll;
let rMode = (game as Game).settings.get("core", "rollMode");
const rMode = (game as Game).settings.get("core", "rollMode");
if (!automatedRoll) {
let checkOptions = await this.popUp({ isPW: this.data.rolls[0].label === (game as Game).i18n.localize("midgard5.pw") });
if (checkOptions["cancelled"]) {
return;
} else {
rMode = checkOptions["rollMode"];
this.data.b = checkOptions;
}
} else {
this.data.b = { difficulty: 20, modifier: 0 };
}
if (!this._evaluated) await this.evaluate();
const faces = this.pool.dice.map((x) => x.faces);
const chatData = {
type: CONST.CHAT_MESSAGE_TYPES.ROLL,
@ -108,37 +178,27 @@ export class M5Roll {
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);
}
static fromAttribute(actor: any, attributeKey: string) {
const character = actor as M5Character;
const attribute = character.attribute(attributeKey);
const rollData = actor.getRollData() as M5RollData;
rollData.i = attribute.value + attribute.bonus;
rollData.rolls["0"] = {
formula: "@i - 1d100",
enabled: true,
label: (game as Game).i18n.localize("midgard5.pw"),
result: "",
total: 0,
totalStr: "",
dice: {},
css: "",
} as M5RollResult;
return new M5Roll(rollData, actor, (game as Game).i18n.localize(`midgard5.actor-${attributeKey}-long`));
let foo = ChatMessage.applyRollMode(chatData, rMode);
return ChatMessage.implementation["create"](foo, { rollMode: rMode });
}
static fromAttributeValue(actor: any, attributeKey: string, attributeValue: number) {
const rollData = actor.getRollData() as M5RollData;
const itemData = actor.items.filter((x) => x.type === "effect").map((y) => y.system.mods);
rollData.c = 0;
for (let effectKey in itemData) {
for (let modkey in itemData[effectKey])
if (itemData[effectKey][modkey].type === M5ModType.ATTRIBUTE && itemData[effectKey][modkey].operation === M5ModOperation.ROLL) {
rollData.c += itemData[effectKey][modkey].value;
}
}
rollData.i = attributeValue;
rollData.rolls["0"] = {
formula: "@i - 1d100",
formula: "@i - 1d100 - @c",
enabled: true,
label: (game as Game).i18n.localize("midgard5.pw"),
result: "",
@ -162,7 +222,7 @@ export class M5Roll {
rollData.rolls["0"] = {
formula: "1d20 + @i.fw + @i.bonus",
enabled: true,
label: (game as Game).i18n.localize("midgard5.pw"),
label: (game as Game).i18n.localize("midgard5.ew"),
result: "",
total: 0,
totalStr: "",
@ -181,7 +241,7 @@ export class M5Roll {
};
rollData.rolls["0"] = {
formula: "1d20 + @c.calc.stats.brawl + @c.calc.stats.attackBonus + @i.attackBonus",
formula: "1d20 + @c.calc.stats.brawlFw",
enabled: true,
label: (game as Game).i18n.localize("midgard5.attack"),
result: "",
@ -192,7 +252,7 @@ export class M5Roll {
} as M5RollResult;
rollData.rolls["1"] = {
formula: "1d6 - 4 + @c.calc.stats.damageBonus + @i.damageBonus",
formula: "1d6 - 4 + @c.calc.stats.damageBonus.value",
enabled: true,
label: (game as Game).i18n.localize("midgard5.damage"),
result: "",
@ -205,6 +265,74 @@ export class M5Roll {
return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.brawl"));
}
static deprivationCold(actor: any) {
const rollData = actor.getRollData() as M5RollData;
rollData.rolls["0"] = {
formula: "@c.calc.stats.deprivationCold.value -1D100",
enabled: true,
label: (game as Game).i18n.localize("midgard5.deprivationCold"),
result: "",
total: 0,
totalStr: "",
dice: {},
css: "",
} as M5RollResult;
return new M5Roll(rollData, actor, (game as Game).i18n.localize("midgard5.deprivationCold"));
}
static deprivationHeat(actor: any) {
const rollData = actor.getRollData() as M5RollData;
rollData.rolls["0"] = {
formula: "@c.calc.stats.deprivationHeat.value -1D100",
enabled: true,
label: (game as Game).i18n.localize("midgard5.deprivationHeat"),
result: "",
total: 0,
totalStr: "",
dice: {},
css: "",
} as M5RollResult;
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) {
const rollData = actor.getRollData() as M5RollData;
rollData.i = {
@ -289,6 +417,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 {

View File

@ -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: '<i class="fas fa-rotate-left"></i>',
label: (game as Game).i18n.localize("midgard5.chat.destiny"),
callback: () => rerollDie("destiny", "sg"),
},
luckPoints: {
icon: '<i class="fas fa-rotate-left"></i>',
label: (game as Game).i18n.localize("midgard5.chat.luckPoint"),
callback: () => rerollDie("luckPoint", "gp"),
},
modify: {
icon: '<i class="fas fa-plus"></i>',
label: (game as Game).i18n.localize("midgard5.chat.modify") + " +" + (message["flags"].faces[0] === 100 ? 10 : 2),
callback: () => rerollDie("modify", "gp"),
},
cancel: {
icon: '<i class="fas fa-times"></i>',
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);
}
};

View File

@ -1,21 +1,34 @@
import Logger from "../../utils/Logger";
import { M5Character } from "../actors/M5Character";
import { M5Item } from "../items/M5Item";
import { M5SkillLearned, M5SkillUnlearned } from "../M5Base";
import { M5ItemType, M5SkillLearned, M5SkillType, M5SkillUnlearned } from "../M5Base";
import { M5Roll } from "../rolls/M5Roll";
export default class M5CharacterSheet extends ActorSheet {
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
template: "systems/midgard5e/templates/sheets/character/main.hbs",
width: 800,
width: 1000,
height: 800,
classes: ["midgard5", "sheet", "character"],
tabs: [{ navSelector: ".sheet-navigation", contentSelector: ".sheet-content", initial: "base_values" }],
tabs: [
{
navSelector: ".sheet-navigation",
contentSelector: ".sheet-content",
initial: "base_values",
},
],
});
}
// get template() {
get template() {
//console.log("M5CharacterSheet", this.actor.data.type)
if (this.actor.type === "npc") {
return "systems/midgard5/templates/sheets/npc/main.hbs";
}
else {
return "systems/midgard5/templates/sheets/character/main.hbs";
}
}
// return "systems/midgard5/templates/character_sheet/main.hbs"
// }Options extends ActorSheet.Options = ActorSheet.Options, Data extends object = ActorSheet.Data<Options>
@ -68,28 +81,17 @@ export default class M5CharacterSheet extends ActorSheet {
});
html.find(".roll-attribute-button").on("click", async (event) => {
let elem = event.target;
let attributeStr = elem.dataset["attribute"];
while (!attributeStr) {
elem = elem.parentElement;
if (!elem) return;
attributeStr = elem.dataset["attribute"];
}
const attributeValue = parseInt(elem.dataset["value"]);
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);
//console.log("roll-attribute-button", parent, attributeStr, attributeValue, roll)
await roll.toMessage();
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
});
html.find(".edit-item").on("click", async (event) => {
let row = event.target.parentElement;
let itemId = row.dataset["item"];
while (!itemId) {
row = row.parentElement;
if (!row) return;
itemId = row.dataset["item"];
}
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const context = this.actor as any;
const item = context.items.get(itemId);
@ -97,14 +99,61 @@ export default class M5CharacterSheet extends ActorSheet {
item.sheet.render(true);
});
html.find(".item-delete").on("click", async (event) => {
let row = event.target.parentElement;
let itemId = row.dataset["item"];
while (!itemId) {
row = row.parentElement;
if (!row) return;
itemId = row.dataset["item"];
html.find(".quantity-increase").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const context = this.actor as any;
const item = context.items.get(itemId);
if (!item.system.quantity) {
item.system.quantity = 0;
}
item.update({
data: {
quantity: item.system.quantity + 1,
},
});
this.render();
});
html.find(".quantity-decrease").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const context = this.actor as any;
const item = context.items.get(itemId);
if (item.system.quantity > 0) {
item.update({
data: {
quantity: item.system.quantity - 1,
},
});
}
this.render();
});
html.find(".roll-consumable-item").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const context = this.actor as any;
const item = context.items.get(itemId);
if (item.system.quantity > 0) {
item.update({
data: {
quantity: item.system.quantity - 1,
},
});
}
let toggleAutomatedRoll = (event.shiftKey)
await item.roll(toggleAutomatedRoll);
this.render();
});
html.find(".item-delete").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const context = this.actor as any;
const item = context.items.get(itemId);
@ -113,28 +162,30 @@ export default class M5CharacterSheet extends ActorSheet {
});
html.find(".roll-learned-button").on("click", async (event) => {
const row = event.target.parentElement.parentElement;
let skillId = row.dataset["item"];
let target = event.target.closest("[data-item-id]") as HTMLElement;
let skillId = target ? target.dataset.itemId : null;
const actor = this.actor as any;
const item = actor.items.get(skillId) as M5Item;
await item.roll();
let toggleAutomatedRoll = (event.shiftKey)
await item.roll(toggleAutomatedRoll);
});
html.find(".roll-general-button").on("click", async (event) => {
const row = event.target.parentElement.parentElement;
let skillName = row.dataset["skill"];
let target = event.target.closest("[data-skill]") as HTMLElement;
let skillName = target ? target.dataset.skill : null;
const data = this.actor.system;
const unlearnedSkill = data.skills.general[skillName] as M5SkillUnlearned;
const roll = M5Roll.fromUnlearnedSkill(this.actor, unlearnedSkill, skillName);
await roll.toMessage();
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
});
html.find(".learn-button").on("click", async (event) => {
const row = event.target.parentElement.parentElement;
let skillName = row.dataset["skill"];
let target = event.target.closest("[data-skill]") as HTMLElement;
let skillName = target ? target.dataset.skill : null;
const data = this.actor.system;
const unlearnedSkill = data.skills.general[skillName] as M5SkillUnlearned;
@ -153,40 +204,314 @@ 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;
const context = this.actor as any;
const item = context.items.get(itemId);
if (!item.system.fw) {
item.system.fw = 0;
}
if (item.system.fw < 18) {
item.update({
data: {
fw: Math.min(item.system.fw + 1, 18),
},
});
}
this.render();
});
html.find(".fw-decrease").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const context = this.actor as any;
const item = context.items.get(itemId);
if (!item.system.fw) {
item.system.fw = 0;
}
if (item.system.fw > 8) {
item.update({
data: {
fw: Math.max(item.system.fw - 1, 8),
},
});
}
this.render();
});
html.find(".roll-weapon-button").on("click", async (event) => {
const row = event.target.parentElement.parentElement;
let itemId = row.dataset["item"];
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const context = this.actor as any;
const item = context.items.get(itemId) as M5Item;
await item.roll();
let toggleAutomatedRoll = (event.shiftKey)
await item.roll(toggleAutomatedRoll);
this.render();
});
html.find(".roll-brawl-button").on("click", async (event) => {
const roll = M5Roll.brawl(this.actor);
await roll.toMessage();
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
});
html.find(".roll-cleanSpell-button").on("click", async (event) => {
const roll = M5Roll.cleanSpell(this.actor);
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
});
html.find(".roll-deprivationCold-button").on("click", async (event) => {
const roll = M5Roll.deprivationCold(this.actor);
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
});
html.find(".roll-deprivationHeat-button").on("click", async (event) => {
const roll = M5Roll.deprivationHeat(this.actor);
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
});
html.find(".roll-deprivationFood-button").on("click", async (event) => {
const roll = M5Roll.deprivationFood(this.actor);
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
});
html.find(".roll-defense-button").on("click", async (event) => {
const roll = M5Roll.defense(this.actor);
await roll.toMessage();
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
});
html.find(".roll-resistanceMind-button").on("click", async (event) => {
const roll = M5Roll.resistanceMind(this.actor);
await roll.toMessage();
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
});
html.find(".roll-resistanceBody-button").on("click", async (event) => {
const roll = M5Roll.resistanceBody(this.actor);
await roll.toMessage();
let toggleAutomatedRoll = (event.shiftKey)
await roll.toMessage(toggleAutomatedRoll);
});
html.find(".change-equipped").on("click", async (event) => {
let target = event.target.closest("[data-item-id]") as HTMLElement;
let itemId = target ? target.dataset.itemId : null;
const context = this.actor as any;
const item = context.items.get(itemId);
item.update({
data: {
equipped: !item.system.equipped,
},
});
this.render();
});
html.find(".add-item").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.item"), M5ItemType.ITEM, { quantity: 1 });
});
html.find(".add-weapon").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.weapon"), M5ItemType.WEAPON);
});
html.find(".add-defensiveWeapon").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.defensiveWeapon"), M5ItemType.DEFENSIVE_WEAPON);
});
html.find(".add-armor").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.armor"), M5ItemType.ARMOR);
});
html.find(".add-container").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.container"), M5ItemType.CONTAINER, { quantity: 1 });
});
html.find(".add-innate-skill").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("midgard5.innate-ability"), M5ItemType.SKILL, {
type: M5SkillType.INNATE,
});
});
html.find(".add-general-skill").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.skill"), M5ItemType.SKILL, {
type: M5SkillType.GENERAL,
});
});
html.find(".add-combat-skill").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("midgard5.weapon-skill"), M5ItemType.SKILL, {
type: M5SkillType.COMBAT,
});
});
html.find(".add-language-skill").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("midgard5.language"), M5ItemType.SKILL, {
type: M5SkillType.LANGUAGE,
});
});
html.find(".add-spell").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.spell"), M5ItemType.SPELL, { process: "none" });
});
html.find(".add-kampfkunst").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.kampfkunst"), M5ItemType.KAMPFKUNST, {
type: "angriff",
variante: "anstuermen",
});
});
html.find(".add-effect").on("click", async (event) => {
const data = this.actor.system;
const character = this.actor as M5Character;
character.createItem((game as Game).i18n.localize("TYPES.Item.effect"), M5ItemType.EFFECT);
});
html.find(".join-combat").on("click", async (event) => {
if (!!game["combat"]) {
let combatant = game["combat"].getCombatantByActor(this.actor._id);
if (!combatant) {
await game["combat"].createEmbeddedDocuments("Combatant", [{ actorId: this.actor._id }]);
combatant = game["combat"].getCombatantByActor(this.actor._id);
}
const initiatives = {
_id: combatant._id,
initiative: this.actor.system.calc.attributes.gw.value,
};
await game["combat"].updateEmbeddedDocuments("Combatant", [initiatives]);
}
});
html.find(".ranged-combat").on("click", async (event) => {
if (!!game["combat"]) {
let combatant = game["combat"].getCombatantByActor(this.actor._id);
if (!combatant) {
await game["combat"].createEmbeddedDocuments("Combatant", [{ actorId: this.actor._id }]);
combatant = game["combat"].getCombatantByActor(this.actor._id);
}
const initiatives = {
_id: combatant._id,
initiative: 0.01 * this.actor.system.calc.attributes.gw.value,
};
await game["combat"].updateEmbeddedDocuments("Combatant", [initiatives]);
}
});
html.find(".spell-combat").on("click", async (event) => {
if (!!game["combat"]) {
let combatant = game["combat"].getCombatantByActor(this.actor._id);
if (!combatant) {
await game["combat"].createEmbeddedDocuments("Combatant", [{ actorId: this.actor._id }]);
combatant = game["combat"].getCombatantByActor(this.actor._id);
}
const initiatives = {
_id: combatant._id,
initiative: 0.001 * this.actor.system.calc.attributes.gw.value,
};
await game["combat"].updateEmbeddedDocuments("Combatant", [initiatives]);
}
});
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",
dropSelector: ".sheet-body",
permissions: { dragstart: this._canDragStart.bind(this), drop: this._canDragDrop.bind(this) },
callbacks: { dragstart: this._onTransferItemDragStart.bind(this), drop: this._onTransferItemDrop.bind(this) },
dropSelector: null,
permissions: {
dragstart: this._canDragStart.bind(this),
drop: this._canDragDrop.bind(this),
},
callbacks: {
dragstart: this._onTransferItemDragStart.bind(this),
drop: this._onTransferItemDrop.bind(this),
},
});
dragDrop.bind(html[0]);
}
@ -196,29 +521,24 @@ export default class M5CharacterSheet extends ActorSheet {
}
_canDragDrop(selector) {
return true;
return this.options.editable;
}
_onTransferItemDragStart(event) {
const li = event.currentTarget;
$(event.currentTarget).attr("data-item-actorid", this.actor.id);
const li = event.target;
$(event.target).attr("data-item-actorid", this.actor.id);
const item = this.actor.items.get(li.dataset.itemId);
// limit transfer on personal weapons/armour/gear
if (["skill", "item", "weapon", "defensiveWeapon", "armor", "spell"].includes(item.type)) {
const dragData = {
type: "Transfer",
actorId: this.actor.id,
data: item.toObject(false),
tokenId: null,
};
const dragData = {
type: "Transfer",
actorId: this.actor.id,
data: item.toObject(false),
tokenId: null,
};
if (this.actor.isToken) dragData.tokenId = this.actor.token.id;
if (this.actor.isToken) dragData.tokenId = this.actor.token.id;
event.dataTransfer.setData("text/plain", JSON.stringify(dragData));
} else {
return false;
}
event.dataTransfer.setData("text/plain", JSON.stringify(dragData));
}
async _onTransferItemDrop(event) {
@ -226,6 +546,11 @@ export default class M5CharacterSheet extends ActorSheet {
let data = null;
try {
data = JSON.parse(event.dataTransfer.getData("text/plain"));
console.log("Data", data.data);
let target = event.target.closest("[data-container-id]") as HTMLElement;
let containerId = target ? target.dataset.containerId : "";
console.log("Container ID", containerId);
data.data.system.containerId = containerId; //Update containerId
if (data.type !== "Transfer") return false;
} catch (err) {
return false;
@ -233,14 +558,30 @@ export default class M5CharacterSheet extends ActorSheet {
if (!data.data) return false;
if (data.actorId === this.actor.id) return false;
if (data.actorId === this.actor.id) {
let itemId=data.data._id;
const context = this.actor as any;
const item = context.items.get(itemId);
item.update({
data: {
containerId: data.data.system.containerId,
},
});
return this._onSortItem(event, data.data);
}
try {
this.actor.createEmbeddedDocuments("Item", [duplicate(data.data)]); // Create a new Item
const actor = (game as any).actors.get(data.actorId);
await actor.items.get(data.data._id)?.delete(); // Delete originating item from other actor
} catch (e) {
console.error("Error transfering item between actors", e);
// limit transfer on personal weapons/armour/gear
if (["item", "weapon", "defensiveWeapon", "armor", "container"].includes(data.data.type)) {
try {
this.actor.createEmbeddedDocuments("Item", [duplicate(data.data)]); // Create a new Item
const actor = (game as any).actors.get(data.actorId);
await actor.items.get(data.data._id)?.delete(); // Delete originating item from other actor
} catch (e) {
console.error("Error transfering item between actors", e);
return false;
}
} else {
ui.notifications.warn("Nur Gegenstände können übertragen werden.");
return false;
}

View File

@ -7,12 +7,19 @@ export class M5ItemSheet extends ItemSheet {
width: 640,
height: 480,
classes: ["midgard5", "sheet", "item"],
tabs: [
{
navSelector: ".sheet-navigation",
contentSelector: ".sheet-content",
initial: "base_values",
},
],
});
}
get template() {
//console.log("M5ItemSheet", this.item.data.type)
const path = "systems/midgard5e/templates/sheets/item";
const path = "systems/midgard5/templates/sheets/item";
return `${path}/${this.item.type}.hbs`;
}
@ -59,42 +66,21 @@ export class M5ItemSheet extends ItemSheet {
});
});
html.find(".item-delete").on("click", async (event) => {
let row = event.target.parentElement;
let itemId = row.dataset["item"];
while (!itemId) {
row = row.parentElement;
if (!row) return;
itemId = row.dataset["item"];
}
html.find(".mod-delete").on("click", async (event) => {
let target = event.target.closest("[data-mod-id]") as HTMLElement;
let modId = target ? target.dataset.modId : null;
const context = this.item;
const item = context.items.get(itemId);
item.delete();
delete context.system.mods[modId];
this.render(false);
});
html.find(".roll-delete").on("click", async (event) => {
//console.log("roll-delete", this.item.data.data.rolls.formulas)
let row = event.target.parentElement;
let rollIndex = row.dataset["roll"];
while (!rollIndex) {
row = row.parentElement;
if (!row) return;
rollIndex = row.dataset["roll"];
}
let target = event.target.closest("[data-roll]") as HTMLElement;
let rollIndex = target ? target.dataset.roll : null;
const rolls = this.item.system.rolls.formulas;
rolls[rollIndex] = null;
this.item.update({
data: {
rolls: {
formulas: rolls,
},
},
});
delete rolls[rollIndex];
this.render(false);
});
@ -128,8 +114,11 @@ export class M5ItemSheet extends ItemSheet {
if (["item"].includes(this.object.type)) {
const itemToItemAssociation = new DragDrop({
dragSelector: ".item",
dropSelector: null,
permissions: { dragstart: this._canDragStart.bind(this), drop: this._canDragDrop.bind(this) },
dropSelector: ".item-list",
permissions: {
dragstart: this._canDragStart.bind(this),
drop: this._canDragDrop.bind(this),
},
callbacks: { drop: this._onDropItem.bind(this) },
});
itemToItemAssociation.bind(html[0]);

25
source/settings.ts Normal file
View File

@ -0,0 +1,25 @@
/* 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,
});
(game as Game).settings.register("midgard5", "automatedRoll", {
name: "Automatische Würfelwürfe",
hint: "Falls aktiv, wird bei Würfelwürfen kein Dialog gezeigt. Das Verhalten kann mit gleichzeitig gedrückter Shift Taste umgekehrt werden.",
scope: "world",
config: true,
default: false,
type: Boolean,
});
};

View File

@ -3,12 +3,89 @@
@attributeBorderColor: rgba(0, 0, 0, 0.5);
.midgard5 {
.flexbox {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.flexcolumn {
flex-wrap: wrap;
flex-direction: column;
}
.flexcolumn-1 {
flex-basis: 100%;
flex-wrap: wrap;
}
.flexcolumn-2 {
flex-basis: 50%;
flex-wrap: wrap;
}
.flexcolumn-3 {
flex-basis: 33%;
flex-wrap: wrap;
}
.flexcolumn-4 {
flex-basis: 25%;
flex-wrap: wrap;
}
.flexcolumn-5 {
flex-basis: 20%;
flex-wrap: wrap;
}
.flexpart {
gap: 0;
padding: 0;
margin: 2px;
background-color: beige;
border-collapse: separate;
border-radius: 10px;
border: 2px solid black;
}
.flexpart-header {
font-weight: bold;
font-size: large;
text-align: center;
color: black;
}
.flexpart-icon {
height: 2rem;
float: left;
border: 0px solid transparent;
}
.flexrow {
align-items: center;
}
h3 {
margin-top: 1rem;
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
margin-top: 0.5rem;
margin-bottom: 0;
text-align: left;
font-weight: bold;
background-color: #eeede0;
color: black;
border-collapse: separate;
border: 2px solid black;
border-radius: 10px;
}
.profile-img {
display: block;
margin-left: auto;
margin-right: auto;
height: 100%;
width: auto;
border: 0px solid black;
}
.sheet.character {
@ -27,24 +104,51 @@
}
}
.profile-img {
height: 64px;
width: 64px;
}
.description {
flex: 0 0 100%;
margin: 0;
}
}
.sheet-navigation {
margin: 4px 0;
background-color: lightgrey;
border-top: 2px solid black;
border-bottom: 2px solid black;
}
.sheet-navigation .item {
padding: 8px 12px 8px 12px;
color: black;
font-weight: bold;
font-size: large;
}
.sheet-navigation .active {
background-color: darkgrey;
}
.level-display {
text-align: right;
font-weight: bold;
}
td, th {
table {
background-color: beige;
border: 0px solid transparent;
&.bordered {
border-collapse: separate;
border: 2px solid black;
border-radius: 10px;
font-size: larger;
font-weight: bolder;
}
}
td,
th {
padding: 0 0.5rem 0 0.5rem;
text-align: left;
&.center {
text-align: center;
@ -54,6 +158,44 @@
width: 3rem;
text-align: center;
}
&.attribute {
text-align: center;
font-weight: bold;
}
&.attribute-value {
background: url(/icons/svg/d20-grey.svg) no-repeat;
background-size: 50px 50px;
background-position: center;
color: black;
text-align: center;
font-weight: bold;
height: 50px;
width: 50px;
}
&.title {
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
text-align: left;
font-weight: bold;
}
&.highlight {
font-weight: bold;
font-style: italic;
}
}
.table-icon {
height: 1rem;
width: 1rem;
float: left;
border: 0px solid transparent;
}
input {
border: 0px solid black;
}
input.skill {
@ -64,25 +206,42 @@
width: 5rem;
}
input.checkbox {
width: 1rem;
height: 1rem;
}
.new-skill {
font-style: italic;
background: rgba(0, 0, 0, 0.3);
color:rgba(255, 255, 255);
button {
background: rgba(255, 255, 255, 0.5);
}
color: rgba(255, 255, 255);
}
button.roll-button {
.roll-button {
background: url(/icons/svg/d20-black.svg) no-repeat;
background-size: 24px 24px;
width: 26px;
height: 26px;
background-size: 1rem 1rem;
border: #000000 solid 0px;
width: 1rem;
height: 1rem;
}
.wide-button {
margin: 0.25rem 0;
}
.learn-button {
padding: 0;
margin: 0;
height: 1rem;
width: 4rem;
background: rgba(255, 255, 255, 0.5);
font-size: smaller;
text-align: center;
line-height: 0.8rem;
}
span.spell-process {
color:rgb(93, 93, 93);
color: rgb(93, 93, 93);
font-style: italic;
}
@ -91,7 +250,7 @@
}
.health-bar {
height: 2rem;
height: 1rem;
background-color: rgba(0, 0, 0, 0.8);
display: flex;
flex-direction: row;
@ -99,8 +258,9 @@
padding: 1px;
//align-items: stretch;
input {
flex: 0 0 3rem;
input,
.max-value {
flex: 0 0 2rem;
text-align: center;
height: 100%;
background-color: rgba(109, 108, 102, 1);
@ -112,32 +272,46 @@
.lp-bar-item-empty,
.ap-bar-item-empty {
flex-grow: 1;
background-color: rgb(201, 201, 201);
background-color: white;
}
.lp-bar-item {
flex-grow: 1;
background-color: rgb(57, 234, 139);
background-color: lightgreen;
}
.ap-bar-item {
flex-grow: 1;
background-color: rgb(57, 163, 234);
background-color: lightblue;
}
.negative-bar-item {
flex-grow: 1;
background-color: rgb(234, 57, 57);
background-color: red;
}
}
.biography {
margin: 0.5rem 0.5rem 0.5rem 0.5rem;
height: 180px;
background-color: #eaead7;
.editor {
height: 100%;
width: 100%;
}
}
.attributes {
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
display: flex;
flex-direction: row;
margin-bottom: 0.5rem;
background-color: beige;
flex-wrap: wrap;
justify-content: center;
.attribute {
flex: 0 0 7rem;
flex: 0 0 6rem;
margin: 0;
border: 1px solid @attributeBorderColor;
//border-bottom: none;
@ -154,7 +328,7 @@
font-weight: bold;
background-color: @attributeBorderColor;
color:rgba(255, 255, 255, 1);
color: rgba(255, 255, 255, 1);
//font-size: 1.0rem;
height: 2.5rem;
@ -191,4 +365,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;
}
}

View File

@ -18,7 +18,8 @@
width: 64px;
}
td, th {
td,
th {
padding: 0 0.5rem 0 0.5rem;
&.center {

Some files were not shown because too many files have changed in this diff Show More