feat: Gildenkampf-Simulation (inkl. Pilzkatapult) #2
No reviewers
Labels
No labels
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
DasAoD/sf-guildscanner!2
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/battle-simulation"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Was
Baut eine echte Kampfsimulation (
sf_api::simulate) für ausgewählte Gilden in den Server ein, als präzisere Alternative/Ergänzung zum bestehenden Level-basierten Strikt-Modus.Validiert gegen drei reale Gilden-Matchups (Kéglimugli 1 Mitglied mit/ohne Pilzkatapult, Boba 36 Mitglieder, Wartezimmer 48 Mitglieder) — alle Ergebnisse stimmten mit dem tatsächlichen Kampfausgang überein. Details zur Validierung im Verlauf von
examples/sim_probe.rs(bereits vorher gemergter Teil dieses Branches).Neue Endpunkte
POST /api/simulate— simuliert ausgewählte Gilden im Hintergrund (guild_names,mushrooms0-3,iterations, default 2500 — analog zum Default von sf-tools)POST /api/simulate/abort,GET /api/simulate/progressPOST /api/refresh-own-fighters— erzwingt sofortiges Neuladen der eigenen KampfwertePilzkatapult
Bis zu 3 Riesenpilze treffen vor Kampfbeginn je ein zufälliges Gegner-Mitglied und ziehen ihm additiv 50 Prozentpunkte seines ursprünglichen Lebens ab (2 Treffer auf dasselbe Ziel = 0% Leben, nicht 25% wie bei multiplikativem Stacking — das war ein Bug in einer früheren Version, siehe Commit-Historie). Ziele werden pro simuliertem Einzelkampf neu gewürfelt, nicht einmal für den ganzen Iterations-Batch.
Cache der eigenen Kampfwerte
Damit nicht vor jeder Simulation alle eigenen aktiven Mitglieder per
ViewPlayerneu geholt werden müssen, aber auch keine veralteten Werte benutzt werden:Architektur-Fix
ScanProgress/cancel_requestedlagen bisher inAppState, das für die gesamte Dauer jedes Spielserver-Requests gesperrt ist (dieSimpleSessionlebt dort) —/api/progressund/api/scan/abortkonnten dadurch hinter einem laufenden Request hängen bleiben. Jetzt in einem eigenenProgressState-Lock (AppHandlesbündelt beide Locks als Axum-State). Gleiches Muster für die neue Simulation, die durch deutlich mehrViewPlayer-Calls das Problem sonst verschärft hätte.Test
cargo build --all-targetskompiliert ohne Warnungen (Server +sim_probe-Example).node --check), alle$('id')-Referenzen im Script gegen vorhandene HTML-IDs abgeglichen.🤖 Generated with Claude Code