aboutsummaryrefslogtreecommitdiff
path: root/internal/game/cmd_use.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-06-17 21:13:07 -0400
committerhistoria <[not public]>2026-06-17 21:13:07 -0400
commitec2e94e3463654a6288464a4c070b48ef9bf7368 (patch)
tree3c5df0f9a6a5968fa4c725a7d331825883ae798c /internal/game/cmd_use.go
parenteef5ddaa94f8cff6010d092c30fed53d2be01524 (diff)
downloadthehouseoficarus-ec2e94e3463654a6288464a4c070b48ef9bf7368.tar.gz
feat: smithing added, item/object interaction reworked. recipes and menus refactored.
Diffstat (limited to 'internal/game/cmd_use.go')
-rw-r--r--internal/game/cmd_use.go69
1 files changed, 39 insertions, 30 deletions
diff --git a/internal/game/cmd_use.go b/internal/game/cmd_use.go
index 247df72..cb521f3 100644
--- a/internal/game/cmd_use.go
+++ b/internal/game/cmd_use.go
@@ -10,6 +10,11 @@ import (
)
func (g *Game) doUse(sess *net.Session, input string) {
+ if strings.TrimSpace(input) == "" {
+ g.doHelp(sess, "use")
+ return
+ }
+
p := sess.Player.(*player.Player)
g.CancelAction(p)
@@ -94,12 +99,11 @@ func (g *Game) doUseItemOnTarget(sess *net.Session, p *player.Player, itemAName,
return
}
if len(filtered) == 1 {
- g.startSmelt(sess, p, &filtered[0], def.Name)
+ g.promptHowMany(sess, filtered[0].ID)
return
}
- sess.PendingRecipeItem = itemAID
- sess.PendingCookMenu = smeltRecipesToMenuData(filtered)
- sess.State = net.StateSmeltRecipe
+ sess.PendingMenu = recipeMenuData(filtered)
+ sess.State = net.StateRecipeChoice
sess.WriteLine("\nWhat would you like to smelt?")
for i, r := range filtered {
sess.WriteLine(fmt.Sprintf(" %d) %s", i+1, g.recipeName(sess, &r)))
@@ -107,13 +111,21 @@ func (g *Game) doUseItemOnTarget(sess *net.Session, p *player.Player, itemAName,
sess.WriteLine(fmt.Sprintf(" %d) Nothing", len(filtered)+1))
return
}
+ if recipes[0].Type == "smithing" {
+ if !g.hasToolType(p, "hammer") {
+ sess.WriteLine("You need a hammer to smith.")
+ return
+ }
+ allRecipes, _ := g.RecipeStore.LoadAll()
+ g.showSmithTable(sess, p, itemAID, allRecipes)
+ return
+ }
if len(recipes) == 1 {
- g.startCook(sess, p, &recipes[0], def.Name)
+ g.promptHowMany(sess, recipes[0].ID)
return
}
- sess.PendingRecipeItem = itemAID
- sess.PendingCookMenu = recipesToMenuData(recipes)
- sess.State = net.StateCookRecipe
+ sess.PendingMenu = recipeMenuData(recipes)
+ sess.State = net.StateRecipeChoice
sess.WriteLine(fmt.Sprintf("\nWhat would you like to make with %s on the %s?", itemAName, def.Name))
for i, r := range recipes {
sess.WriteLine(fmt.Sprintf(" %d) %s", i+1, g.recipeName(sess, &r)))
@@ -121,6 +133,22 @@ func (g *Game) doUseItemOnTarget(sess *net.Session, p *player.Player, itemAName,
return
}
+ for _, ui := range def.UseInteractions {
+ if ui.Item != itemAID {
+ continue
+ }
+ if ui.Condition != nil && !g.checkCondition(sess, ui.Condition) {
+ continue
+ }
+ if ui.Message != "" {
+ sess.WriteLine(ui.Message)
+ }
+ if ui.Action != nil {
+ g.applyNodeAction(sess, ui.Action)
+ }
+ return
+ }
+
g.StartAction(sess, "use", itemBName)
return
}
@@ -140,12 +168,12 @@ func (g *Game) doUseItemOnTarget(sess *net.Session, p *player.Player, itemAName,
matched := g.findCombineResults(sess, p, itemAID, itemBID)
if len(matched) == 1 {
- g.produceCombined(sess, p, matched[0])
+ g.promptHowMany(sess, "combine_"+matched[0].ID)
return
}
if len(matched) > 1 {
- sess.PendingCookMenu = combineMenuData(matched)
- sess.State = net.StateCookRecipe
+ sess.PendingMenu = combineMenuData(matched)
+ sess.State = net.StateRecipeChoice
sess.WriteLine("\nWhat would you like to make?")
for i, def := range matched {
sess.WriteLine(fmt.Sprintf(" %d) %s", i+1, g.itemColorize(sess, def, def.Name)))
@@ -189,25 +217,6 @@ func (g *Game) findCombineResults(sess *net.Session, p *player.Player, itemAID,
return matched
}
-func (g *Game) produceCombined(sess *net.Session, p *player.Player, def *object.ItemDef) {
- freeSlot := p.FirstFreeSlot()
- if freeSlot == -1 {
- sess.WriteLine("Your inventory is too full.")
- return
- }
- for _, entry := range def.MadeFrom {
- for _, id := range entry.Items {
- if p.HasItem(id) {
- p.RemoveItem(id, entry.Qty)
- break
- }
- }
- }
- p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: def.ID, Quantity: 1})
- g.AccountStore.SaveCharacter(p)
- sess.WriteLine(fmt.Sprintf("You combine the ingredients and create %s.", g.itemColorize(sess, def, def.Name)))
-}
-
func combineMenuData(defs []*object.ItemDef) []map[string]string {
out := make([]map[string]string, len(defs))
for i, d := range defs {