rendering items, pick up, iventory re-make in progress to aloow item drop/wear/whatever
This commit is contained in:
@ -1,45 +1,47 @@
|
||||
package screens
|
||||
|
||||
import (
|
||||
"context"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/ecs"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/ecs/systems"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/fov"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/fov/precomputed_shade"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/gamestate"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/items"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/mob/movement"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/types"
|
||||
"lab.zaar.be/thefish/alchemyst-go/ui/mainwindow"
|
||||
"lab.zaar.be/thefish/alchemyst-go/util/appctx"
|
||||
)
|
||||
|
||||
type GameScreen struct {
|
||||
ctx context.Context
|
||||
mw *mainwindow.MainWindow
|
||||
state *gamestate.GameState
|
||||
vp *mainwindow.ViewPort
|
||||
controller *ecs.Controller
|
||||
scm *types.ScreenManager
|
||||
fov fov.Fov
|
||||
fov fov.Fov
|
||||
}
|
||||
|
||||
func NewGameScreen(mw *mainwindow.MainWindow, state *gamestate.GameState, viewPort *mainwindow.ViewPort, controller *ecs.Controller, scm *types.ScreenManager) *GameScreen {
|
||||
ts := &GameScreen{mw: mw, state: state, vp: viewPort, controller: controller, scm: scm}
|
||||
func NewGameScreen(ctx context.Context, mw *mainwindow.MainWindow, state *gamestate.GameState, viewPort *mainwindow.ViewPort, controller *ecs.Controller, scm *types.ScreenManager) *GameScreen {
|
||||
ts := &GameScreen{
|
||||
ctx: ctx,
|
||||
mw: mw,
|
||||
state: state,
|
||||
vp: viewPort,
|
||||
controller: controller,
|
||||
scm: scm,
|
||||
}
|
||||
|
||||
//fixme move this to fov system
|
||||
computedFov := precomputed_shade.NewPrecomputedShade(15)
|
||||
computedFov.Init()
|
||||
ts.fov = computedFov
|
||||
|
||||
renderMobs := systems.MobRenderSystem{
|
||||
Controller: ts.controller,
|
||||
Layer: ts.mw.GetLayer("base"),
|
||||
Viewport: ts.vp,
|
||||
Level: state.Level,
|
||||
Fov: ts.fov,
|
||||
}
|
||||
ts.controller.AddSystem(renderMobs, 10)
|
||||
renderTerrain := systems.NewTerrainRenderSystem(state, viewPort, ts.mw.GetLayer("base"), ts.fov)
|
||||
go renderTerrain.Listen()
|
||||
ts.controller.AddSystem(renderTerrain, 5)
|
||||
|
||||
renderLevel := systems.NewLevelRenderSystem(state, ts.controller, viewPort, ts.mw.GetLayer("base"), ts.fov)
|
||||
go renderLevel.Listen()
|
||||
ts.controller.AddSystem(renderLevel, 50)
|
||||
return ts
|
||||
}
|
||||
|
||||
@ -50,8 +52,8 @@ func (ts *GameScreen) Enter() {
|
||||
Print(1, ts.mw.H-2, "Press [color=white]?[/color] for help")
|
||||
}
|
||||
func (ts *GameScreen) Exit() {
|
||||
//trs := ts.controller.GetSystem(ecs.TerrainRenderSystem)
|
||||
//trs.(systems.TerrainRenderSystem).Close()
|
||||
//trs := ts.controller.GetSystem(ecs.LevelRenderSystem)
|
||||
//trs.(systems.LevelRenderSystem).Close()
|
||||
ts.mw.GetLayer("overlay").ClearArea(0, ts.mw.H-3, 30, 3)
|
||||
//remove what we dont need
|
||||
}
|
||||
@ -90,6 +92,23 @@ func (ts *GameScreen) HandleInput(input string) {
|
||||
ts.scm.SetScreenByName("devmenu")
|
||||
break
|
||||
|
||||
case "g":
|
||||
//get list of carriables on tile
|
||||
carrieds := items.FindCarriedUnder(ts.state.Player)
|
||||
if len(carrieds) == 0 {
|
||||
break
|
||||
} //do nothing
|
||||
//select if there is more than 1
|
||||
if len(carrieds) > 1 {
|
||||
appctx.Logger(ts.ctx).Warn().Msg("Passing item list to inventory not implemented yet")
|
||||
} else {
|
||||
//call pickup in selected
|
||||
cc := items.Controller.GetComponent(carrieds[0], ecs.CarriedComponent).(items.Carried)
|
||||
items.Carried.Pickup(cc, ts.state.Player, carrieds[0])
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case "i":
|
||||
ts.scm.SetScreenByName("inventory")
|
||||
break
|
||||
@ -104,4 +123,4 @@ func (ts *GameScreen) HandleInput(input string) {
|
||||
func (ts *GameScreen) Render() {
|
||||
//ts.vp.Render(ts.state)
|
||||
ts.controller.Process([]string{})
|
||||
}
|
||||
}
|
||||
|
@ -1,11 +1,99 @@
|
||||
package screens
|
||||
|
||||
type InventoryScreen struct {
|
||||
import (
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/ecs"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/types"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type InventoryScreen struct {
|
||||
*MenuScreen
|
||||
items []ecs.Entity
|
||||
|
||||
cursor int
|
||||
offset int
|
||||
pageSize int
|
||||
}
|
||||
|
||||
func (ts *InventoryScreen) UseEcs() bool {return true}
|
||||
func (ts *InventoryScreen) Enter() {}
|
||||
func (ts *InventoryScreen) HandleInput(input string) {}
|
||||
func (ts *InventoryScreen) Exit() {}
|
||||
func (ts *InventoryScreen) Render() {}
|
||||
func (is *InventoryScreen) MakeInverntory() *InventoryScreen {
|
||||
is.drawFunc = is.InventoryRender
|
||||
is.inputFunc = is.HandleInput
|
||||
return is
|
||||
}
|
||||
|
||||
func (is *InventoryScreen) SetItems(items []ecs.Entity) *InventoryScreen {
|
||||
is.items = items
|
||||
return is
|
||||
}
|
||||
|
||||
func (is *InventoryScreen) HandleInput(input string) {
|
||||
switch input {
|
||||
case "PageUp":
|
||||
is.offset = is.offset - 1
|
||||
if is.offset < 0 {
|
||||
is.offset = 0
|
||||
}
|
||||
break
|
||||
case "PageDown":
|
||||
is.offset = is.offset + 1
|
||||
if is.offset > len(is.items)-1 {
|
||||
is.offset = len(is.items) - 1
|
||||
}
|
||||
break
|
||||
case "enter":
|
||||
//select current under cursor
|
||||
break;
|
||||
case "a","b","c","d","e","f","g","h","i","j","k","l":
|
||||
//selct by letter
|
||||
break;
|
||||
case "Escape":
|
||||
fallthrough
|
||||
case "Space":
|
||||
is.scm.SetScreen(is.scm.PreviousScreen)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
func (is *InventoryScreen) InventoryRender() {
|
||||
menuLayer := is.mw.GetLayer("menu")
|
||||
menuLayer.ClearRect(is.Rect)
|
||||
bgLayer := is.mw.GetLayer("menubg")
|
||||
bgLayer.ClearRect(is.Rect)
|
||||
bgLayer.WithColor(is.bgColor).NewWindow(is.Rect).Splash()
|
||||
menuLayer.WithColor(is.fgColor).NewWindow(is.Rect).DoubleBordered(is.title)
|
||||
menuLayer.Print(is.X+(is.W/2)-7, is.Y+is.H-1, "╡"+"[color=green]Space[/color] to close"+"╞")
|
||||
footerHeight := 0
|
||||
if is.footer != "" {
|
||||
_, footerHeight = menuLayer.PrintInside(is.Rect, is.footer, 9)
|
||||
footerHeight = footerHeight + 2
|
||||
}
|
||||
_, headerHeight := menuLayer.PrintInside(is.Rect, is.header, blt.TK_ALIGN_LEFT)
|
||||
itemField := types.Rect{is.X, is.Y + headerHeight + 1, is.W, is.H - headerHeight - footerHeight}
|
||||
_ = itemField
|
||||
var ilw, ilh int
|
||||
if (len(is.items) > 0) {
|
||||
//fixme itemfield object, scroller, inputhandler, current selected item
|
||||
menuItems := make([]string, 0)
|
||||
for i := is.offset; i < len(is.items); i++ {
|
||||
if string(is.items[i].(string)) != "" {
|
||||
menuItems = append(menuItems, is.items[i].(string))
|
||||
}
|
||||
}
|
||||
ilw, ilh = menuLayer.PrintInside(itemField, strings.Join(menuItems, "\n"), blt.TK_ALIGN_LEFT)
|
||||
}
|
||||
if ilh < len(is.items) {
|
||||
is.drawScrollBar(menuLayer, itemField)
|
||||
}
|
||||
if ilw > itemField.W-4 {
|
||||
fmt.Printf("Excess width of item names found! Need h-scroll of certain names")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//func (ms *InventoryScreen) UseEcs() bool {return true}
|
||||
//func (ms *InventoryScreen) Enter() {}
|
||||
|
||||
//func (ms *InventoryScreen) Exit() {}
|
||||
//func (ms *InventoryScreen) Render() {}
|
||||
|
Reference in New Issue
Block a user