aboutsummaryrefslogtreecommitdiff
path: root/internal/world/mob.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-06-25 20:33:47 -0400
committerhistoria <[not public]>2026-06-25 20:33:47 -0400
commit84d74ca4351a97148ad8339676f9df7946bc21fb (patch)
treea9f50ac56e8bbcdf2b307ef6f7143b67bce46c61 /internal/world/mob.go
parentc55d0e4150b23f2c5c9f96bbc3d4dc2fc6dbaa36 (diff)
downloadthehouseoficarus-84d74ca4351a97148ad8339676f9df7946bc21fb.tar.gz
feat: trigger system for scripted events added.
Diffstat (limited to 'internal/world/mob.go')
-rw-r--r--internal/world/mob.go45
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