feat: Implement PF2e Alchemy and Rest system

Alchemy System:
- Versatile Vials tracking with refill functionality
- Research Field display (Bomber, Chirurgeon, Mutagenist, Toxicologist)
- Formula Book with search and level filtering
- Advanced Alchemy (daily preparation) for infused items
- Quick Alchemy using versatile vials
- Normal Alchemy for permanent crafted items
- Auto-upgrade system for formula variants (Lesser → Greater)
- Effect parsing with damage badges (damage type colors, splash, healing, bonus)
- German translations for all UI elements and item effects
- WebSocket sync for all alchemy state changes

Rest System:
- HP healing based on CON modifier × Level
- Condition management (Fatigued removed, Doomed/Drained reduced)
- Resource reset (spell slots, focus points, daily abilities)
- Alchemy reset (infused items expire, vials refilled)
- Rest modal with preview of changes

Database:
- CharacterAlchemyState model for vials and batch tracking
- CharacterFormula model for formula book
- CharacterPreparedItem model with isInfused flag
- Equipment effect field for variant-specific effects
- Translation germanEffect field for effect translations
- Scraped effect data from Archives of Nethys (205 items)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Alexander Zielonka
2026-01-20 15:24:40 +01:00
parent 55419d3896
commit 618de7b21d
29 changed files with 5543 additions and 227 deletions

View File

@@ -55,6 +55,7 @@ interface EquipmentJson {
url: string;
summary: string;
activation?: string;
effect?: string; // Specific effect text for item variants (Lesser, Moderate, Greater, Major)
}
function parseTraits(traitString: string): string[] {
@@ -288,6 +289,7 @@ async function seedEquipment() {
url: item.url || null,
summary: item.summary || null,
activation: item.activation || null,
effect: item.effect || null,
},
create: {
name: item.name,
@@ -298,6 +300,7 @@ async function seedEquipment() {
url: item.url || null,
summary: item.summary || null,
activation: item.activation || null,
effect: item.effect || null,
},
});
created++;