aboutsummaryrefslogtreecommitdiff
path: root/internal/game/act_search.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-07-10 17:02:13 -0400
committerhistoria <[not public]>2026-07-10 17:02:13 -0400
commitd02f0d2cdf67f1445a9ccae86b99a2578adab585 (patch)
treefc2caae674d20b9ac31aa0da41f4f600f8f801a9 /internal/game/act_search.go
parent18d46f9c336d37d0282eb7191bb7ff930163d18f (diff)
downloadthehouseoficarus-d02f0d2cdf67f1445a9ccae86b99a2578adab585.tar.gz
feat(admin): update search to use standard condition/action framework rather than bespoke implementation
Diffstat (limited to 'internal/game/act_search.go')
-rw-r--r--internal/game/act_search.go107
1 files changed, 4 insertions, 103 deletions
diff --git a/internal/game/act_search.go b/internal/game/act_search.go
index 83ea534..430b265 100644
--- a/internal/game/act_search.go
+++ b/internal/game/act_search.go
@@ -1,116 +1,17 @@
package game
import (
- "fmt"
-
- "thehouseoficarus/internal/behavior"
- "thehouseoficarus/internal/engine"
"thehouseoficarus/internal/net"
"thehouseoficarus/internal/player"
)
-func (g *Game) startSearch(sess *net.Session, p *player.Player, itemID string, slotIdx int) {
+func (g *Game) doSearchItem(sess *net.Session, p *player.Player, itemID string) {
def, err := g.ItemStore.Load(itemID)
- if err != nil || def.SearchTable == "" {
+ if err != nil || len(def.Search) == 0 {
sess.WriteLine("You can't search that.")
return
}
-
- ticks := def.SearchTicks
- if ticks <= 0 {
- ticks = 3
- }
-
- p.Action = &behavior.Action{
- Type: "search",
- TargetID: itemID,
- TargetName: def.Name,
- WaitLeft: engine.ToTicks(ticks),
- Data: &behavior.SearchData{
- ItemID: itemID,
- SlotIdx: slotIdx,
- Started: false,
- },
- }
-
- g.broadcastAction(sess, "%s searches a %s.", p.Name, def.Name)
-}
-
-func (g *Game) advanceSearch(sess *net.Session, p *player.Player) {
- d, ok := p.Action.Data.(*behavior.SearchData)
- if !ok || d == nil {
- sess.WriteLine("Something went wrong.")
- g.cancelAction(p)
- return
- }
-
- def, err := g.ItemStore.Load(d.ItemID)
- if err != nil {
- sess.WriteLine("Something went wrong.")
- g.cancelAction(p)
- return
- }
-
- if !d.Started {
- msg := def.SearchMessage
- if msg == "" {
- msg = fmt.Sprintf("digging through the %s", def.Name)
- }
- sess.WriteLine(fmt.Sprintf("You begin %s.", msg))
- d.Started = true
- return
- }
-
- slot := p.InvSlot(d.SlotIdx)
- if slot == nil || slot.ItemID != d.ItemID || slot.Quantity <= 0 {
- sess.WriteLine("The item is gone.")
- g.cancelAction(p)
- return
- }
-
- if slot.Quantity > 1 {
- slot.Quantity--
- } else {
- p.SetInvSlot(d.SlotIdx, nil)
- }
-
- dt, err := behavior.LoadDropTable(g.DataDir, def.SearchTable)
- if err == nil && len(dt.Drops) > 0 {
- drop := behavior.ResolveDrop(g.DataDir, dt.Drops)
- if drop != nil && drop.ItemID != "" {
- g.giveSearchLoot(sess, p, drop)
- }
- }
-
- g.AccountStore.SaveCharacter(p)
- g.cancelAction(p)
-}
-
-func (g *Game) giveSearchLoot(sess *net.Session, p *player.Player, drop *behavior.DropEntry) {
- qty := drop.Quantity
- if qty <= 0 {
- qty = 1
- }
-
- name := drop.ItemID
- lootDef, _ := g.ItemStore.Load(drop.ItemID)
- if lootDef != nil {
- name = lootDef.Name
- }
-
- if drop.ItemID == "credits" {
- p.Credits += qty
- sess.WriteLine(g.colorize(sess, "credits_pickup", fmt.Sprintf("You find %d credits.", qty)))
- return
- }
-
- freeSlot := p.FirstFreeSlot()
- if freeSlot == -1 {
- g.World.AddGroundItem(p.RoomID, drop.ItemID, qty)
- sess.WriteLine(fmt.Sprintf("You find %s. It falls to the ground.", g.itemColorize(sess, lootDef, name)))
- return
+ if !g.runTrigger(sess, p, def.Search, p.RoomID, p.HasItem, false) {
+ sess.WriteLine("You can't search that.")
}
-
- p.SetInvSlot(freeSlot, &player.InventorySlot{ItemID: drop.ItemID, Quantity: qty})
- sess.WriteLine(fmt.Sprintf("You find %s.", g.itemColorize(sess, lootDef, name)))
}