Haltbarkeit und Verarbeitung von Pflanzen (Herbarium 1)#2289
Draft
Wero999 wants to merge 47 commits into
Draft
Conversation
Update en.json
Create planttime.js
Update plant.js
Update obfuscatemixin.js
Update active_effects.js
Update item-dsa5.js
Update item-sheet.js
Create plant-config.js
Create plant-preservation-dialog.js
Update player_menu.js
Create player_menu_plants.js
Update dsa5.js
Create item-plant-work-gui.hbs
Create item-plant-spoiled.hbs
Create item-plant-tab-work.hbs
Create item-plant-preservation-details.hbs
Create item-plant-tabs.hbs
Update item-plant-sheet.hbs
Update item-effects.hbs
Verdrobene Pflanzen können haltbargemacht werden, erzeugen aber jetzt kein Produkt mehr sondern eine Nachricht, dass Fehlgeschalgen
lang konflikt beheben
Jetzt mit Schamanenicons - spezifisch für die Tradition des jeweiligen Spielers
Owner
|
puh ich weiß echt nicht ob ich mir das antun kann. da sind so viele probleme in diesem pr. das sieht zwar alles hübsch aus und kann was aber da hol ich mir mehr probleme rein als wenn ichs gleich neu mach |
Contributor
Author
|
Ich habs genau deswegen auf draft gesetzt. |
Open
Open
Contributor
Author
|
Werde erst wieder ab August Zeit zur Verfügung haben. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Verwendete Icons:
fa-solid fa-clock-rotate-left
fa-solid fa-seedling
fa-solid fa-plant-wilt
fa-solid fa-suitcase
fa-solid fa-jar-wheat
fa-spin fa-spinner
fas fa-mortar-pestle
fas fa-cookie-bite
fas fa-leaf
fas fa-info
fas fa-clock
fas fa-file-import
fas fa-arrow-up
fas fa-coins
fas fa-hourglass-half
fas fa-dice-six
(ich bin die dateien mehrfach durchgegangen, das sollten alle sein)
Das erweiterte Datenmodell (plant.js)
Der Dokument-Typ "Pflanze" bekommt ein paar Erweiterungen:
!Wichtig: Ein Spieler sieht hier nur den Verarbeitungszustand und die übliche Haltbarkeit einer solchen Pflanze!

