added hidden doors/destroyable walls, fixed game reloading (tile clone)
This commit is contained in:
@@ -96,7 +96,6 @@ func (game *Game) Update() error {
|
||||
|
||||
if next == Play {
|
||||
// fresh setup of actual level every time we enter the play scene
|
||||
//game.Scenes[Play] = NewLevelScene(game, gameobserver.CurrentLevel)
|
||||
game.Scenes[Play].SetLevel(gameobserver.CurrentLevel)
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package game
|
||||
import (
|
||||
"image"
|
||||
"log"
|
||||
"log/slog"
|
||||
"openquell/assets"
|
||||
"openquell/components"
|
||||
"openquell/grid"
|
||||
@@ -15,12 +16,16 @@ import (
|
||||
"github.com/mlange-42/arche/ecs"
|
||||
)
|
||||
|
||||
type Map map[image.Point]*assets.Tile
|
||||
type BackupMap map[image.Point]assets.Tile
|
||||
|
||||
type Level struct {
|
||||
Cellsize, Width, Height int
|
||||
World *ecs.World
|
||||
Name string
|
||||
Description string
|
||||
Mapslice map[image.Point]*assets.Tile
|
||||
Mapslice Map
|
||||
BackupMapslice Map
|
||||
GridContainer *grid.GridContainer
|
||||
Systems []systems.System
|
||||
Grid *grid.Grid
|
||||
@@ -45,16 +50,21 @@ func NewLevel(game *Game, cellsize int, plan *assets.RawLevel) *Level {
|
||||
|
||||
systemlist = append(systemlist, systems.NewTransientSystem(game.World, gridcontainer))
|
||||
|
||||
systemlist = append(systemlist, systems.NewDestroyableSystem(game.World, gridcontainer))
|
||||
|
||||
mapslice, backupmap := LevelToSlice(game, plan, cellsize)
|
||||
|
||||
return &Level{
|
||||
Mapslice: LevelToSlice(game, plan, cellsize),
|
||||
Cellsize: cellsize,
|
||||
World: game.World,
|
||||
Width: game.ScreenWidth,
|
||||
Height: game.ScreenHeight,
|
||||
Description: plan.Description,
|
||||
Name: plan.Name,
|
||||
GridContainer: gridcontainer,
|
||||
Systems: systemlist,
|
||||
Mapslice: mapslice,
|
||||
BackupMapslice: backupmap,
|
||||
Cellsize: cellsize,
|
||||
World: game.World,
|
||||
Width: game.ScreenWidth,
|
||||
Height: game.ScreenHeight,
|
||||
Description: plan.Description,
|
||||
Name: plan.Name,
|
||||
GridContainer: gridcontainer,
|
||||
Systems: systemlist,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,6 +87,12 @@ func (level *Level) Position2Point(position *components.Position) image.Point {
|
||||
}
|
||||
}
|
||||
|
||||
func (level *Level) RestoreMap() {
|
||||
for point, tile := range level.BackupMapslice {
|
||||
level.Mapslice[point] = tile.Clone()
|
||||
}
|
||||
}
|
||||
|
||||
func (level *Level) SetupGrid(game *Game) {
|
||||
// generic variant does not work here:
|
||||
// selector := generic.NewFilter1[components.Position]()
|
||||
@@ -92,15 +108,20 @@ func (level *Level) SetupGrid(game *Game) {
|
||||
playerobserver := observers.GetPlayerObserver(level.World)
|
||||
playerobserver.RemoveEntities()
|
||||
|
||||
// get rid of possibly manipulated map
|
||||
level.RestoreMap()
|
||||
|
||||
// setup world
|
||||
slog.Debug("new grid?")
|
||||
level.GridContainer.SetGrid(
|
||||
grid.NewGrid(game.World, level.Cellsize, level.Width, level.Height, level.Mapslice))
|
||||
}
|
||||
|
||||
// parses a RawLevel and generates a mapslice from it, which is being used as grid
|
||||
func LevelToSlice(game *Game, level *assets.RawLevel, tilesize int) map[image.Point]*assets.Tile {
|
||||
func LevelToSlice(game *Game, level *assets.RawLevel, tilesize int) (Map, Map) {
|
||||
size := game.ScreenWidth * game.ScreenHeight
|
||||
mapslice := make(map[image.Point]*assets.Tile, size)
|
||||
mapslice := make(Map, size)
|
||||
backupmap := make(Map, size)
|
||||
|
||||
for y, line := range strings.Split(string(level.Data), "\n") {
|
||||
if len(line) != game.ScreenWidth/tilesize && y < game.ScreenHeight/tilesize {
|
||||
@@ -113,9 +134,11 @@ func LevelToSlice(game *Game, level *assets.RawLevel, tilesize int) map[image.Po
|
||||
log.Fatalf("unregistered tile type %c encountered", char)
|
||||
}
|
||||
|
||||
mapslice[image.Point{x, y}] = assets.Tiles[byte(char)]
|
||||
tile := assets.Tiles[byte(char)]
|
||||
mapslice[image.Point{x, y}] = tile
|
||||
backupmap[image.Point{x, y}] = tile.Clone()
|
||||
}
|
||||
}
|
||||
|
||||
return mapslice
|
||||
return mapslice, backupmap
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user