From 09d325dcf5e779eab5550d3fd3377bde50101428 Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Wed, 8 Jul 2026 19:59:14 -0400 Subject: feat: unify on use, on look, and on kill. all support same conditions/actions now. --- internal/game/sys_triggers.go | 124 +++++++----------------------------------- 1 file changed, 19 insertions(+), 105 deletions(-) (limited to 'internal/game/sys_triggers.go') diff --git a/internal/game/sys_triggers.go b/internal/game/sys_triggers.go index b542fdd..2e8b877 100644 --- a/internal/game/sys_triggers.go +++ b/internal/game/sys_triggers.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "thehouseoficarus/internal/color" + "thehouseoficarus/internal/behavior" "thehouseoficarus/internal/engine" "thehouseoficarus/internal/net" "thehouseoficarus/internal/player" @@ -82,7 +82,7 @@ func (g *Game) processPlayerTriggerSequences() { continue } - var jobs []world.TriggerStep + var jobs []behavior.StepAction for len(seq.Steps) > 0 && seq.Wait <= 0 { step := seq.Steps[0] seq.Steps = seq.Steps[1:] @@ -92,9 +92,8 @@ func (g *Game) processPlayerTriggerSequences() { } } - for _, step := range jobs { - s := step - g.executeTriggerStep(sess, p, &s, seq.RoomID, seq.FlagValue) + for i := range jobs { + g.executeTriggerStep(sess, p, &jobs[i], seq.RoomID, seq.FlagValue) } if len(seq.Steps) == 0 { @@ -114,7 +113,7 @@ func (g *Game) processGlobalTriggerSequences() { continue } - var jobs []world.TriggerStep + var jobs []behavior.StepAction for len(seq.Steps) > 0 && seq.Wait <= 0 { step := seq.Steps[0] seq.Steps = seq.Steps[1:] @@ -124,8 +123,8 @@ func (g *Game) processGlobalTriggerSequences() { } } - for _, step := range jobs { - g.executeGlobalTriggerStep(&step, seq.RoomID, seq.FlagValue) + for i := range jobs { + g.executeGlobalTriggerStep(&jobs[i], seq.RoomID, seq.FlagValue) } if len(seq.Steps) == 0 { @@ -134,106 +133,21 @@ func (g *Game) processGlobalTriggerSequences() { } } -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.SetGlobalFlags) > 0 { - g.GlobalFlags.SetAll(step.SetGlobalFlags) - } - 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) +// executeTriggerStep is a thin wrapper over applyStepAction for trigger player +// sequences (full player-targeted effects + sequence/broadcast/spawn fields). +func (g *Game) executeTriggerStep(sess *net.Session, p *player.Player, step *behavior.StepAction, roomID int, flagValue any) { + // On every step, evaluate the per-step condition (a trigger can now gate + // individual steps via the Condition field inherited from StepAction). + if step.Condition != nil && !g.checkCondition(sess, step.Condition) { + return } + g.applyStepAction(sess, p, step, roomID, scopePlayerSeq, flagValue) } -func (g *Game) executeGlobalTriggerStep(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.SetGlobalFlags) > 0 { - g.GlobalFlags.SetAll(step.SetGlobalFlags) - } - if step.SpawnMob != nil { - g.spawnWorldTriggerMob(step.SpawnMob, roomID) - } - if step.DespawnMob != "" { - g.despawnTriggerMobs(step.DespawnMob, "") - } +// executeGlobalTriggerStep is a thin wrapper over applyStepAction for global +// trigger sequences (no player; only broadcasts/global-flags/spawn/despawn). +func (g *Game) executeGlobalTriggerStep(step *behavior.StepAction, roomID int, flagValue any) { + g.applyStepAction(nil, nil, step, roomID, scopeGlobal, flagValue) } func (g *Game) spawnTriggerMob(sess *net.Session, p *player.Player, cfg *world.SpawnMobConfig, roomID int) { -- cgit v1.2.3