package game import ( "fmt" "strings" "thirdcollapse/internal/net" "thirdcollapse/internal/player" ) func (g *Game) doDrop(sess *net.Session, input string) { p := sess.Player.(*player.Player) if input == "all" { count := 0 for _, slot := range p.Inventory { if slot != nil && slot.Quantity > 0 { count++ } } if count == 0 { sess.WriteLine("You have nothing to drop.") return } sess.State = net.StateDropAllConfirm sess.WriteLine(fmt.Sprintf("\nDrop all %d items? [y/N]", count)) return } matches := g.findInventoryMatches(input, p) if len(matches) == 0 { sess.WriteLine(fmt.Sprintf("You don't have any '%s'.", input)) return } unique := uniqueItemNames(matches) if len(unique) > 1 { sess.WriteLine("Which one?") for _, name := range unique { sess.WriteLine(fmt.Sprintf(" - %s", name)) } return } itemID := matches[0].ID slotIdx := matches[0].Slot slot := p.InvSlot(slotIdx) def, _ := g.ItemStore.Load(itemID) qty := 1 name := itemID if def != nil { name = def.Name } if slot.Quantity > qty { slot.Quantity -= qty } else { p.SetInvSlot(slotIdx, nil) } g.World.AddGroundItem(p.RoomID, itemID, qty) g.AccountStore.SaveCharacter(p) sess.WriteLine(fmt.Sprintf("You drop a %s.", name)) } func (g *Game) handleDropAllConfirm(sess *net.Session, input string) { p, ok := sess.Player.(*player.Player) if !ok { sess.State = net.StateGame sess.Write("\r\n> ") return } input = strings.TrimSpace(strings.ToLower(input)) if input != "y" && input != "yes" { sess.State = net.StateGame sess.Write("\r\n> ") return } var dropped []string for i := 0; i < 28; i++ { slot := p.InvSlot(i) if slot == nil || slot.Quantity <= 0 { continue } g.World.AddGroundItem(p.RoomID, slot.ItemID, slot.Quantity) def, _ := g.ItemStore.Load(slot.ItemID) name := slot.ItemID if def != nil { name = def.Name } dropped = append(dropped, name) p.SetInvSlot(i, nil) } g.AccountStore.SaveCharacter(p) sess.State = net.StateGame if len(dropped) == 0 { sess.WriteLine("\nYou have nothing to drop.") } else { sess.Write(fmt.Sprintf("\nYou drop your ")) innerPickupReport(sess, dropped) sess.WriteLine(".") } sess.Write("\r\n> ") }