aboutsummaryrefslogtreecommitdiff
path: root/internal/game/action_talk.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-06-19 13:28:06 -0400
committerhistoria <[not public]>2026-06-19 13:28:06 -0400
commit3a58125d14bb307f861b38c6c5b0a63babde7e08 (patch)
treebd89e866447d55e6dffd447d8ef5fabf9b8fbe9d /internal/game/action_talk.go
parent575a71dcfed3b9fa44af244836f638a23df05a9a (diff)
downloadthehouseoficarus-3a58125d14bb307f861b38c6c5b0a63babde7e08.tar.gz
feat: all skills kind of implemented, random prototype content added
Diffstat (limited to 'internal/game/action_talk.go')
-rw-r--r--internal/game/action_talk.go76
1 files changed, 76 insertions, 0 deletions
diff --git a/internal/game/action_talk.go b/internal/game/action_talk.go
index 1a21e7f..c18e254 100644
--- a/internal/game/action_talk.go
+++ b/internal/game/action_talk.go
@@ -106,6 +106,13 @@ func (g *Game) handleTalkInput(sess *net.Session, input string) {
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" {
@@ -263,4 +270,73 @@ func (g *Game) applyNodeAction(sess *net.Session, na *action.NodeAction) {
g.AccountStore.SaveCharacter(p)
}
}
+ if na.Sawmill {
+ 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))
+ }
}