diff options
| author | historia <[not public]> | 2026-06-25 20:33:47 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-06-25 20:33:47 -0400 |
| commit | 84d74ca4351a97148ad8339676f9df7946bc21fb (patch) | |
| tree | a9f50ac56e8bbcdf2b307ef6f7143b67bce46c61 /internal/world/mob.go | |
| parent | c55d0e4150b23f2c5c9f96bbc3d4dc2fc6dbaa36 (diff) | |
| download | thehouseoficarus-84d74ca4351a97148ad8339676f9df7946bc21fb.tar.gz | |
feat: trigger system for scripted events added.
Diffstat (limited to 'internal/world/mob.go')
| -rw-r--r-- | internal/world/mob.go | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/internal/world/mob.go b/internal/world/mob.go index f11d6fe..d3ea05b 100644 --- a/internal/world/mob.go +++ b/internal/world/mob.go @@ -127,6 +127,14 @@ type MobInstance struct { CompleteMessage string TalkConfig *behavior.TalkConfig + + Owner string + OwnerOnly bool + SpawnedByTrigger bool + DespawnOnLeave bool + DespawnRooms []int + DespawnTicks float64 + DespawnCounter int } func (m *MobInstance) IsTalkable() bool { return m.TalkConfig != nil } @@ -215,6 +223,20 @@ func (m *MobInstance) StartRegen() { } } +func (m *MobInstance) DespawnTickCount() int { + return m.DespawnCounter +} + +func (m *MobInstance) DecrementDespawnCounter() { + if m.DespawnCounter > 0 { + m.DespawnCounter-- + } +} + +func (m *MobInstance) ResetDespawnCounter(ticks int) { + m.DespawnCounter = ticks +} + type MobStore struct { dataDir string mu sync.Mutex @@ -326,6 +348,29 @@ func (s *MobStore) RollIdleDescription(inst *MobInstance) { inst.WanderTickCounter = 0 } +func (s *MobStore) SpawnTransient(def *MobDef, cfg *SpawnMobConfig, roomID int, owner string) *MobInstance { + s.mu.Lock() + defer s.mu.Unlock() + + instID := fmt.Sprintf("trigger_%s_%d_%d", cfg.ID, roomID, len(s.instances)) + inst := NewMobInstance(def, instID, roomID, nil, 0) + inst.Owner = owner + inst.OwnerOnly = cfg.OwnerOnly + inst.SpawnedByTrigger = true + inst.DespawnOnLeave = cfg.DespawnOnLeave + inst.DespawnRooms = cfg.DespawnRooms + inst.DespawnTicks = cfg.DespawnTicks + inst.IdleDescription = pickIdleDescription(def.IdleDescriptions) + s.instances[instID] = inst + return inst +} + +func (s *MobStore) RemoveInstance(instanceID string) { + s.mu.Lock() + defer s.mu.Unlock() + delete(s.instances, instanceID) +} + func (s *MobStore) SeedMobs(roomID int, entries []RoomMob) { type defWrapper struct { def *MobDef |
