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

@@ -0,0 +1,70 @@
-- CreateEnum
CREATE TYPE "ResearchField" AS ENUM ('BOMBER', 'CHIRURGEON', 'MUTAGENIST', 'TOXICOLOGIST');
-- CreateTable
CREATE TABLE "CharacterAlchemyState" (
"id" TEXT NOT NULL,
"characterId" TEXT NOT NULL,
"researchField" "ResearchField",
"versatileVialsCurrent" INTEGER NOT NULL DEFAULT 0,
"versatileVialsMax" INTEGER NOT NULL DEFAULT 0,
"advancedAlchemyBatch" INTEGER NOT NULL DEFAULT 0,
"advancedAlchemyMax" INTEGER NOT NULL DEFAULT 0,
"lastRestAt" TIMESTAMP(3),
CONSTRAINT "CharacterAlchemyState_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "CharacterFormula" (
"id" TEXT NOT NULL,
"characterId" TEXT NOT NULL,
"equipmentId" TEXT NOT NULL,
"name" TEXT NOT NULL,
"nameGerman" TEXT,
"learnedAt" INTEGER NOT NULL DEFAULT 1,
"formulaSource" TEXT,
CONSTRAINT "CharacterFormula_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "CharacterPreparedItem" (
"id" TEXT NOT NULL,
"characterId" TEXT NOT NULL,
"equipmentId" TEXT NOT NULL,
"name" TEXT NOT NULL,
"nameGerman" TEXT,
"quantity" INTEGER NOT NULL DEFAULT 1,
"isQuickAlchemy" BOOLEAN NOT NULL DEFAULT false,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "CharacterPreparedItem_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "CharacterAlchemyState_characterId_key" ON "CharacterAlchemyState"("characterId");
-- CreateIndex
CREATE INDEX "CharacterFormula_characterId_idx" ON "CharacterFormula"("characterId");
-- CreateIndex
CREATE UNIQUE INDEX "CharacterFormula_characterId_equipmentId_key" ON "CharacterFormula"("characterId", "equipmentId");
-- CreateIndex
CREATE INDEX "CharacterPreparedItem_characterId_idx" ON "CharacterPreparedItem"("characterId");
-- AddForeignKey
ALTER TABLE "CharacterAlchemyState" ADD CONSTRAINT "CharacterAlchemyState_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "Character"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "CharacterFormula" ADD CONSTRAINT "CharacterFormula_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "Character"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "CharacterFormula" ADD CONSTRAINT "CharacterFormula_equipmentId_fkey" FOREIGN KEY ("equipmentId") REFERENCES "Equipment"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "CharacterPreparedItem" ADD CONSTRAINT "CharacterPreparedItem_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "Character"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "CharacterPreparedItem" ADD CONSTRAINT "CharacterPreparedItem_equipmentId_fkey" FOREIGN KEY ("equipmentId") REFERENCES "Equipment"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

View File

@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "CharacterPreparedItem" ADD COLUMN "isInfused" BOOLEAN NOT NULL DEFAULT true;

View File

@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "Equipment" ADD COLUMN "effect" TEXT;

View File

@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "Translation" ADD COLUMN "germanEffect" TEXT;