rendering items, pick up, iventory re-make in progress to aloow item drop/wear/whatever

This commit is contained in:
2019-11-17 02:09:41 +03:00
parent 685dfeeeb1
commit 0a6c642dc2
12 changed files with 349 additions and 207 deletions

View File

@ -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{})
}
}

View File

@ -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() {}