You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
3.3 KiB
Go
169 lines
3.3 KiB
Go
package app
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/gdamore/tcell/v2"
|
|
"github.com/jordanorelli/astro-domu/internal/math"
|
|
"github.com/jordanorelli/astro-domu/internal/wire"
|
|
"github.com/jordanorelli/blammo"
|
|
)
|
|
|
|
type inventory struct {
|
|
items []item
|
|
}
|
|
|
|
func (inv *inventory) removeItem(id int) bool {
|
|
for i, item := range inv.items {
|
|
if item.ID == id {
|
|
inv.items = append(inv.items[:i], inv.items[i+1:]...)
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
type item struct {
|
|
ID int
|
|
name string
|
|
}
|
|
|
|
type inventoryView struct {
|
|
*blammo.Log
|
|
highlight int
|
|
avatar *wire.Entity // probably but not necessarily the player avatar
|
|
*inventory
|
|
keyHandler func(*tcell.EventKey) change
|
|
}
|
|
|
|
func (v *inventoryView) handleEvent(e tcell.Event) change {
|
|
if v.keyHandler == nil {
|
|
v.keyHandler = v.selectHandler
|
|
}
|
|
|
|
switch t := e.(type) {
|
|
case *tcell.EventKey:
|
|
return v.keyHandler(t)
|
|
default:
|
|
// ui.Debug("screen saw unhandled event of type %T", e)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (v *inventoryView) selectHandler(e *tcell.EventKey) change {
|
|
key := e.Key()
|
|
|
|
if key == tcell.KeyRune {
|
|
switch e.Rune() {
|
|
case 'p':
|
|
v.keyHandler = v.putdownHandler
|
|
return nil
|
|
}
|
|
}
|
|
|
|
switch key {
|
|
case tcell.KeyEnter:
|
|
case tcell.KeyDown:
|
|
if len(v.items) > 0 {
|
|
v.highlight = (v.highlight + 1) % len(v.items)
|
|
}
|
|
|
|
case tcell.KeyUp:
|
|
if len(v.items) > 0 {
|
|
v.highlight = (v.highlight - 1 + len(v.items)) % len(v.items)
|
|
}
|
|
|
|
case tcell.KeyESC:
|
|
return changeFn(func(ui *UI) {
|
|
if ui.root == inGameView {
|
|
inGameView.focus(0)
|
|
}
|
|
})
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (v *inventoryView) putdownHandler(e *tcell.EventKey) change {
|
|
key := e.Key()
|
|
|
|
if key == tcell.KeyRune {
|
|
|
|
v.Info("key %c pressed while holding %d at %v", e.Rune(), v.items[v.highlight].ID, v.avatar.Position)
|
|
|
|
switch e.Rune() {
|
|
case 'w':
|
|
v.keyHandler = v.selectHandler
|
|
return putdown{
|
|
ID: v.items[v.highlight].ID,
|
|
Location: v.avatar.Position.Add(math.Up),
|
|
}
|
|
case 'a':
|
|
v.keyHandler = v.selectHandler
|
|
return putdown{
|
|
ID: v.items[v.highlight].ID,
|
|
Location: v.avatar.Position.Add(math.Left),
|
|
}
|
|
case 's':
|
|
v.keyHandler = v.selectHandler
|
|
return putdown{
|
|
ID: v.items[v.highlight].ID,
|
|
Location: v.avatar.Position.Add(math.Down),
|
|
}
|
|
case 'd':
|
|
v.keyHandler = v.selectHandler
|
|
return putdown{
|
|
ID: v.items[v.highlight].ID,
|
|
Location: v.avatar.Position.Add(math.Right),
|
|
}
|
|
}
|
|
}
|
|
|
|
switch key {
|
|
case tcell.KeyEnter:
|
|
case tcell.KeyDown:
|
|
if len(v.items) > 0 {
|
|
v.highlight = (v.highlight + 1) % len(v.items)
|
|
}
|
|
|
|
case tcell.KeyUp:
|
|
if len(v.items) > 0 {
|
|
v.highlight = (v.highlight - 1 + len(v.items)) % len(v.items)
|
|
}
|
|
|
|
case tcell.KeyESC:
|
|
return changeFn(func(ui *UI) {
|
|
if ui.root == inGameView {
|
|
inGameView.focus(0)
|
|
}
|
|
})
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (v *inventoryView) draw(img canvas, st *state) {
|
|
v.avatar = st.avatar
|
|
writeString(img, "Inventory", math.Vec{0, 0}, tcell.StyleDefault)
|
|
for i, item := range st.inventory.items {
|
|
line := fmt.Sprintf("- %s", item.name)
|
|
if i == v.highlight {
|
|
line = fmt.Sprintf("+ %s", item.name)
|
|
}
|
|
writeString(img, line, math.Vec{0, i + 2}, tcell.StyleDefault)
|
|
}
|
|
}
|
|
|
|
type openInventory struct{}
|
|
|
|
func (openInventory) exec(ui *UI) {
|
|
if ui.root == inGameView {
|
|
ui.state.detail = &inventoryView{
|
|
Log: ui.Log.Child("inventory"),
|
|
avatar: ui.state.avatar,
|
|
inventory: &ui.state.inventory,
|
|
}
|
|
inGameView.focus(1)
|
|
}
|
|
}
|