package game import "math/rand/v2" type item int8 const ( itemNone item = iota itemLens itemCig itemBeer itemCuff itemKnife itemAdrenaline itemPhone itemInverter itemPill ) func newItem() item { return item(rand.IntN(9)) + 1 } func (i item) apply(g *Match) bool { switch i { case itemNone: return false case itemLens: // Lenses are always used, even if they have no effect. g.action = actLens g.reveal = true return true case itemCig: cur := g.CurrentPlayer() if cur.hp < g.hp { cur.hp++ // Cigs are always used, even if they have no effect. } g.action = actCig return true case itemBeer: g.popShell() g.action = actBeer if g.Empty() { g.action = actBeerGameEnd g.NextGame() } return true case itemCuff: opp := g.Opponent() if opp.cuffs != uncuffed { return false } g.action = actCuff opp.cuffs = cuffedSkip return true case itemKnife: if g.damage != 1 { return false } g.action = actKnife g.damage = 2 return true case itemAdrenaline: if g.adrenaline { // Adrenaline forbids using adrenaline. return false } g.action = actAdrenaline g.adrenaline = true return true case itemPhone: g.action = actPhone // TODO(zeph): implement return true case itemInverter: g.action = actInverter g.shells[0] = !g.shells[0] return true case itemPill: cur := g.CurrentPlayer() if rand.Uint64() <= (1<<65)/5 { g.action = actPillsHeal cur.hp = min(cur.hp+2, g.hp) } else { g.action = actPillsHurt cur.hp-- } return true default: panic("shotgun: unknown item") } } var itemNames = [...]string{ itemNone: "", itemLens: "🔍", itemCig: "🚬", itemBeer: "🍺", itemCuff: "👮", itemKnife: "🔪", itemAdrenaline: "💉", itemPhone: "📱", itemInverter: "🧲", itemPill: "💊", } func (i item) String() string { return itemNames[i] }