aboutsummaryrefslogtreecommitdiff
path: root/internal/world/mob.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-09-15 15:35:52 -0400
committerhistoria <[not public]>2026-09-15 15:35:52 -0400
commit0b0b25222b3131ada79ff78c28eb8bf07d977deb (patch)
tree2ceaef5203595044f66a8f00064cd8e017f8f48d /internal/world/mob.go
parent396c3facb8287b9a34076cae8f3d7b300d366d99 (diff)
downloadthehouseoficarus-0b0b25222b3131ada79ff78c28eb8bf07d977deb.tar.gz
feat: single-owner game state, transactional lifecycle, durable money on server stop
Diffstat (limited to 'internal/world/mob.go')
-rw-r--r--internal/world/mob.go24
1 files changed, 24 insertions, 0 deletions
diff --git a/internal/world/mob.go b/internal/world/mob.go
index f33b2f9..a794bdd 100644
--- a/internal/world/mob.go
+++ b/internal/world/mob.go
@@ -722,3 +722,27 @@ func (s *MobStore) SeedMobs(roomID int, entries []RoomMob) {
s.instances[instID] = inst
}
}
+
+// RekeyRooms remaps every live mob instance's RoomID and HomeRoomID per
+// idMap (oldID -> newID), including wander rooms. Uses delete-all-then-
+// set-all so a swap cannot clobber an entry mid-rekey.
+func (s *MobStore) RekeyRooms(idMap map[int]int) {
+ if len(idMap) == 0 {
+ return
+ }
+ s.mu.Lock()
+ defer s.mu.Unlock()
+ for _, inst := range s.instances {
+ if newID, ok := idMap[inst.RoomID]; ok && newID != inst.RoomID {
+ inst.RoomID = newID
+ }
+ if newID, ok := idMap[inst.HomeRoomID]; ok && newID != inst.HomeRoomID {
+ inst.HomeRoomID = newID
+ }
+ for i, room := range inst.WanderRooms {
+ if newID, ok := idMap[room]; ok && newID != room {
+ inst.WanderRooms[i] = newID
+ }
+ }
+ }
+}