func HeroMovement(ev termbox.Event, a *area.Area) int { var col *area.Collision var err error switch ev.Key { case ui.MoveUpKey: col, err = a.MoveUp(&creature.Hero) case ui.MoveDownKey: col, err = a.MoveDown(&creature.Hero) case ui.MoveLeftKey: col, err = a.MoveLeft(&creature.Hero) case ui.MoveRightKey: col, err = a.MoveRight(&creature.Hero) default: return 0 } // Creature moved out of bounds. if err != nil { return 0 } stk, ok := a.Items[creature.Hero.Coord()] if ok && stk.Len() > 0 { if stk.Len() > 1 { status.Println("You find a heap of items on the ground:", termbox.ColorWhite) } else { status.Println("You find a single item on the ground:", termbox.ColorWhite) } print := " " for _, s := range []area.DrawPather(*stk) { i, _ := s.(item.DrawItemer) if stk.Len() < 4 { print += i.Name() + ", " } else { print += string(i.Graphic().Ch) + ", " } } status.Println(print[:len(print)-2], termbox.ColorBlack+termbox.AttrBold) } // Successful movement. if col == nil { return creature.Hero.Speed } // Another creature occupied that tile -> battle! if c, ok := col.S.(*creature.Creature); ok { creature.Hero.Battle(c, a) return creature.Hero.Speed } // Hero walked into an object. if obj, ok := a.Objects[col.Coord()].(*object.Object); ok { // If the hero walked into a door -> open! switch obj.Name() { case "door (closed)": a.Objects[col.Coord()] = object.Objects["door (open)"].New() status.Println("You open the closed door.", termbox.ColorBlack+termbox.AttrBold) return creature.Hero.Speed } } return 0 }
// 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 }