package game import ( "fmt" "strings" "thehouseoficarus/internal/engine" "thehouseoficarus/internal/net" "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 match *cleanMatch 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 } match = &cleanMatch{c.Consume[0].Items[0], item.ID, c.XP, c.Message} break } if match == nil { sess.WriteLine("\nYou've finished cleaning herbs.") g.cancelBgAction(p) return } for i := 0; i < 28; i++ { slot := p.InvSlot(i) if slot != nil && slot.ItemID == match.consumeID { slot.ItemID = match.outputID break } } if match.xp > 0 { g.awardSkillXP(sess, p, player.Pharmacy, match.xp) } g.AccountStore.SaveCharacter(p) msg := match.message if msg == "" { outDef, _ := g.ItemStore.Load(match.outputID) outputName := match.outputID if outDef != nil { outputName = outDef.Name } msg = fmt.Sprintf("You clean a %s.", outputName) } if p.OptionBool("xp_drops") && match.xp > 0 { abbr := player.SkillAbbr[player.Pharmacy] msg += g.colorize(sess, "xp", fmt.Sprintf(" (+%dxp %s)", match.xp, abbr)) } 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("\nYou've finished cleaning herbs.") g.cancelBgAction(p) return } p.BackgroundAction.WaitLeft = engine.ToTicks(2) } type cleanMatch struct { consumeID string outputID string xp int message string }