14 — Kampfformeln und Rundenablauf #15
Reference in New Issue
Block a user
Delete Branch "%!s()"
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?
Teil der Map #1 · Type:
wayfinder:grilling· Blocked by: — · graduiert aus #2Wie laeuft ein Kampf ab, und mit welchen Formeln? Reihenfolge, Trefferformel, Schadensformel, Krit, Aktionen pro Zug, Flucht, Zufall und Seed.
Volle Fragestellung (kanonisch):
.scratch/rustkeep-1.0/issues/14-kampfformeln-und-rundenablauf.mdNachtrag aus #3 (Typ-Registry): Dieses Ticket entscheidet zusaetzlich die Kampfsemantik von Faehigkeiten — was sie kosten (Ausdauer, eigener Pool, Ladungen), ob es Abklingzeiten gibt und wie sie gezaehlt werden, wann eine Faehigkeit gesperrt ist und woran der Spieler das sieht. #3 hat Faehigkeiten als Registry festgelegt und ihre Kampfsemantik hierher delegiert. Kanonischer Ticketkoerper ist entsprechend erweitert.
Aufgeloest in
d51ebb2. Kanonische Fassung:.scratch/rustkeep-1.0/issues/14-kampfformeln-und-rundenablauf.mdZahlen gehoeren nicht hierher — die Map haelt Balancing getrennt. Hier stehen Formeln und Ablauf.
Rundenablauf
Ein Zug = Spielerhandlung plus alle Gegnerreaktionen. Nicht jede Handlung ein eigener Zug: bei drei Gegnern tickte ein Gift-Debuff sonst viermal pro Runde, und ein Tastendruck erzeugte vier Zuege — das braeche die Zusage aus #12, die #13 gerade gemessen hat.
Reihenfolge ueber Initiative, einmal beim Betreten des Kampfes aus
dexterityplus Wurf gewuerfelt und alsi32am Wesen gehalten. Ausdruecklich nicht als Reihenfolgeliste ausCreatureRef: die waere eine zweite Indexliste mit demselben Ungueltigkeitsproblem beim Tod eines Gegners. Gleichstand geht an den Spieler.Schritt 4 nach jeder Handlung: sonst schlaegt ein Gegner zu, den ein Dornenpanzer eine Handlung zuvor getoetet hat. Schritt 5 erst nach dem Leeren: sonst zeigt ein
creature_died-Trigger auf einen bereits entfernten Gegner. Innerhalb eines Zuges bleiben Indizes stabil — das ist die Antwort auf die Frage, die #8 hierher gereicht hatte.Genau eine Handlung pro Zug, kein Ausdauer-Budget:
max_staminaist die Ressource fuer Faehigkeiten.Formeln
Die Frage aus dem Ticketkoerper loest sich auf: ob
critical_factorden Rohschaden oder den geminderten multipliziert, ist mathematisch belanglos — multiplikativ ist kommutativ. Festzulegen war nur, dass beide multiplikativ bleiben.Drei Klemmbereiche mit Grund: Resistenz bei
0.8, weil1.0Immunitaet und damit ein Spielabbruch waere (nach unten-1.0fuer Verwundbarkeit);max(1, …), damit kein Kampf rechnerisch ewig laeuft;0.05/0.95, damit weder Verteidiger noch Angreifer unfehlbar werden. Keine Schadensstreuung — der Krit liefert die Varianz.Zufall
Eigener xorshift64* (acht Zeilen statt einer Dependency), Seed als Feld in
Gameund damit im Speicherstand. Das ist eine Spielentscheidung, keine Implementierungsfrage: Nachladen wuerfelt nicht neu, Save-Scumming laeuft ins Leere.Faehigkeiten (Bestellung aus #3)
costin Ausdauer — kein zweiter Ressourcenpool.cooldownin Zuegen alscooldowns: HashMap<AbilityId, u32>am Creature. Gesperrt heisst: Ausdauer < cost, oder Cooldown > 0, oderconditionunerfuellt — Ausloesen ergibt dannOutcome::Rejectedaus #13 und kostet keinen Zug. Die Regel steht im Spielkern, nicht in der UI, sonst kennt ein Script sie nicht.Ausdauer regeneriert pro Zug um einen festen Betrag — das gibt
Waitaus #12 seinen Zweck.Achte Registry: Wesen
Beim Aufschreiben der KI fiel eine Luecke auf, die seit #3 offen lag: Wesen stehen in keiner Registry. #3 hatte fuenf, #8 ergaenzte Affixe, #9 Quests — woher Gegnerdefinitionen kommen, hat nie jemand gesagt, obwohl #11 sie in Raeume setzen und #17 Beute an sie haengen muss.
Erster passender und verfuegbarer Eintrag gewinnt. Passt nichts, setzt der Gegner aus — einer, der die Runde blockiert, waere schlimmer. Fehlt der bedingungslose letzte Eintrag, gibt es eine Ladewarnung ueber die Maschinerie aus #5.
[balance]— ausdrueckliche Ausnahme zu #4Fuenf Stellknoepfe (
AUSWEICH,FLUCHT, Ausdauer-Regeneration, Resistenz-Deckel, Treffer-Klemmbereich) liegen als TOML-Tabelle und verschmelzen feldweise. Das widerspricht der Ganz-oder-gar-nicht-Regel aus #4, und zwar bewusst: ein Mod, der nurAUSWEICHdreht, muesste sonst alle fuenf abschreiben, und ein sechster Knopf braeche ihn stillschweigend.Die Ausnahme bleibt eng, weil ihre Begruendung eng ist:
[balance]hat ein festes, der Engine bekanntes Schema. Genau das fehlte bei Inhalt mit offenen Feldern — das war #4s Argument gegen feldweises Patchen, und es greift hier nicht. Standardwerte liegen in der Engine, nicht incore.Vier Nachtraege an geschlossene Tickets
damage-Aktion wirdmenge = amount + scale * damage-Attribut, beide optional — eine Formel fuer Basisangriff (scale = 1.0), Feuerball (amount = 20) und Wuchtschlag (scale = 1.5). Dazufleeals achte Aktioninitiative: i32undcooldownsam Creature, RNG-Seed inGame, undenemiesist der laufende Kampf, nicht die Etagecombat_startedundcombat_ended { outcome: Victory | Fled }— elf Events. Ohne die Unterscheidung zaehlte Weglaufen als SiegGameOverals elfter Screen. Bewusst nicht die lazy Variante: ein Abstiegs-Roguelike lebt davon, dass der Lauf am Ende erzaehlt wird — Etage, Zug, Gold, TodesursacheAuflagen
Game.enemies, Kampfbeginn ist ein Prefab-Ereignis[balance]-Knoepfecreatures-Registry