aboutsummaryrefslogtreecommitdiff
path: root/internal/world/world.go
diff options
context:
space:
mode:
authorworkhorse <workhorse@localhost.localdomain>2026-06-19 20:24:52 -0400
committerworkhorse <workhorse@localhost.localdomain>2026-06-19 20:24:52 -0400
commit8ee8982b8759bcae116647cc993867f4c8b0a6ce (patch)
treeee01f7b1d745cbc94d9981108a1209527487b3e5 /internal/world/world.go
parent2bec24859af8f03c80a0a58e3240519942450167 (diff)
downloadthehouseoficarus-8ee8982b8759bcae116647cc993867f4c8b0a6ce.tar.gz
reorganized items, objects, and rooms in directories. oranized module names. added startup checks.
Diffstat (limited to 'internal/world/world.go')
-rw-r--r--internal/world/world.go52
1 files changed, 31 insertions, 21 deletions
diff --git a/internal/world/world.go b/internal/world/world.go
index 3094c54..0b40918 100644
--- a/internal/world/world.go
+++ b/internal/world/world.go
@@ -7,36 +7,38 @@ import (
"strings"
"sync"
+ "thehouseoficarus/internal/action"
"gopkg.in/yaml.v3"
)
type World struct {
- dataDir string
- mu sync.Mutex
- groundItems map[int][]*groundEntry
- seeded map[int]bool
- objStates map[string]*ObjState
- objMoves []ObjMove
+ dataDir string
+ mu sync.Mutex
+ roomPathIndex map[int]string
+ groundItems map[int][]*groundEntry
+ seeded map[int]bool
+ objStates map[string]*ObjState
+ objMoves []ObjMove
}
func New(dataDir string) *World {
return &World{
- dataDir: dataDir,
- groundItems: make(map[int][]*groundEntry),
- seeded: make(map[int]bool),
- objStates: make(map[string]*ObjState),
+ dataDir: dataDir,
+ roomPathIndex: action.BuildRoomIndex(filepath.Join(dataDir, "rooms")),
+ groundItems: make(map[int][]*groundEntry),
+ seeded: make(map[int]bool),
+ objStates: make(map[string]*ObjState),
}
}
func (w *World) LoadRoom(id int) (*Room, error) {
- path := filepath.Join(w.dataDir, "rooms", fmt.Sprintf("%d.yaml", id))
+ path, ok := w.roomPathIndex[id]
+ if !ok {
+ return nil, fmt.Errorf("read room %d: no such room", id)
+ }
data, err := os.ReadFile(path)
if err != nil {
- path = filepath.Join(w.dataDir, "rooms", "player_housing", fmt.Sprintf("%d.yaml", id))
- data, err = os.ReadFile(path)
- if err != nil {
- return nil, fmt.Errorf("read room %d: %w", id, err)
- }
+ return nil, fmt.Errorf("read room %d: %w", id, err)
}
var room Room
if err := yaml.Unmarshal(data, &room); err != nil {
@@ -46,8 +48,8 @@ func (w *World) LoadRoom(id int) (*Room, error) {
if room.Exits == nil {
room.Exits = make(map[ExitDir]ExitDef)
}
- if room.Spawns == nil {
- room.Spawns = make([]SpawnDef, 0)
+ if room.ItemSpawns == nil {
+ room.ItemSpawns = make([]SpawnDef, 0)
}
if room.Mobs == nil {
room.Mobs = make([]RoomMob, 0)
@@ -84,10 +86,10 @@ func (w *World) SeedGroundItems(roomID int) {
w.mu.Lock()
defer w.mu.Unlock()
- for _, s := range room.Spawns {
+ for _, s := range room.ItemSpawns {
merged := false
for _, e := range w.groundItems[roomID] {
- if e.quantity > 0 && strings.EqualFold(e.itemID, s.ItemID) &&
+ if e.quantity > 0 && strings.EqualFold(e.itemID, s.ID) &&
(e.reserveTimer <= 0 || e.reservedFor == "") &&
e.despawnTimer <= 0 {
e.quantity += s.Quantity
@@ -100,7 +102,7 @@ func (w *World) SeedGroundItems(roomID int) {
}
if !merged {
e := &groundEntry{
- itemID: s.ItemID,
+ itemID: s.ID,
quantity: s.Quantity,
isSpawn: true,
respawnDelay: int(s.RespawnTicks),
@@ -111,6 +113,14 @@ func (w *World) SeedGroundItems(roomID int) {
}
}
+func (w *World) RoomIndex() map[int]bool {
+ ids := make(map[int]bool)
+ for id := range w.roomPathIndex {
+ ids[id] = true
+ }
+ return ids
+}
+
func (w *World) Tick() {
w.mu.Lock()
defer w.mu.Unlock()