diff options
| author | historia <[not public]> | 2026-06-17 21:13:07 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-06-17 21:13:07 -0400 |
| commit | ec2e94e3463654a6288464a4c070b48ef9bf7368 (patch) | |
| tree | 3c5df0f9a6a5968fa4c725a7d331825883ae798c /internal/game/cmd_use.go | |
| parent | eef5ddaa94f8cff6010d092c30fed53d2be01524 (diff) | |
| download | thehouseoficarus-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.go | 69 |
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 { |
