package game import ( "strings" "thehouseoficarus/internal/engine" "thehouseoficarus/internal/net" "thehouseoficarus/internal/object" "thehouseoficarus/internal/player" ) func (g *Game) advanceClean(sess *net.Session, p *player.Player) { phase, _ := p.BackgroundAction.Data["phase"].(int) filter, _ := p.BackgroundAction.Data["filter"].(string) if phase == 0 { p.BackgroundAction.Data["phase"] = 1 p.BackgroundAction.WaitLeft = engine.ToTicks(2) return } items := g.CraftIndex.ByType("clean") var matchItem *object.ItemDef for _, item := range items { c := item.FirstCraft() if filter != "" { if len(c.Consume) == 0 || len(c.Consume[0].Items) == 0 { continue } if !strings.Contains(c.Consume[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.Consume[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.Message, "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.Consume) == 0 || len(c.Consume[0].Items) == 0 { continue } if !strings.Contains(c.Consume[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) }