aboutsummaryrefslogtreecommitdiff
path: root/internal/game/action_talk.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-06-19 18:20:26 -0400
committerhistoria <[not public]>2026-06-19 18:20:26 -0400
commit0ea4eec5dd2122c6704216971eb1249276297867 (patch)
tree430fbbef04e837820f1d031c190f52ecd6112e25 /internal/game/action_talk.go
parent3a58125d14bb307f861b38c6c5b0a63babde7e08 (diff)
downloadthehouseoficarus-0ea4eec5dd2122c6704216971eb1249276297867.tar.gz
shop fixes, 'toggle' completely removed, movement speed increased
Diffstat (limited to 'internal/game/action_talk.go')
-rw-r--r--internal/game/action_talk.go127
1 files changed, 28 insertions, 99 deletions
diff --git a/internal/game/action_talk.go b/internal/game/action_talk.go
index c18e254..2f463c7 100644
--- a/internal/game/action_talk.go
+++ b/internal/game/action_talk.go
@@ -12,8 +12,8 @@ import (
)
func (g *Game) startMobTalk(sess *net.Session, p *player.Player, mob *world.MobInstance) {
- cfg, err := g.BehaviorStore.LoadTalk(mob.BehaviorID)
- if err != nil {
+ cfg := mob.TalkConfig
+ if cfg == nil {
sess.WriteLine("This person has nothing to say.")
return
}
@@ -24,7 +24,7 @@ func (g *Game) startMobTalk(sess *net.Session, p *player.Player, mob *world.MobI
Type: "talk",
TargetID: mob.DefID,
TargetName: mob.Name,
- Data: map[string]any{"node": "start", "behavior_id": mob.BehaviorID},
+ Data: map[string]any{"node": "start", "talk_cfg": cfg},
}
g.showTalkNode(sess, node)
} else {
@@ -33,8 +33,8 @@ func (g *Game) startMobTalk(sess *net.Session, p *player.Player, mob *world.MobI
}
func (g *Game) startTalk(sess *net.Session, p *player.Player, obj *object.ObjectDef) {
- cfg, err := g.BehaviorStore.LoadTalk(obj.BehaviorID)
- if err != nil {
+ cfg := obj.Talk
+ if cfg == nil {
sess.WriteLine("This person has nothing to say.")
return
}
@@ -45,7 +45,7 @@ func (g *Game) startTalk(sess *net.Session, p *player.Player, obj *object.Object
Type: "talk",
TargetID: obj.ID,
TargetName: obj.Name,
- Data: map[string]any{"node": "start", "behavior_id": obj.BehaviorID},
+ Data: map[string]any{"node": "start", "talk_cfg": cfg},
}
g.showTalkNode(sess, node)
} else {
@@ -66,12 +66,12 @@ func (g *Game) showTalkNode(sess *net.Session, node action.TalkNode) {
if g.WorldFlags["guard_hostile"] != nil {
delete(g.WorldFlags, "guard_hostile")
- p, _ := sess.Player.(*player.Player)
+ 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)
+ g.cancelAction(p)
guardMob.Protected = false
g.startCombat(sess, p, guardMob)
}
@@ -99,33 +99,30 @@ func (g *Game) showTalkNode(sess *net.Session, node action.TalkNode) {
}
func (g *Game) handleTalkInput(sess *net.Session, input string) {
- p, ok := sess.Player.(*player.Player)
- if !ok || p.Action == nil || p.Action.Type != "talk" {
+ p := sess.Player
+ if p == nil || p.Action == nil || p.Action.Type != "talk" {
sess.State = net.StateGame
g.writePrompt(sess)
return
}
- if p.Action.Data != nil {
- if bid, ok := p.Action.Data["behavior_id"].(string); ok && bid == "estate_directory_talk" {
- g.handleEstateDirectoryTalk(sess, input)
- return
- }
- }
-
input = strings.TrimSpace(input)
lower := strings.ToLower(input)
if lower == "bye" || lower == "exit" || lower == "end" || lower == "quit" {
- g.CancelAction(p)
+ g.cancelAction(p)
sess.State = net.StateGame
g.writePrompt(sess)
return
}
- behaviorID := p.Action.Data["behavior_id"].(string)
- cfg, err := g.BehaviorStore.LoadTalk(behaviorID)
- if err != nil {
- g.CancelAction(p)
+ if _, ok := p.Action.Data["estate_directory"].(bool); ok {
+ g.handleEstateDirectoryTalk(sess, input)
+ return
+ }
+
+ cfg, ok := p.Action.Data["talk_cfg"].(*action.TalkConfig)
+ if !ok || cfg == nil {
+ g.cancelAction(p)
sess.State = net.StateGame
g.writePrompt(sess)
return
@@ -134,7 +131,7 @@ func (g *Game) handleTalkInput(sess *net.Session, input string) {
nodeKey := p.Action.Data["node"].(string)
node, ok := cfg.Nodes[nodeKey]
if !ok {
- g.CancelAction(p)
+ g.cancelAction(p)
sess.State = net.StateGame
g.writePrompt(sess)
return
@@ -142,7 +139,7 @@ func (g *Game) handleTalkInput(sess *net.Session, input string) {
idx, err := parseChoiceIndex(input)
if err != nil || idx <= 0 {
- g.CancelAction(p)
+ g.cancelAction(p)
sess.State = net.StateGame
g.writePrompt(sess)
return
@@ -163,14 +160,14 @@ func (g *Game) handleTalkInput(sess *net.Session, input string) {
}
if chosen == nil {
- g.CancelAction(p)
+ g.cancelAction(p)
sess.State = net.StateGame
g.writePrompt(sess)
return
}
if chosen.End {
- g.CancelAction(p)
+ g.cancelAction(p)
sess.State = net.StateGame
g.writePrompt(sess)
return
@@ -184,7 +181,7 @@ func (g *Game) handleTalkInput(sess *net.Session, input string) {
}
}
- g.CancelAction(p)
+ g.cancelAction(p)
sess.State = net.StateGame
g.writePrompt(sess)
}
@@ -197,8 +194,8 @@ func (g *Game) enterShop(sess *net.Session, cfg *action.ShopConfig) {
}
func (g *Game) applyNodeAction(sess *net.Session, na *action.NodeAction) {
- p, ok := sess.Player.(*player.Player)
- if !ok {
+ p := sess.Player
+ if p == nil {
return
}
@@ -225,9 +222,7 @@ func (g *Game) applyNodeAction(sess *net.Session, na *action.NodeAction) {
g.WorldFlags[k] = v
}
for k, v := range na.SetPlayerFlags {
- if p.Flags == nil {
- p.Flags = make(map[string]any)
- }
+ p.EnsureFlags()
p.Flags[k] = v
}
if na.TakeItem != "" {
@@ -254,7 +249,7 @@ func (g *Game) applyNodeAction(sess *net.Session, na *action.NodeAction) {
g.Hub.EnterRoom(sess, p.RoomID)
}
g.doLook(sess)
- g.RunEnterSteps(sess, p.RoomID)
+ g.runEnterSteps(sess, p.RoomID)
}
if na.Heal > 0 {
p.HP += na.Heal
@@ -274,69 +269,3 @@ func (g *Game) applyNodeAction(sess *net.Session, na *action.NodeAction) {
g.processSawmill(sess, p)
}
}
-
-func (g *Game) processSawmill(sess *net.Session, p *player.Player) {
- logTypes := map[string]struct {
- plankID string
- cost int
- name string
- }{
- "logs": {"planks", 5, "regular planks"},
- "oak_logs": {"oak_planks", 10, "oak planks"},
- "teak_logs": {"teak_planks", 20, "teak planks"},
- "mahogany_logs": {"mahogany_planks", 40, "mahogany planks"},
- }
-
- totalCost := 0
- totalPlanks := 0
- type plankResult struct {
- plankID string
- qty int
- }
-
- var results []plankResult
-
- for logID, info := range logTypes {
- qty := p.CountItem(logID)
- if qty == 0 {
- continue
- }
- cost := qty * info.cost
- totalCost += cost
- totalPlanks += qty
- results = append(results, plankResult{info.plankID, qty})
- p.RemoveItem(logID, qty)
- }
-
- if totalPlanks == 0 {
- sess.WriteLine("You don't have any logs to process.")
- return
- }
-
- if p.Credits < totalCost {
- sess.WriteLine(fmt.Sprintf("You need %d credits to process all your logs (you have %d).", totalCost, p.Credits))
- return
- }
-
- p.Credits -= totalCost
-
- processed := 0
- for _, r := range results {
- for i := 0; i < r.qty; i++ {
- freeSlot := p.FirstFreeSlot()
- if freeSlot == -1 {
- g.World.AddGroundItem(p.RoomID, r.plankID, r.qty-i)
- break
- }
- p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: r.plankID, Quantity: 1})
- processed++
- }
- }
-
- g.AccountStore.SaveCharacter(p)
-
- sess.WriteLine(fmt.Sprintf("The sawmill operator processes your logs into %d planks for %d credits.", processed, totalCost))
- if processed < totalPlanks {
- sess.WriteLine(fmt.Sprintf("Your inventory is full. The remaining %d planks fall to the ground.", totalPlanks-processed))
- }
-}