107 lines
3.0 KiB
Go

package screens
import (
"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/mob/movement"
"lab.zaar.be/thefish/alchemyst-go/engine/types"
"lab.zaar.be/thefish/alchemyst-go/ui/mainwindow"
)
type GameScreen struct {
mw *mainwindow.MainWindow
state *gamestate.GameState
vp *mainwindow.ViewPort
controller *ecs.Controller
scm *types.ScreenManager
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}
//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)
return ts
}
func (ts *GameScreen) UseEcs() bool { return true }
func (ts *GameScreen) Enter() {
ts.mw.GetLayer("overlay").ClearArea(0, ts.mw.H-3, 30, 3)
ts.mw.GetLayer("overlay").WithColor("#77777777").
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()
ts.mw.GetLayer("overlay").ClearArea(0, ts.mw.H-3, 30, 3)
//remove what we dont need
}
func (ts *GameScreen) HandleInput(input string) {
//ts.state.Do(func(){
switch input {
case "Up", "k", "KP_8":
movement.Walk(ts.state.Player, ts.state, 0, -1)
break
case "Down", "j", "KP_2":
movement.Walk(ts.state.Player, ts.state, 0, 1)
break
case "Left", "h", "KP_4":
movement.Walk(ts.state.Player, ts.state, -1, 0)
break
case "Right", "l", "KP_6":
movement.Walk(ts.state.Player, ts.state, 1, 0)
break
case "y", "KP_7":
movement.Walk(ts.state.Player, ts.state, -1, -1)
break
case "u", "KP_9":
movement.Walk(ts.state.Player, ts.state, 1, -1)
break
case "b", "KP_1":
movement.Walk(ts.state.Player, ts.state, -1, 1)
break
case "n", "KP_3":
movement.Walk(ts.state.Player, ts.state, 1, 1)
break
case "Shift+/":
ts.scm.SetScreenByName("help")
break
case "Shift+z":
ts.scm.SetScreenByName("devmenu")
break
case "i":
ts.scm.SetScreenByName("inventory")
break
default:
ts.mw.GetLayer("base").ClearArea(0, 3, 40, 1)
ts.mw.GetLayer("base").Print(1, 3, "Key: "+input)
ts.mw.GetLayer("base").Print(1, 6, "█")
}
//})
}
func (ts *GameScreen) Render() {
//ts.vp.Render(ts.state)
ts.controller.Process([]string{})
}