forked from xziino/ff14-mitigator
Add Cooldown Planner concept and roadmap to CLAUDE.md
Documents data model, import flow with merge logic, feature roadmap, job-to-ability mapping, recast times, and technical decisions for the upcoming third tab (Planer). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
6897db0fe6
commit
d6dedd1a2e
104
CLAUDE.md
104
CLAUDE.md
@ -4,9 +4,10 @@
|
||||
PHP/HTML/JS-Tool zum Analysieren von FFXIV-Raidlogs via FFLogs OAuth2 PKCE + GraphQL API.
|
||||
Kein Framework, kein Composer, kein npm — Plain PHP für Shared Hosting.
|
||||
|
||||
Zwei Tabs:
|
||||
Drei Tabs:
|
||||
- **Report-Tab**: Report-Code eingeben, Fight auswählen → Fight-JSON-Ausgabe + Event Explorer
|
||||
- **Analyse-Tab**: Spielerübersicht + AoE-Timeline mit Mitigation-Tracking, Pull-Vergleich, Phase-Filter
|
||||
- **Planer-Tab** *(in Entwicklung)*: Cooldown-Planer für Raid-Mitigation — Log-Import, manuelle Bearbeitung, Job-basierte Spell-Verfügbarkeit, DR-Simulation
|
||||
|
||||
## Architektur & Konventionen
|
||||
|
||||
@ -213,3 +214,104 @@ Vollständiges Schema: siehe `debug/schema.php` oder `fflogs-schema.json`
|
||||
- `REDIRECT_URI` auf produktive HTTPS-URL anpassen
|
||||
- `debug/` Ordner nicht deployen
|
||||
- `assets/` Ordner deployen (enthält lokale Icons)
|
||||
|
||||
---
|
||||
|
||||
## Planer-Tab — Konzept & Roadmap
|
||||
|
||||
### Ziel
|
||||
Raid-Cooldown-Planer: Welche Mitigation-Ability wird für welche Mechanik eingesetzt? Basierend auf Log-Daten oder manuell aufgebaut. Überlebt Browser-Neustarts via localStorage.
|
||||
|
||||
### Datenmodell (Plan)
|
||||
```json
|
||||
{
|
||||
"id": "uuid",
|
||||
"name": "M8S – Prog Week 1",
|
||||
"createdAt": 1234567890,
|
||||
"updatedAt": 1234567890,
|
||||
"source": { "reportCode": "abc123", "fightId": 6 },
|
||||
"jobComposition": ["PLD", "WAR", "WHM", "SCH", "MNK", "DRG", "BRD", "SMN"],
|
||||
"mechanics": [
|
||||
{
|
||||
"id": "uuid",
|
||||
"name": "Fourth-Wall Fusion",
|
||||
"timestamp": 83000,
|
||||
"unmitigatedDamage": 280000,
|
||||
"assignments": [
|
||||
{ "ability": "Reprisal", "job": "PLD" },
|
||||
{ "ability": "Shield Samba", "job": "BRD" }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Mehrere Pläne gespeichert in `localStorage` unter `ff14-planner-plans` als Array.
|
||||
|
||||
### Import-Flow (erster Meilenstein)
|
||||
**Ziel:** Einen bestehenden Log als saubere Mechanik-Vorlage laden — ohne vorhandene Mechaniken zu überschreiben.
|
||||
|
||||
1. Benutzer wählt Report-Code + Kampf (gleicher Flow wie im Report-Tab, eigenes Mini-Formular im Planer)
|
||||
2. `api/analysis.php` wird aufgerufen → liefert `aoe_events` mit Name, Timestamp, `unmitigatedAmount`
|
||||
3. Jedes AoE-Event wird als Mechanik-Kandidat angezeigt (Name + Timestamp + Rohschaden)
|
||||
4. Benutzer kann einzelne Events auswählen oder alle übernehmen
|
||||
5. **Merge-Logik:** Beim Import in einen bestehenden Plan werden nur Mechaniken hinzugefügt die noch nicht vorhanden sind — Matching per `abilityName` + Timestamp-Nähe (± 5s). Bestehende Assignments bleiben erhalten.
|
||||
6. Neue Mechaniken werden an der richtigen Timestamp-Position eingefügt (Timeline bleibt sortiert)
|
||||
|
||||
**Warum Merge statt Überschreiben:** Progress-Szenario — erster Import enthält Phase 1, späterer Import (weiter im Fight) fügt Phase 2 hinzu ohne Phase-1-Planung zu verlieren.
|
||||
|
||||
### Geplante Features (Übersicht)
|
||||
|
||||
| Prio | Feature | Beschreibung |
|
||||
|---|---|---|
|
||||
| 1 | **Import-Flow** | Log → Mechanik-Timeline, Merge bei Teilimporten |
|
||||
| 2 | **Jobaufstellung** | 8 Slots (2 Tank, 2 Healer, 4 DPS), Auswahl bestimmt verfügbare Spells |
|
||||
| 3 | **Cooldown-Zuweisung** | Pro Mechanik Abilities zuweisen/entfernen per Klick |
|
||||
| 4 | **DR-Simulation** | `simuliert = unmitigated × ∏(1 − dr_i)` live berechnet beim Toggle |
|
||||
| 5 | **Recast-Tracking** | Recast-Datenbank pro Ability; Konflikt-Warnung wenn CD noch läuft |
|
||||
| 6 | **Coverage-Ansicht** | Gantt-Chart: Mechaniken auf X-Achse, Buff-Dauer als Balken |
|
||||
| 7 | **Analyse-Overlay** | Planer-Tab: Vergleich geplanter vs. tatsächlich genutzter CDs (Job-basiertes Matching, nicht Spielername) |
|
||||
| 8 | **Shield-Schätzung** | Empirisch aus Log-Durchschnitt (`absorbed`-Werte), nicht exakt |
|
||||
| 9 | **JSON-Export/Import** | Plan als Datei teilen mit Raidkollegen |
|
||||
|
||||
### Spell-Verfügbarkeit nach Job
|
||||
Jobaufstellung → verfügbare Abilities (Subset von `MITIGATION_ABILITIES`):
|
||||
|
||||
| Job | Abilities |
|
||||
|---|---|
|
||||
| PLD | Passage of Arms, Divine Veil, Guardian, Reprisal |
|
||||
| WAR | Shake It Off, Bloodwhetting, Reprisal |
|
||||
| DRK | Dark Missionary, Reprisal |
|
||||
| GNB | Heart of Stone *(noch nicht getrackt)*, Reprisal |
|
||||
| WHM | Temperance, Divine Benison, Divine Caress |
|
||||
| SCH | Sacred Soil, Expedient, Fey Illumination, Galvanize, Seraphic Veil, Catalyze, Addle |
|
||||
| AST | Collective Unconscious, Neutral Sect, Intersection, the Spire |
|
||||
| SGE | Kerachole, Holos, Holosakos, Panhaima, Eukrasian Prognosis, Eukrasian Diagnosis, Haima, Addle |
|
||||
| BRD | Troubadour |
|
||||
| MCH | Tactician |
|
||||
| DNC | Shield Samba, Improvised Finish |
|
||||
| MNK | Feint |
|
||||
| DRG | Feint |
|
||||
| NIN | Feint |
|
||||
| SAM | Feint |
|
||||
| RPR | Feint |
|
||||
| VPR | Feint |
|
||||
| BLM | Addle |
|
||||
| SMN | Addle, Radiant Aegis |
|
||||
| RDM | Addle, Magick Barrier |
|
||||
| PCT | Addle, Tempera Coat, Tempera Grassa |
|
||||
|
||||
### Recast-Zeiten (geplante Datenbank)
|
||||
Wird benötigt für Konflikt-Erkennung. Beispiele:
|
||||
- Reprisal: 60s
|
||||
- Feint / Addle: 90s
|
||||
- Troubadour / Tactician / Shield Samba: 120s
|
||||
- Temperance: 120s
|
||||
- Dark Missionary / Heart of Light: 90s
|
||||
|
||||
### Technische Entscheidungen
|
||||
- **Persistenz:** `localStorage` — kein Backend nötig, mehrere Pläne möglich
|
||||
- **IDs:** `crypto.randomUUID()` für Plan- und Mechanik-IDs
|
||||
- **Merge-Matching:** Mechaniken gelten als identisch wenn `abilityName` gleich und `|timestamp_a - timestamp_b| < 5000ms`
|
||||
- **Keine Spielernamen im Planer:** Assignments sind Job-basiert (`{ ability, job }`), damit Pläne übertragbar sind
|
||||
- **Analyse-Tab Overlay (Prio 7):** Job aus tatsächlichem Pull → lookup welche Ability dieser Job im Plan hatte → Soll/Ist-Vergleich
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user