aboutsummaryrefslogtreecommitdiff
path: root/internal/game/sys_triggers.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/game/sys_triggers.go')
-rw-r--r--internal/game/sys_triggers.go124
1 files changed, 19 insertions, 105 deletions
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) {