diff options
Diffstat (limited to 'internal/game/action_talk.go')
| -rw-r--r-- | internal/game/action_talk.go | 127 |
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)) - } -} |
