func InvAttr(i item.Itemer) termbox.Attribute { attr := RarityAttr(i) if item.IsEquipable(i) { if creature.Hero.IsEquipped(i) { attr = termbox.ColorGreen + termbox.AttrBold } } return attr }
// Action performs simple AI for a creature. func (c *Creature) Action(a *area.Area) int { if i := a.Items[c.Coord()].Peek(); i != nil { c.PickUp(a) return c.Speed } if c.Equipment.MainHand == nil && len(c.Inventory) > 0 { for _, pos := range item.Positions { if i, ok := c.Inventory[pos]; ok { if !item.IsEquipable(i) { break } if i.Name() != "Iron Sword" { break } c.Equip(pos) return c.Speed } } } var col *area.Collision var err error if c.X() < Hero.X() { col, err = a.MoveRight(c) } else if c.X() > Hero.X() { col, err = a.MoveLeft(c) } else if c.Y() < Hero.Y() { col, err = a.MoveDown(c) } else if c.Y() > Hero.Y() { col, err = a.MoveUp(c) } if err != nil { // log.Println("err / collide?") return c.Speed // return 0 } if col == nil { return c.Speed } if mob, ok := col.S.(*Creature); ok { if mob.IsHero() { c.Battle(mob, a) return c.Speed } } // If all fails, creature waits. return c.Speed }
func InvText(i item.Itemer) string { invStr := "" if item.IsStackable(i) { name := i.Name() if i.Count() > 1 { name = inflections.Pluralize(name) } invStr = fmt.Sprintf("%c - %d %s", i.Hotkey(), i.Count(), name) } else { invStr = fmt.Sprintf("%c - %s", i.Hotkey(), i.Name()) } if item.IsEquipable(i) { if creature.Hero.IsEquipped(i) { invStr += " (wielding)" } } return invStr }
func ShowItemDetails(i item.Itemer, a *area.Area) bool { ui.Clear() // Print item title. msgs := makeDrawable(fmt.Sprintf("%c - %s", i.Hotkey(), i.Name())) PrintLong(msgs, 0) rows := len(msgs) // Print flavor text. msgs = makeDrawable(i.FlavorText()) PrintLong(msgs, rows) rows += len(msgs) // Print flavor text. msgs = makeDrawable(StringEffects(i.Effects())) PrintLong(msgs, rows) rows += len(msgs) actionStr := dropAction if item.IsEquipable(i) && !creature.Hero.IsEquipped(i) { actionStr += " You can (e)quip this " + strings.ToLower(i.Cat()) + "." } if creature.Hero.IsEquipped(i) { actionStr += " You can (r)emove this " + strings.ToLower(i.Cat()) + "." } if item.IsUsable(i) { actionStr += " You can (u)se this " + strings.ToLower(i.Cat()) + "." } msgs = makeDrawable(actionStr) for y, m := range msgs { t := text.New(m, termbox.ColorCyan) ui.Print(t, ui.Inventory.XOffset, y+rows, ui.Inventory.Width) } termbox.Flush() itemDetailLoop: for { switch detailsEvent := termbox.PollEvent(); detailsEvent.Type { case termbox.EventKey: if detailsEvent.Key == ui.CancelKey { break itemDetailLoop } switch string(detailsEvent.Ch) { case string(ui.DropItemKey): creature.Hero.DropItem(i.Hotkey(), a) return true case string(ui.EquipItemKey): NarrativeEquip(i.Hotkey()) return true case string(ui.UseItemKey): NarrativeUse(i.Hotkey()) return true case string(ui.UnEquipItemKey): NarrativeUnEquip(i.Hotkey()) return true } } } return false }