aboutsummaryrefslogtreecommitdiff
path: root/internal/game/triggers.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-06-29 18:13:33 -0400
committerhistoria <[not public]>2026-06-29 18:13:33 -0400
commit7d76673fa0707d204c7d084c8f90c8133c22a31a (patch)
tree6fc832b9f3fde6ed455abb535f6e28b0e5db1fd9 /internal/game/triggers.go
parentfeb80b7dde200d4121cd9f9c583a08f9869c5588 (diff)
downloadthehouseoficarus-7d76673fa0707d204c7d084c8f90c8133c22a31a.tar.gz
feat: migrated map (and bfs) to full 3D instead of individual 2D maps on different planes.
Diffstat (limited to 'internal/game/triggers.go')
-rw-r--r--internal/game/triggers.go307
1 files changed, 0 insertions, 307 deletions
diff --git a/internal/game/triggers.go b/internal/game/triggers.go
deleted file mode 100644
index cd1bbd3..0000000
--- a/internal/game/triggers.go
+++ /dev/null
@@ -1,307 +0,0 @@
-package game
-
-import (
- "fmt"
- "strings"
-
- "thehouseoficarus/internal/color"
- "thehouseoficarus/internal/engine"
- "thehouseoficarus/internal/net"
- "thehouseoficarus/internal/player"
- "thehouseoficarus/internal/world"
-)
-
-func (g *Game) TriggerSeqTick() {
- g.processPlayerTriggerSequences()
- g.processWorldTriggerSequences()
-}
-
-func (g *Game) TransientMobTick() {
- if g.Hub == nil {
- return
- }
- for _, inst := range g.MobStore.AllInstances() {
- if inst.Owner == "" || inst.HP <= 0 {
- continue
- }
- if !inst.DespawnOnLeave {
- continue
- }
-
- g.charsMu.Lock()
- ownerSess := g.loggedInChars[inst.Owner]
- g.charsMu.Unlock()
- if ownerSess == nil || ownerSess.Player == nil {
- continue
- }
-
- ownerRoom := ownerSess.Player.RoomID
- allowed := inst.DespawnRooms
- if len(allowed) == 0 {
- allowed = []int{inst.HomeRoomID}
- }
- inAllowed := false
- for _, r := range allowed {
- if ownerRoom == r {
- inAllowed = true
- break
- }
- }
- if inAllowed {
- inst.DespawnCounter = inst.DespawnTickCount()
- continue
- }
- inst.DecrementDespawnCounter()
- if inst.DespawnCounter <= 0 {
- g.MobStore.RemoveInstance(inst.InstanceID)
- for _, sess := range g.Hub.PlayersInRoom(inst.RoomID) {
- sess.WriteLine(g.colorize(sess, "broadcast",
- fmt.Sprintf("%s fades away.", mobDisplayName(inst, true))))
- }
- }
- }
-}
-
-func (g *Game) processPlayerTriggerSequences() {
- seqs := g.TriggerStore.SnapshotPlayerSeqs()
- for _, seq := range seqs {
- g.charsMu.Lock()
- sess := g.loggedInChars[seq.PlayerName]
- g.charsMu.Unlock()
- if sess == nil || sess.Player == nil {
- g.TriggerStore.RemovePlayerSeq(seq.PlayerName, seq.TriggerID)
- continue
- }
- p := sess.Player
- if p.RoomID != seq.RoomID {
- continue
- }
-
- seq.Wait--
- if seq.Wait > 0 {
- continue
- }
-
- var jobs []world.TriggerStep
- for len(seq.Steps) > 0 && seq.Wait <= 0 {
- step := seq.Steps[0]
- seq.Steps = seq.Steps[1:]
- jobs = append(jobs, step)
- if len(seq.Steps) > 0 {
- seq.Wait = seq.Steps[0].Delay
- }
- }
-
- for _, step := range jobs {
- s := step
- g.executeTriggerStep(sess, p, &s, seq.RoomID, seq.FlagValue)
- }
-
- if len(seq.Steps) == 0 {
- g.TriggerStore.RemovePlayerSeq(seq.PlayerName, seq.TriggerID)
- if p.RoomID == seq.RoomID && sess.State == net.StateGame {
- g.writePrompt(sess)
- }
- }
- }
-}
-
-func (g *Game) processWorldTriggerSequences() {
- seqs := g.TriggerStore.SnapshotWorldSeqs()
- for _, seq := range seqs {
- seq.Wait--
- if seq.Wait > 0 {
- continue
- }
-
- var jobs []world.TriggerStep
- for len(seq.Steps) > 0 && seq.Wait <= 0 {
- step := seq.Steps[0]
- seq.Steps = seq.Steps[1:]
- jobs = append(jobs, step)
- if len(seq.Steps) > 0 {
- seq.Wait = seq.Steps[0].Delay
- }
- }
-
- for _, step := range jobs {
- g.executeWorldTriggerStep(&step, seq.RoomID, seq.FlagValue)
- }
-
- if len(seq.Steps) == 0 {
- g.TriggerStore.RemoveWorldSeq(seq.TriggerID)
- }
- }
-}
-
-func (g *Game) executeTriggerStep(sess *net.Session, p *player.Player, step *world.TriggerStep, roomID int, flagValue any) {
- seqSpec := g.resolveColor(sess, "sequence")
- broadcastSpec := g.resolveColor(sess, "broadcast")
- playerMode := g.colorMode(sess)
- if step.Message != "" {
- msg := expandTemplate(step.Message, p.Name, flagValue)
- msg = color.ExpandTagsDefault(playerMode, seqSpec, msg)
- sess.WriteLine(msg)
- }
- if step.Broadcast != "" && g.Hub != nil {
- msg := expandTemplate(step.Broadcast, p.Name, flagValue)
- for _, other := range g.Hub.PlayersInRoom(roomID) {
- otherMode := g.colorMode(other)
- rendered := color.ExpandTagsDefault(otherMode, broadcastSpec, msg)
- other.WriteLine(g.colorize(other, "broadcast", rendered))
- }
- }
- if step.BroadcastGlobal != "" && g.Hub != nil {
- msg := expandTemplate(step.BroadcastGlobal, p.Name, flagValue)
- for _, other := range g.Hub.AllSessions() {
- if other.Player != nil {
- otherMode := g.colorMode(other)
- rendered := color.ExpandTagsDefault(otherMode, broadcastSpec, msg)
- other.WriteLine(g.colorize(other, "broadcast", rendered))
- }
- }
- }
- if len(step.SetFlags) > 0 {
- g.Flags.SetAll(step.SetFlags)
- }
- if len(step.SetPlayerFlags) > 0 {
- for k, v := range step.SetPlayerFlags {
- g.setPlayerFlag(p, k, v)
- }
- g.AccountStore.SaveCharacter(p)
- }
- if step.GiveItem != "" {
- slot := p.FirstFreeSlot()
- if slot == -1 {
- sess.WriteLine("Your inventory is too full to receive that.")
- } else {
- p.SetInvSlot(slot, &player.InventorySlot{ItemID: step.GiveItem, Quantity: 1})
- g.AccountStore.SaveCharacter(p)
- }
- }
- if step.TakeItem != "" {
- if p.HasItem(step.TakeItem) {
- p.RemoveItem(step.TakeItem, 1)
- g.AccountStore.SaveCharacter(p)
- }
- }
- if step.Heal > 0 {
- p.HP += step.Heal
- if maxHP := p.MaxHP(); p.HP > maxHP {
- p.HP = maxHP
- }
- g.AccountStore.SaveCharacter(p)
- sess.WriteLine(fmt.Sprintf("You regain %d hitpoints.", step.Heal))
- }
- if step.SpawnMob != nil {
- g.spawnTriggerMob(sess, p, step.SpawnMob, roomID)
- }
- if step.DespawnMob != "" {
- g.despawnTriggerMobs(step.DespawnMob, p.Name)
- }
- if step.Teleport > 0 {
- g.teleportPlayer(sess, p, step.Teleport)
- }
-}
-
-func (g *Game) executeWorldTriggerStep(step *world.TriggerStep, roomID int, flagValue any) {
- if step.Broadcast != "" && g.Hub != nil {
- msg := expandTemplate(step.Broadcast, "", flagValue)
- broadcastSpec := g.resolveColor(nil, "broadcast")
- for _, other := range g.Hub.PlayersInRoom(roomID) {
- otherMode := g.colorMode(other)
- rendered := color.ExpandTagsDefault(otherMode, broadcastSpec, msg)
- other.WriteLine(g.colorize(other, "broadcast", rendered))
- }
- }
- if step.BroadcastGlobal != "" && g.Hub != nil {
- msg := expandTemplate(step.BroadcastGlobal, "", flagValue)
- broadcastSpec := g.resolveColor(nil, "broadcast")
- for _, other := range g.Hub.AllSessions() {
- if other.Player != nil {
- otherMode := g.colorMode(other)
- rendered := color.ExpandTagsDefault(otherMode, broadcastSpec, msg)
- other.WriteLine(g.colorize(other, "broadcast", rendered))
- }
- }
- }
- if len(step.SetFlags) > 0 {
- g.Flags.SetAll(step.SetFlags)
- }
- if step.SpawnMob != nil {
- g.spawnWorldTriggerMob(step.SpawnMob, roomID)
- }
- if step.DespawnMob != "" {
- g.despawnTriggerMobs(step.DespawnMob, "")
- }
-}
-
-func (g *Game) spawnTriggerMob(sess *net.Session, p *player.Player, cfg *world.SpawnMobConfig, roomID int) {
- if cfg.ID == "" {
- return
- }
- def, err := g.MobStore.LoadDef(cfg.ID)
- if err != nil {
- return
- }
- inst := g.MobStore.SpawnTransient(def, cfg, roomID, p.Name)
- if inst == nil {
- return
- }
- inst.ResetDespawnCounter(engine.ToTicks(cfg.DespawnTicks))
- sess.WriteLine(g.colorize(sess, "broadcast", mobDisplayName(inst, true)+" appears!"))
-}
-
-func (g *Game) spawnWorldTriggerMob(cfg *world.SpawnMobConfig, roomID int) {
- if cfg.ID == "" {
- return
- }
- def, err := g.MobStore.LoadDef(cfg.ID)
- if err != nil {
- return
- }
- inst := g.MobStore.SpawnTransient(def, cfg, roomID, "")
- if inst == nil {
- return
- }
- inst.ResetDespawnCounter(engine.ToTicks(cfg.DespawnTicks))
- if g.Hub != nil {
- for _, sess := range g.Hub.PlayersInRoom(roomID) {
- sess.WriteLine(g.colorize(sess, "broadcast",
- mobDisplayName(inst, true)+" appears!"))
- }
- }
-}
-
-func (g *Game) despawnTriggerMobs(mobID string, owner string) {
- for _, inst := range g.MobStore.AllInstances() {
- if inst.DefID != mobID {
- continue
- }
- if owner != "" && inst.Owner != owner {
- continue
- }
- if inst.HP <= 0 {
- g.MobStore.RemoveInstance(inst.InstanceID)
- continue
- }
- if g.Hub != nil {
- for _, sess := range g.Hub.PlayersInRoom(inst.RoomID) {
- sess.WriteLine(g.colorize(sess, "broadcast",
- fmt.Sprintf("%s vanishes.", mobDisplayName(inst, true))))
- }
- }
- g.MobStore.RemoveInstance(inst.InstanceID)
- }
-}
-
-func expandTemplate(tmpl string, playerName string, flagValue any) string {
- s := tmpl
- if playerName != "" {
- s = strings.ReplaceAll(s, "%p", playerName)
- }
- if flagValue != nil {
- s = strings.ReplaceAll(s, "%v", fmt.Sprint(flagValue))
- }
- return s
-}