Pflanzenteile (Plant Parts): Die Pflanze speichert nun präzise als Checkboxen (Booleans), aus welchen von 14 Teilen sie besteht (Blätter, Blüten, Dornen, Fasern, Fruchtkörper, Harz, Rinde/Holz, Saft, Samen, Stängel, Triebe, Öl, Wurzeln, Knollen). Ein Feld (mainIngredient) definiert den Hauptbestandteil, der für die Basis-Haltbarkeit ausschlaggebend ist.
Haltbarkeits-Architektur: Es gibt getrennte Speicherwege für die profane Haltbarkeit (mundane.shelfLife.value), einen übernatürlichen Faktor (supernatural.factor) und die tatsächlich verbleibende Zeit (remaining.shelfLife.value).
Übernatürliche Haltbarkeit entsteht durch Zauber für die ich, gerne separate Prs mache, sollte nicht schwer sein, ist aber fleißarbeit die hinüber ist, wenn du das hier in die Tonne tritts. Solche übernatürlichen Einflüsse sind immernur Faktoren.
Die Einheiten (Tage, Stunden etc.) werden strikt getrennt für den Rohzustand und den verarbeiteten Zustand gespeichert.
Rezept-Speicher: Die Pflanze speichert interne Arrays für zugehörige Hilfsmittel (auxiliaryRecipes), Gifte (poisonRecipes) und Drogen (drugRecipes), inklusive deren UUIDs und Icons. Idee dahinter ist, dass offiziell zugeordnete Items hier bereits hinterlegt sind und durch Spieler erweitert werden können.
Das Item-Sheet
Dynamische Dropdowns: Abhängig davon, ob die Pflanze "Roh" oder "Haltbargemacht" ist, ändert sich die UI. Wenn "Haltbargemacht" gewählt wird, liest das System die angeklickten Pflanzenteile aus und generiert dynamisch ein zweites Dropdown nur mit den Methoden, die für diese Teile logisch möglich sind (z.B. "Trocknen" für Blätter, "Einkochen" für Saft). Heißt die Pflanze exakt wie ein Eintrag in SPECIFIC_PLANT_METHODS (z.B. "Orazal"), überschreibt das System die überlappende generischen Methoden mit pflanzenspezifischen Spezialrezepten (z.B. "Schwefliger Orazal"). Solche Methodenbeschreibungen sind meißtens noch etwas detalierter ausgearbeitet.
Drag & Drop Rezept-Zonen: Im "Verarbeiten"-Reiter gibt es drei Zonen (Hilfsmittel, Gift, Droge). Zieht der GM ein anderes Item (z.B. einen Gift-Eintrag aus einem Kompendium) dorthin, ändert sich die Hintergrundfarbe via CSS (grün, rot, türkis). Beim Loslassen wird das Item als Rezept in die Pflanze integriert. Rechtsklick löscht es wieder, Linksklick öffnet das Rezept-Item.
Visuelle Warnungen: Fällt die Haltbarkeit auf 0, wird das Eingabefeld im Sheet rot umrandet, leuchtet auf und ein rotes Uhr-Symbol erscheint.
Sowohl im Pflanzensheet als auch im neuen Player menu-Eintrag sieht man nun Jar-Icons (mit Tooltip): Klickt man auf dieses, öffnet sich das Menü für die Mechanik "Alternative Wirkung durch Haltbarmachung):
Dieses liest alle möglichen Verarbeitungsmethoden der aktuellen Pflanze aus und stellt sie als Reiter dar.
Die SL kann hier per Drag & Drop andere Items in zwei Kategorien ziehen: "Alternative Effekte" (überschreibt die Wirkung der Pflanze) und "Zusätzliche Erzeugnisse" (generiert beim Crafting ein Beiprodukt).
Header-Buttons:
Haltbarkeit prüfen: Rollt eine Pflanzenkunde-Probe für den Besitzer. Bei Erfolg (QS > 0) flüstert das System dem Spieler die exakte Restzeit in der passenden Einheit zu. Ist die Pflanze verdorben wird auch das erkannt. (wichtig wenn man die Pflanze konsumieren oder verarbeiten möchte - wird weiter unten erklärt)
Verzehren: Dem On-Use-Feld nachempfunden --- Reduziert die Menge um 1, löst Chat-Nachrichten aus und triggert den im Effekt, der ggf. im neuen Feld unter On-Use nun entstanden ist. Mittels dieses Feldes kann man nun auch die "Verzehren"-effekte zukünftig abbilden! Handelt es sich um eine verdorbene Pflanze, wird stattdessen die gewürfelte Verdorben-Konsequenz (weiter unten beschrieben) auf den Konsumenten angewandt.
Spieler Menü
Das Spieler-Menü (Das "Crafting-Hub")
Im Spielermenü gibt es nun einen neuen Reiter: Pflanzen verarbeiten.
Hier gibt es eine anzeige, wie viele Pflanzen dieses Typs der Held im Inventar hat.
In der Craft-Sektion sind die hinterlegten Items, die man aus der Pflanze craften kann, hinterlegt (mit Infobutton, der das Item-Sheet in den Compendien sucht und öffnet) Ist die Pflanze abgelaufen, muss kann man noch versuchen mit ihr ein Produkt zu erstellen, aber selbst wenn die Probe gelingt, erhält der Spieler nur eine Benachrichtigung, dass die Pflanze verdorben war. Die Erschwernis wird aus der Stufe (Step) des Zielgiftes oder der Schwierigkeit des Hilfsmittels wird ebenfalls mit berechnet. Bei Erfolg wird die Pflanze verbraucht und das neue Item aus dem Kompendium in das Inventar des Helden gelegt.
Formel: Basiszeit aus den Settings * Ernte-Faktor (Mundane Wert / Standard Roh-Wert) * Bonus-Faktor.
Ernte-Faktor (Mundane Wert / Standard Roh-Wert) ---- WICHTIG, wenn im rohzustand bereits ein Wert für Profane Haltbarkeit eingetragen ist, obwohl diese Pflanze nicht verarbeitet ist, wird dieser Wert in der Bereichnung als Faktor miteinbezogen, so kann man auch Sonderfähigkeiten wie Haltbare Ernte implementieren. Ich hab so lange für diesen Ansatz gebraucht, ich hoffe der bleibt drin :)
Einige Methoden (wie bei Orazal) würfeln die Haltbarkeit (z.B. (1d6+1)*10 Jahre). Das Menü berechnet vorab das absolute Minimum und Maximum und zeigt dem Spieler dynamisch an: "Zwischen 20 und 70 Jahren".
In der Sektion für Übernatürliche Methoden wird der Spieler auf relevante Sonderfertigkeiten und Zauber durchsucht. Findet es spezifische Magie (z.B. "Sumus Elixiere" bei Druiden, "Wachskonservierung" bei Zibiljas oder "Konservierende Schale" bei Alchimisten), schaltet es Spezial-Buttons frei. Es erkennt sogar dynamisch die Schamanen-Tradition (Fjarninger, Trollzacker etc.) und passt das Icon an. ------------ Hier wären die Schamanenicons super, die fehlen mir nämlich noch, aktuell nutzt die Funktion Platzhalter. Auch sind die Zauber noch nciht automatisiert, dass sollte einfach mittels PR für mich machbar sein, basiert aber auf deine Akzeptanz des systems, ansonsten baue ich hier auf sand.
Die Mechanik der Haltbarkeit & Verderbnis
Automatische Initialisierung (item-dsa5.js): Sobald eine neue Pflanze erstellt oder ins Inventar gezogen wird, greift der _preCreate-Hook. Dieser übernimmt die initiale Berechnung der Haltbarkeit in einer intelligenten Kaskade, die verschiedene Zustände der Pflanze berücksichtigt:
Erhaltungs-Check (Vorhandene Restzeit): Ganz zu Beginn prüft das System, ob die Pflanze bereits einen aktiven Verderbnis-Timer hat (remaining.shelfLife.value > 0). Ist dies der Fall (z. B. weil eine bereits welkende Pflanze von einem Spieler zum anderen gereicht wird, oder eine SL einen Wert bereits voreinstellen möchte), überspringt das System alle weiteren Rechnungen und behält den exakten, aktuellen Verfallswert bei.
Manuelle Vorab-Werte (mundane.shelfLife): Ist die verbleibende Zeit noch auf 0, sucht das Skript zuerst nach einem explizit voreingestellten, profanen Haltbarkeitswert (mundane.shelfLife.value). Das greift beispielsweise, wenn eine SL ein bereits fertiges, haltbar gemachtes Item aus dem Kompendium zieht. Das System liest diesen Zahlenwert aus und kombiniert ihn mit der dazugehörigen, gespeicherten Zeiteinheit (processed.shelfLife.unit oder als Fallback shelfLife.unit). Über eine Umrechnungsmatrix (z. B. weeks = Faktor 7, hours = Faktor 1/24) wird dieser voreingestellte Wert exakt in Basis-Tage umgerechnet.
Fallback auf den Rohzustand (Die Map): Ist kein manueller Wert eingetragen (z. B. bei frisch gesammelten Pflanzen), greift der Standard-Mechanismus. Das System liest aus, was als Hauptbestandteil (mainIngredient) definiert ist (Standard ist "Blätter" - Wenn die PR durchgeht bearbeite ich dir gerne die Pflanzen und lege alle Bestandteile fest). Mit dieser Information sucht es in der PLANT_SHELF_LIFE_MAP nach dem nativen Rohwert (z.B. "1w"). Eine Übersetzungstabelle (rawTimeValues) wandelt diese Kurzstrings dann in mathematisch nutzbare Basis-Tage um (z. B. "1w" = 7, "12h" = 0.5, "years" = 7300).
Übernatürliche Multiplikation & Festschreibung: Sobald die Basis-Tage ermittelt wurden – egal ob aus Schritt 2 oder 3 – werden diese abschließend mit dem magischen Faktor (supernatural.factor, standardmäßig 1) multipliziert. Das Endergebnis wird auf eine Nachkommastelle präzise gerundet und über den Befehl updateSource als remaining.shelfLife.value in das Item geschrieben.
Smarte Stapelung (Stacking): Das Standard-DSA5-System stapelt Items mit gleichem Namen. Dein Code überschreibt checkEquality für Pflanzen: Zwei identische Pflanzen stapeln sich nur dann, wenn ihre restliche Haltbarkeit auf 0,1 Tage genau übereinstimmt. Das verhindert, dass frische Kräuter plötzlich den Verderbnis-Timer von alten Kräutern annehmen.
Verderbnis (item-sheet.js): Setzt der Spielleiter den Haken bei "Verdorben" (isSpoiled), rollt das System automatisch verdeckt 1d20 auf einer maßgeschneiderten Tabelle.
Das Ergebnis wird im Item als spoiledResult gespeichert und (wenn die Wirkung nicht händisch ausgewählt worden ist) eine Chat-Nachricht (nur an den GM) mit der Auswirkung (z.B. "Wirselkraut-Gift" oder "1d6 Schaden") gesendet.
Der Haken is der isspoiled-Checkbox wird gesetzt, wenn man als SL den Verderbnis Effekt in dem entsprechenden Sheet (über das Info-Icon - siehe Tooltip) auswürfelt oder wenn die Pflanze durch den normalen Zeitverlauf verdirbt (dies sind also die Chatnachricht-Verursacher).
Wenn der Spieler nun versucht mit dieser Pflanze zu agieren, schlagen Craft-Versuche fehl und Consume-Versuche erhalten einen neuen Effekt:
Wenn die Pflanze verdorben ist und sie wird verzehrt, wird das normale Makro im onConsumeEffect-Feld ignoriert. Stattdessen ruft das System die massive Weichensteller-Funktion _handleSpoiledConsumption(actor, item, spoiledResult) auf.
Diese Funktion liest aus, was beim Verderben gewürfelt wurde, und führt vollautomatisch folgende Konsequenzen aus:
Das Anwenden von Zustände anwenden (Ergebnisse 6-9), Auslösen von Gifte & Krankheiten (Ergebnisse 11-16 & 18) - Das System sucht in der Welt und allen Kompendien nach den offiziellen Einträgen um diese auf den Spieler anzuwenden: Wurara (11-12), Arax (13), Flinker Difar (14-15), Sumpffieber (16) und Wirselkraut (18). Sowie andere weniger interessante Mechaniken (alles automatisiert!)
Das Einzige was mittels Trick gelöst wird ist Ergebnis 2: Das System schickt eine geheime Flüsternachricht an den Spielleiter, dass er manuell eine Auswirkung anwenden soll. Warum? Weil ich nicht jeden Pflanzeneffekt neu anlegen möchte, nur weil diese halbiert werden.
Wenn der GM das Jar-Symbol der Pflanze klickt, öffnet sich der PlantPreservationDialog. Zieht er nun ein Item (z. B. eine eingelegte Alraune) auf die Drop-Zone für eine bestimmte Methode (z. B. "Trocknen"), fängt der _onDrop-Hook dieses Event ab. Ist dort bereits ein Effekt hinterlegt, blockiert das System mit der Warnung "PLANT.errorOnlyOneAllowed" – eine Pflanze kann durch eine Methode immer nur einen alternativen Haupteffekt erhalten.
Wird das Item akzeptiert, speichert die Pflanze nicht das ganze Item, sondern nur Name, Bild (img) und die UUID (wenn man hier die festen Zuweisungen der alternativen Effekte den Items im modulseitig hinterlegt, kann man hier bei manchen Items die direkten Links abbilden. Diese landen unter system.preservationDetails.methods[methodenName].alternativeEffects. Da jede Haltbarmache-Methode andere alternative Effekte produzieren kann. Es geht also Pflanze -> Pflanzenteil -> Haltbarmachmethode -> Alternative Wirkung.
Wenn der Spieler sieht im Player menu Reiter "Profane Haltbarmachung" alle für diese Pflanzen (mittels Pflanzenteile und ggf. durch die Pflanze selber (manche haben einzigartige Verarbeitungsmethoden).
Beim mousover werden alle Alternativen Wirkungen und Zusätzlichen Erzeugnisse der Haltbarmachmethode angezeigt. Auch hier gibt es nochmal das Jar-Icon, mit dem man ggf. andere Items diesen Methoden zuweisen kann.
Bei der Erstellung wird nun die Pflanze neu generiert mit folgender Änderung: Die Beschreibung (system.description.value) und der Effekt-Text (system.effect) des Tranks überschreiben die Texte der Pflanze. Das Icon der Pflanze kann durch das Erzeugnis-Icon ersetzt, wenn dieses kein generischer Platzhalter ist.
Effekte aus args3 werden ebenfalls übertragen - ist das Item, was erstellt wird jedoch ein Lebensmittel, landet dieser effekt nun im on consume-Feld.