terrain animation broken, mobs rendering right
This commit is contained in:
@ -210,6 +210,13 @@ func (c *Controller) AddSystem(system System, priority int) {
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Controller) GetSystem(systemType string) System {
|
||||
if system, ok := c.systems[systemType]; ok {
|
||||
return system
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Process kicks off system processing for all systems attached to the controller. Systems will be processed in the
|
||||
// order they are found, or if they have a priority, in priority order. If there is a mix of systems with priority and
|
||||
// without, systems with priority will be processed first (in order).
|
||||
|
@ -1,7 +1,9 @@
|
||||
package systems
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/ecs"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/gamemap"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/types"
|
||||
"lab.zaar.be/thefish/alchemyst-go/ui/mainwindow"
|
||||
)
|
||||
@ -10,6 +12,7 @@ type MobRenderSystem struct {
|
||||
Controller *ecs.Controller
|
||||
Layer *mainwindow.Layer
|
||||
Viewport *mainwindow.ViewPort
|
||||
*gamemap.Level
|
||||
}
|
||||
|
||||
func (mrs MobRenderSystem) Process(){
|
||||
@ -30,8 +33,25 @@ func (mrs MobRenderSystem) Process(){
|
||||
//}
|
||||
|
||||
//fixme
|
||||
mrs.Layer.WithRawColor(appearance.ColorSet.Fg.GetColor()).Put(pos.X, pos.Y, appearance.Glyph.GetGlyph())
|
||||
mrs.Layer.WithRawColor(appearance.ColorSet.Fg.GetColor()).Put(pos.X, pos.Y, appearance.Glyph.GetGlyph())
|
||||
//for y := 0; y < mrs.Viewport.H; y++ {
|
||||
// for x := 0; x < mrs.Viewport.W; x++ {
|
||||
// mapCoords := types.Coords{mrs.Viewport.CameraCoords.X + x, mrs.Viewport.CameraCoords.Y + y}
|
||||
// if mrs.Level.InBounds(mapCoords) {
|
||||
// mrs.Layer.WithRawColor(appearance.ColorSet.Fg.GetColor()).Put(
|
||||
// x+mrs.Viewport.X,
|
||||
// y+mrs.Viewport.Y,
|
||||
// appearance.Glyph.GetGlyph(),
|
||||
// )
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
vpc, err := mrs.Viewport.ToVPCoords(pos)
|
||||
if err != nil {
|
||||
fmt.Printf("Err: " , err)
|
||||
}
|
||||
|
||||
mrs.Layer.WithRawColor(appearance.ColorSet.Fg.GetColor()).Put(vpc.X, vpc.Y, appearance.Glyph.GetGlyph())
|
||||
//gogue.PrintGlyph(pos.X, pos.Y, appearance.Glyph, "", appearance.Layer)
|
||||
|
||||
//}
|
||||
|
@ -2,64 +2,105 @@ package systems
|
||||
|
||||
import (
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/ecs"
|
||||
"lab.zaar.be/thefish/alchemyst-go/engine/gamemap"
|
||||
"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/types"
|
||||
"lab.zaar.be/thefish/alchemyst-go/ui/mainwindow"
|
||||
"time"
|
||||
)
|
||||
|
||||
type TerrainRenderSystem struct {
|
||||
Viewport mainwindow.ViewPort
|
||||
Level gamemap.Level
|
||||
Viewport *mainwindow.ViewPort
|
||||
state *gamestate.GameState
|
||||
layer *mainwindow.Layer
|
||||
animateTiles *time.Ticker
|
||||
fov fov.Fov
|
||||
TorchRadius int
|
||||
redraw bool
|
||||
fovRecompute bool
|
||||
}
|
||||
|
||||
func NewTerrainRenderSystem(
|
||||
state *gamestate.GameState,
|
||||
vp *mainwindow.ViewPort,
|
||||
layer *mainwindow.Layer,
|
||||
) TerrainRenderSystem {
|
||||
|
||||
trs := TerrainRenderSystem{
|
||||
Viewport:vp,
|
||||
layer: layer,
|
||||
state: state,
|
||||
redraw: true,
|
||||
fovRecompute: true,
|
||||
}
|
||||
|
||||
computedFov := precomputed_shade.NewPrecomputedShade(15)
|
||||
computedFov.Init()
|
||||
trs.TorchRadius = 12 //fixme move to sight component
|
||||
|
||||
trs.animateTiles = time.NewTicker(time.Second / 12)
|
||||
|
||||
trs.fov = computedFov
|
||||
|
||||
return trs
|
||||
}
|
||||
|
||||
//fixme add to screens/game Exit()
|
||||
func (trs TerrainRenderSystem) Close() {
|
||||
trs.animateTiles.Stop()
|
||||
trs.animateTiles = nil //zero pointer to ticker
|
||||
}
|
||||
|
||||
func (trs TerrainRenderSystem) Listen() {
|
||||
for {
|
||||
select {
|
||||
case <-trs.state.FovRecompute:
|
||||
trs.fovRecompute = true
|
||||
case <-trs.state.Redraw:
|
||||
trs.redraw = true
|
||||
case <-trs.animateTiles.C:
|
||||
trs.redraw = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (trs TerrainRenderSystem) Process() {
|
||||
playerCoords := state.Controller.GetComponent(state.Player, ecs.CoordsComponent).(types.Coords)
|
||||
playerCoords := trs.state.Controller.GetComponent(trs.state.Player, ecs.CoordsComponent).(types.Coords)
|
||||
|
||||
vp.Move(state, playerCoords)
|
||||
trs.Viewport.Move(trs.state, playerCoords)
|
||||
|
||||
if fovRecompute {
|
||||
vp.layer.ClearRect(vp.Rect)
|
||||
fovRecompute = false
|
||||
redraw = true
|
||||
vp.Fov.ComputeFov(state.Level, playerCoords, vp.TorchRadius)
|
||||
if trs.fovRecompute {
|
||||
trs.layer.ClearRect(trs.Viewport.Rect)
|
||||
trs.fovRecompute = false
|
||||
trs.redraw = true
|
||||
trs.fov.ComputeFov(trs.state.Level, playerCoords, trs.TorchRadius)
|
||||
}
|
||||
|
||||
//vp.layer.ClearArea(0, 7, 20, 1)
|
||||
//vp.layer.Print(0,7, fmt.Sprintf("pcds: %v", playerCoords))
|
||||
|
||||
|
||||
if redraw {
|
||||
if trs.redraw {
|
||||
//terrain
|
||||
for y := 0; y < vp.H; y++ {
|
||||
for x := 0; x < vp.W; x++ {
|
||||
mapCoords := types.Coords{vp.cameraCoords.X + x, vp.cameraCoords.Y + y}
|
||||
for y := 0; y < trs.Viewport.H; y++ {
|
||||
for x := 0; x < trs.Viewport.W; x++ {
|
||||
mapCoords := types.Coords{trs.Viewport.CameraCoords.X + x, trs.Viewport.CameraCoords.Y + y}
|
||||
|
||||
if state.Level.InBounds(mapCoords) {
|
||||
tile := state.Level.GetTile(mapCoords)
|
||||
if trs.state.Level.InBounds(mapCoords) {
|
||||
tile := trs.state.Level.GetTile(mapCoords)
|
||||
if tile.Explored || tile.Visible {
|
||||
vp.layer.PutToBase(x+vp.X, y+vp.Y, tile.GetChar(), tile.GetRawColor(), tile.GetRawBgColor())
|
||||
trs.layer.PutToBase(
|
||||
x+trs.Viewport.X,
|
||||
y+trs.Viewport.Y,
|
||||
tile.GetChar(),
|
||||
tile.GetRawColor(),
|
||||
tile.GetRawBgColor(),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
//mobs
|
||||
pc, err := vp.ToVPCoords(playerCoords)
|
||||
_ = pc
|
||||
if err != nil {
|
||||
fmt.Println("error on getting player position")
|
||||
} else {
|
||||
vp.layer.WithColor("white").Put(pc.X+vp.X, pc.Y+vp.Y, "@")
|
||||
//mw.GetLayer("base").WithColor("white").Put(42, 10, "B")
|
||||
//mw.GetLayer("overlay").WithColor("white").Put(59, 10, "O")
|
||||
}
|
||||
*/
|
||||
|
||||
//redraw = true
|
||||
redraw = false
|
||||
trs.redraw = false
|
||||
}
|
||||
}
|
||||
|
||||
func (trs TerrainRenderSystem) Type() string {
|
||||
func (trs TerrainRenderSystem) SystemType() string {
|
||||
return ecs.TerrainRenderSystem
|
||||
}
|
Reference in New Issue
Block a user