aboutsummaryrefslogtreecommitdiff
path: root/internal/game/action_talk.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/game/action_talk.go')
-rw-r--r--internal/game/action_talk.go41
1 files changed, 21 insertions, 20 deletions
diff --git a/internal/game/action_talk.go b/internal/game/action_talk.go
index 560b34d..5b3a095 100644
--- a/internal/game/action_talk.go
+++ b/internal/game/action_talk.go
@@ -20,12 +20,11 @@ func (g *Game) startMobTalk(sess *net.Session, p *player.Player, mob *world.MobI
}
if node, ok := cfg.Nodes["start"]; ok {
- p.ActionState = &ActionState{Type: ActionTalking, TargetName: mob.Name}
p.Action = &action.Action{
- Type: "talk",
+ Type: action.TypeTalk,
TargetID: mob.DefID,
TargetName: mob.Name,
- Data: map[string]any{"node": "start", "talk_cfg": cfg},
+ Data: &action.TalkData{Node: "start", Cfg: cfg},
}
g.showTalkNode(sess, node)
} else {
@@ -41,12 +40,11 @@ func (g *Game) startTalk(sess *net.Session, p *player.Player, obj *object.Object
}
if node, ok := cfg.Nodes["start"]; ok {
- p.ActionState = &ActionState{Type: ActionTalking, TargetName: obj.Name}
p.Action = &action.Action{
- Type: "talk",
+ Type: action.TypeTalk,
TargetID: obj.ID,
TargetName: obj.Name,
- Data: map[string]any{"node": "start", "talk_cfg": cfg},
+ Data: &action.TalkData{Node: "start", Cfg: cfg},
}
g.showTalkNode(sess, node)
} else {
@@ -68,15 +66,17 @@ func (g *Game) showTalkNode(sess *net.Session, node action.TalkNode) {
if v, ok := g.Flags.Get("guard_hostile"); ok && v != nil {
g.Flags.Delete("guard_hostile")
p := sess.Player
- if p != nil && p.Action != nil && p.Action.Data["steal_guard"] == true {
- guardMob := g.findGuardInRoom(p.RoomID, "guard")
- if guardMob != nil {
- sess.State = net.StateGame
- g.cancelAction(p)
- guardMob.Protected = false
- g.startCombat(sess, p, guardMob)
+ if p != nil && p.Action != nil {
+ if td, ok := p.Action.Data.(*action.TalkData); ok && td.StealGuard {
+ guardMob := g.findGuardInRoom(p.RoomID, "guard")
+ if guardMob != nil {
+ sess.State = net.StateGame
+ g.cancelAction(p)
+ guardMob.Protected = false
+ g.startCombat(sess, p, guardMob)
+ }
+ return
}
- return
}
}
}
@@ -101,7 +101,7 @@ func (g *Game) showTalkNode(sess *net.Session, node action.TalkNode) {
func (g *Game) handleTalkInput(sess *net.Session, input string) {
p := sess.Player
- if p == nil || p.Action == nil || p.Action.Type != "talk" {
+ if p == nil || p.Action == nil || p.Action.Type != action.TypeTalk {
sess.State = net.StateGame
g.writePrompt(sess)
return
@@ -116,20 +116,21 @@ func (g *Game) handleTalkInput(sess *net.Session, input string) {
return
}
- if _, ok := p.Action.Data["estate_directory"].(bool); ok {
+ if td, ok := p.Action.Data.(*action.TalkData); ok && td.EstateDirectory {
g.handleEstateDirectoryTalk(sess, input)
return
}
- cfg, ok := p.Action.Data["talk_cfg"].(*action.TalkConfig)
- if !ok || cfg == nil {
+ td, ok := p.Action.Data.(*action.TalkData)
+ if !ok || td.Cfg == nil {
g.cancelAction(p)
sess.State = net.StateGame
g.writePrompt(sess)
return
}
+ cfg := td.Cfg
- nodeKey := p.Action.Data["node"].(string)
+ nodeKey := td.Node
node, ok := cfg.Nodes[nodeKey]
if !ok {
g.cancelAction(p)
@@ -176,7 +177,7 @@ func (g *Game) handleTalkInput(sess *net.Session, input string) {
if chosen.Goto != "" {
if nextNode, ok := cfg.Nodes[chosen.Goto]; ok {
- p.Action.Data["node"] = chosen.Goto
+ td.Node = chosen.Goto
g.showTalkNode(sess, nextNode)
return
}