package game import ( "strings" "thehouseoficarus/internal/behavior" "thehouseoficarus/internal/engine" "thehouseoficarus/internal/item" "thehouseoficarus/internal/net" "thehouseoficarus/internal/player" ) func (g *Game) advanceClean(sess *net.Session, p *player.Player) { data, ok := p.BackgroundAction.Data.(*behavior.CleanData) if !ok { g.cancelBgAction(p) return } phase := data.Phase filter := data.Filter if phase == 0 { data.Phase = 1 p.BackgroundAction.WaitLeft = engine.ToTicks(2) return } items := g.CraftIndex.BySubtype("cleaning") var matchItem *item.ItemDef for _, item := range items { c := item.FirstCraft() if filter != "" { if len(c.Ingredients) == 0 || len(c.Ingredients[0].Items) == 0 { continue } if !strings.Contains(c.Ingredients[0].Items[0], filter) && !strings.Contains(item.ID, filter) { continue } } if p.Level(player.Pharmacy) < c.Level { continue } if !craftHasAllItems(c, p.HasItem) { continue } matchItem = item break } if matchItem == nil { sess.WriteLine("You've finished cleaning herbs.") g.cancelBgAction(p) return } craft := matchItem.FirstCraft() consumeID := craft.Ingredients[0].Items[0] for i := 0; i < 28; i++ { slot := p.InvSlot(i) if slot != nil && slot.ItemID == consumeID { slot.ItemID = matchItem.ID break } } if craft.XP > 0 { g.awardSkillXP(sess, p, player.Pharmacy, craft.XP) } g.AccountStore.SaveCharacter(p) msg := g.resolveCraftMessage(sess, craft.SuccessMessage, "You clean the %i1.", craft, matchItem.ID, nil, p.HasItem) if p.OptionBool("xp_drops") && craft.XP > 0 { msg += g.formatXpDropSingle(sess, p, player.Pharmacy, craft.XP) } sess.WriteLine(msg) hasMore := false for _, item := range items { c := item.FirstCraft() if filter != "" { if len(c.Ingredients) == 0 || len(c.Ingredients[0].Items) == 0 { continue } if !strings.Contains(c.Ingredients[0].Items[0], filter) && !strings.Contains(item.ID, filter) { continue } } if p.Level(player.Pharmacy) >= c.Level && craftHasAllItems(c, p.HasItem) { hasMore = true break } } if !hasMore { sess.WriteLine("You've finished cleaning herbs.") g.cancelBgAction(p) return } p.BackgroundAction.WaitLeft = engine.ToTicks(2) }