07 — Game-State-Baum #8
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: #2, #3Wie sieht der Weltzustand als Rust-Datenstruktur aus? Ownership, Referenzform, Borrow-Checker-Konflikte.
Volle Fragestellung (kanonisch):
.scratch/rustkeep-1.0/issues/07-game-state-baum.mdAufgeloest in
f25f393. Kanonische Fassung:.scratch/rustkeep-1.0/issues/07-game-state-baum.mdDieses Ticket entscheidet Besitz und Verweisform — nicht die vollstaendige Feldliste, die kommt aus 14, 15 und 16.
Definitionen und Zustand sind getrennt
Registrieslebt nebenGame, nicht darin. Der Grund ist ein Rust-Fakt, kein Geschmack: als Feld kollidiertegame.player.angreifen(&game.registries)—&mutauf ein Feld plus&auf ein anderes geht innerhalb einer Funktion, aber nicht ueber einen Methodenaufruf auf&mut selfhinweg. Das ist jeder zweite Aufruf im Kampf. Signaturen werden durchgaengigfn irgendwas(&mut self, reg: &Registries), ein Screen bekommt(&mut Game, &Registries).Verweise per
String-ID, keine Indizes: Bei ein paar hundert Eintraegen und einer Handlung pro Tastendruck kaufen Indizes Geschwindigkeit, die niemand messen kann, und haengen dafuer an der Ladereihenfolge — die sich bei jedem installierten Mod aendert.Der Baum
Ein
Creaturefuer Held und Gegner — zwei Typen hiessen, die Kampfformeln zweimal zu schreiben oder eintrait Combatantmit genau zwei Implementierungen einzuziehen.Aber zwei Felder, keine gemeinsame
Vec. Der Grund ist die Charter: Solo-Held. "Gegner greift Gegner an" existiert nicht, also kauft die gemeinsameVeceine Symmetrie, die das Spiel nie braucht, und bezahlt sie mitsplit_at_mutin jeder Kampfroutine. Zwei Felder sind ein disjunkter Feld-Borrow, den Rust erlaubt.Ein
Floor, kein Backtracking. Haelt den Save klein, erspart dem Generator begehbare Rueckwege — Folge: Haendler muessen auf jeder Etage auftauchen koennen.Instanzzustand und die sechste Registry
Zwei Exemplare desselben Gegenstands duerfen sich unterscheiden, aber eine Instanz traegt Affix-IDs, keine freien Modifikatoren. Affixe sind eine neue moddbare Registry:
Damit bleibt der Save eine ID-Liste und der Preis
base_price × Π price_factor. Mit freien Modifikatoren koennte ein Zufallsschwert theoretisch alles, praktisch aber nichts, das ein Modder benennen oder ein Haendler bepreisen koennte.Stapelregel:
stackableund gleichedefund gleicheaffixes.Ein Eingang, ein Ausgang
Der Lesezugang liegt auf
Game, nicht aufCreature: Eine Aura mittarget = "all_enemies"wohnt beim Traeger (#2), also braucht das Lesen eines Gegner-Attributs die Modifikatoren des Helden — einCreaturekann seine eigenen Attribute gar nicht ausrechnen. Zwei Rechenwege waeren ein Bug, der sich als Balancing-Problem tarnt.Vier Quellen bei jedem Zugriff:
base->options->equipmentsamt Affixen -> befristetemodifiers. Kein Cache — das passiert pro Tastendruck, nicht pro Frame. Modifikatoren werden ausdruecklich nicht beim Ausruesten hineinkopiert: das machte das Lesen billiger und das Schreiben gefaehrlich.Auflagen
QuestProgress; Handler laufen durchGame::applyGame,ItemInstanceals{ id, affixes },optionsmuss mitFloor; Haendlerraum auf jeder Etage; Bodenloot istItemInstanceCreatureRef::Enemy(i)ueberlebt das Entfernen aus derVecnichtFolgen fuer bestehenden Code
Statszerfaellt inAttributesund Zustandsfelder,Playerwird zuCreature, nebenItementstehtItemInstance.