fixes+changes:
- fixed windows build, using path, instead of path/filepath - added switch + door, implemented relation (pair_system missing yet) - fixed ldtk map loading, now using correct entitymap.png tileset
This commit is contained in:
64
grid/grid.go
64
grid/grid.go
@@ -8,6 +8,8 @@ import (
|
||||
"openquell/config"
|
||||
"openquell/observers"
|
||||
|
||||
"log/slog"
|
||||
|
||||
"github.com/mlange-42/arche/ecs"
|
||||
"github.com/mlange-42/arche/generic"
|
||||
)
|
||||
@@ -59,23 +61,41 @@ func NewGrid(world *ecs.World,
|
||||
components.Renderable,
|
||||
components.Transient](world)
|
||||
|
||||
doormapper := generic.NewMap3[
|
||||
destructiblemapper := generic.NewMap3[
|
||||
components.Position,
|
||||
components.Renderable,
|
||||
components.Destroyable](world)
|
||||
|
||||
switchmapper := generic.NewMap4[
|
||||
components.Position,
|
||||
components.Renderable,
|
||||
components.Bond,
|
||||
components.Switch](world)
|
||||
|
||||
doormapper := generic.NewMap4[
|
||||
components.Position,
|
||||
components.Renderable,
|
||||
components.Bond,
|
||||
components.Door](world)
|
||||
|
||||
var pos *components.Position
|
||||
var vel *components.Velocity
|
||||
var render *components.Renderable
|
||||
var transient *components.Transient
|
||||
var player *components.Player
|
||||
var destroyable *components.Destroyable
|
||||
var switcher *components.Switch
|
||||
var door *components.Door
|
||||
var bond *components.Bond
|
||||
|
||||
playerID := ecs.ComponentID[components.Player](world)
|
||||
obstacleID := ecs.ComponentID[components.Obstacle](world)
|
||||
|
||||
observer := observers.GetGameObserver(world)
|
||||
|
||||
switches := []ecs.Entity{}
|
||||
doors := []ecs.Entity{}
|
||||
|
||||
for point, tile := range mapslice {
|
||||
switch tile.Renderable {
|
||||
case true:
|
||||
@@ -83,6 +103,7 @@ func NewGrid(world *ecs.World,
|
||||
case tile.Solid:
|
||||
entity := solidmapper.New()
|
||||
pos, render, _, _ = solidmapper.Get(entity)
|
||||
|
||||
case tile.Player:
|
||||
entity := playermapper.New()
|
||||
pos, vel, render, player = playermapper.Get(entity)
|
||||
@@ -91,9 +112,11 @@ func NewGrid(world *ecs.World,
|
||||
player.IsPrimary = tile.IsPrimary
|
||||
player.Sprites = tile.Tiles
|
||||
player.LoopPos = &components.Position{Cellsize: tilesize}
|
||||
|
||||
case tile.Collectible:
|
||||
entity := colmapper.New()
|
||||
pos, render, _ = colmapper.Get(entity)
|
||||
|
||||
case tile.Obstacle:
|
||||
entity := obsmapper.New()
|
||||
pos, vel, render, _ = obsmapper.Get(entity)
|
||||
@@ -101,17 +124,36 @@ func NewGrid(world *ecs.World,
|
||||
vel.PointingAt = tile.Direction
|
||||
vel.Speed = config.PLAYERSPEED
|
||||
observer.AddEntity(entity, obstacleID)
|
||||
|
||||
case tile.Transient:
|
||||
entity := transmapper.New()
|
||||
pos, render, transient = transmapper.Get(entity)
|
||||
transient.Sprites = tile.TileNames
|
||||
|
||||
case tile.Destroyable:
|
||||
entity := doormapper.New()
|
||||
pos, render, destroyable = doormapper.Get(entity)
|
||||
entity := destructiblemapper.New()
|
||||
pos, render, destroyable = destructiblemapper.Get(entity)
|
||||
destroyable.Sprites = tile.Tiles
|
||||
render.DamageImage = tile.Alpha
|
||||
render.Shader = tile.Shader
|
||||
render.Damaged = 0
|
||||
|
||||
case tile.Switch:
|
||||
entity := switchmapper.New()
|
||||
pos, render, _, switcher = switchmapper.Get(entity)
|
||||
switcher.OpenSprite = tile.Tiles[0]
|
||||
switcher.CloseSprite = tile.Tiles[0]
|
||||
switcher.Ref = tile.Ref
|
||||
switches = append(switches, entity)
|
||||
|
||||
case tile.Door:
|
||||
entity := doormapper.New()
|
||||
pos, render, _, door = doormapper.Get(entity)
|
||||
door.OpenSprite = tile.Tiles[0]
|
||||
door.CloseSprite = tile.Tiles[0]
|
||||
door.Id = tile.Id
|
||||
doors = append(doors, entity)
|
||||
|
||||
default:
|
||||
log.Fatalln("unsupported tile type encountered")
|
||||
}
|
||||
@@ -134,6 +176,22 @@ func NewGrid(world *ecs.World,
|
||||
pos.Update(point.X*tilesize, point.Y*tilesize, tilesize)
|
||||
}
|
||||
|
||||
for _, switchentity := range switches {
|
||||
_, _, bond, switcher = switchmapper.Get(switchentity)
|
||||
|
||||
if switcher.Ref != "" {
|
||||
for _, doorentity := range doors {
|
||||
_, _, _, door = doormapper.Get(doorentity)
|
||||
if door.Id == switcher.Ref {
|
||||
bond.Ref = switcher.Ref
|
||||
relID := ecs.ComponentID[components.Bond](world)
|
||||
world.Relations().Set(doorentity, relID, switchentity)
|
||||
slog.Debug("setup switch/door reference")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return &Grid{
|
||||
Size: len(mapslice),
|
||||
Tilesize: tilesize,
|
||||
|
||||
Reference in New Issue
Block a user