diff --git a/assets/levels/00-deadly-obstacles.lvl b/assets/levels/00-deadly-obstacles.lvl deleted file mode 100644 index 48de769..0000000 --- a/assets/levels/00-deadly-obstacles.lvl +++ /dev/null @@ -1,18 +0,0 @@ -Description: open the door -MinMoves: 2 -Background: background-lila - - - - ####### - #o # - # t # - #> S <# - # # - # ^ # - ####### - - - - - diff --git a/assets/levels/01-friendly-obstacles.lvl b/assets/levels/01-friendly-obstacles.lvl deleted file mode 100644 index 3e0322e..0000000 --- a/assets/levels/01-friendly-obstacles.lvl +++ /dev/null @@ -1,18 +0,0 @@ -Description: test obstacles -MinMoves: 14 -Background: background-lila - - - - ############# - # t # - #> S # # - # ># ^# - #< #W##### - # o v# o# - ############# - - - - - diff --git a/assets/levels/02-start.lvl b/assets/levels/02-start.lvl deleted file mode 100644 index 25a86ae..0000000 --- a/assets/levels/02-start.lvl +++ /dev/null @@ -1,18 +0,0 @@ -Description: collect all yellow dots -MinMoves: 7 -Background: background-lila - - - # ############ - # # - ############ # - # o S # - # ######## ### - + # - ############ # - # o # # - # # ######## # - # # o - # ############ - - diff --git a/assets/levels/03-own.lvl b/assets/levels/03-own.lvl deleted file mode 100644 index 5803282..0000000 --- a/assets/levels/03-own.lvl +++ /dev/null @@ -1,18 +0,0 @@ -Description: some enemies can be moved -MinMoves: 5 -Background: background-lila - - - - - ######## - # o trans.Current { - trans.Current++ - return trans.Sprites[trans.Current] - } - - log.Fatalf("not enough sprites in transient tile, have %d sprites, index requested: %d", - len(trans.Sprites), trans.Current+1, - ) - - return "" + Wall *ebiten.Image } diff --git a/config/static.go b/config/static.go index de1dc20..4517b06 100644 --- a/config/static.go +++ b/config/static.go @@ -13,13 +13,18 @@ const ( All ) -const PLAYERSPEED int = 5 -const PARTICLE_LOOPWAIT time.Duration = 250 * time.Millisecond -const LEVEL_END_WAIT time.Duration = 500 * time.Millisecond -const version string = "1.2.2" +const ( + PLAYERSPEED int = 5 + PARTICLE_LOOPWAIT time.Duration = 250 * time.Millisecond + LEVEL_END_WAIT time.Duration = 500 * time.Millisecond + version string = "1.2.3" -const MenuRectX int = 600 -const MenuRectY int = 0 -const MenuRectCellsize int = 32 + MenuRectX int = 600 + MenuRectY int = 0 + MenuRectCellsize int = 32 + + LDTK_Entity_Ref string = "Entity_ref" + LDTK_Toggle_Tile string = "Toggle" +) var VERSION string // maintained by -x diff --git a/game/levels.go b/game/levels.go index df53fe7..c698755 100644 --- a/game/levels.go +++ b/game/levels.go @@ -8,6 +8,7 @@ import ( "openquell/grid" "openquell/observers" "openquell/systems" + "openquell/util" "strings" "github.com/hajimehoshi/ebiten/v2" @@ -173,20 +174,27 @@ func LevelToSlice(game *Game, level *ldtkgo.Level, tilesize int) (Map, Map) { tile := assets.Tiles[entity.Identifier] tile.Id = entity.IID - ref := entity.PropertyByIdentifier("Entity_ref") - if ref != nil { - if ref.Value != nil { - refid := ref.Value.(map[string]interface{}) - tile.Ref = refid["entityIid"].(string) - slog.Debug("LOAD TILE", "tileref", - tile.Ref, "tileid", tile.Id, - "name", entity.Identifier, - "isswitch", tile.Switch, - "isdoor", tile.Door, - ) - } + toggleRect := util.GetPropertyToggleTile(entity) + if toggleRect != nil { + tile.ToggleSprite = tileset.SubImage( + image.Rect(toggleRect.X, toggleRect.Y, + toggleRect.X+toggleRect.W, + toggleRect.Y+toggleRect.H)).(*ebiten.Image) + } + tile.Ref = util.GetPropertyRef(entity) + if tile.Transient { + slog.Debug("LOAD TILE", "tileref", + tile.Ref, "tileid", tile.Id, + "name", entity.Identifier, + "isswitch", tile.Switch, + "isdoor", tile.Door, + "togglerect", toggleRect, + "tilerect", entity.TileRect, + ) + + } tileRect := entity.TileRect tile.Sprite = tileset.SubImage( diff --git a/grid/grid.go b/grid/grid.go index 0626f6f..6992252 100644 --- a/grid/grid.go +++ b/grid/grid.go @@ -126,7 +126,7 @@ func NewGrid(world *ecs.World, case tile.Transient: entity := transmapper.New() pos, render, transient = transmapper.Get(entity) - transient.Sprites = tile.TileNames + transient.Wall = tile.ToggleSprite case tile.Destroyable: entity := destructiblemapper.New() @@ -139,16 +139,16 @@ func NewGrid(world *ecs.World, case tile.Switch: entity := switchmapper.New() pos, render, _, switcher = switchmapper.Get(entity) - switcher.CloseSprite = tile.Tiles[0] - switcher.OpenSprite = tile.Tiles[1] + switcher.CloseSprite = tile.Sprite + switcher.OpenSprite = tile.ToggleSprite switcher.Ref = tile.Ref switches = append(switches, entity) case tile.Door: entity := doormapper.New() pos, render, _, door = doormapper.Get(entity) - door.CloseSprite = tile.Tiles[0] - door.OpenSprite = tile.Tiles[1] + door.CloseSprite = tile.Sprite + door.OpenSprite = tile.ToggleSprite door.Id = tile.Id doors = append(doors, entity) @@ -156,11 +156,8 @@ func NewGrid(world *ecs.World, log.Fatalln("unsupported tile type encountered") } - // FIXME: this image is never being used because it is - // being overwritten in game/levels.go:LevelToSlice(). The - // image is taken from the LDTK map, not from the Tile{} - // definition anymore render.Image = tile.Sprite + render.Pos = pos default: // empty cell, this is where the player[s] move. No @@ -227,17 +224,5 @@ func (grid *Grid) SetFloorTile(point image.Point) { } func (grid *Grid) SetSolidTile(tile *assets.Tile, point image.Point) { - solidmapper := generic.NewMap4[ - components.Position, - components.Renderable, - components.Tilish, - components.Solid](grid.World) - grid.Map[point] = tile - - entity := solidmapper.New() - pos, render, _, _ := solidmapper.Get(entity) - - render.Image = tile.Sprite - pos.Update(point.X*grid.Tilesize, point.Y*grid.Tilesize, grid.Tilesize) } diff --git a/src/entitymap.xcf b/src/entitymap.xcf index 1cd1095..779d134 100644 Binary files a/src/entitymap.xcf and b/src/entitymap.xcf differ diff --git a/systems/grid_system.go b/systems/grid_system.go index fd9fa96..8586b0d 100644 --- a/systems/grid_system.go +++ b/systems/grid_system.go @@ -1,6 +1,7 @@ package systems import ( + "log/slog" . "openquell/components" "github.com/hajimehoshi/ebiten/v2" @@ -53,10 +54,13 @@ func (system *GridSystem) Draw(screen *ebiten.Image) { counter := 0 for query.Next() { sprite, pos, _ := query.Get() + counter++ op.GeoM.Reset() op.GeoM.Translate(float64(pos.X), float64(pos.Y)) + slog.Debug("rendering tile", "sprite", sprite) system.Cache.DrawImage(sprite.Image, op) + } op.GeoM.Reset() diff --git a/systems/pair_system.go b/systems/pair_system.go index c1735f0..9687bb6 100644 --- a/systems/pair_system.go +++ b/systems/pair_system.go @@ -72,6 +72,7 @@ func (system *PairSystem) Update() error { if ok { // player moved on top of the switch switcher.Toggle() + // open door door := system.World.Relations().Get(query.Entity(), relID) EntitiesToSwitch = append(EntitiesToSwitch, diff --git a/systems/transient_system.go b/systems/transient_system.go index 7569771..7c49266 100644 --- a/systems/transient_system.go +++ b/systems/transient_system.go @@ -26,7 +26,7 @@ type TransientSystem struct { type TransientToWall struct { Entity ecs.Entity - NewSprite string + NewSprite *ebiten.Image Position components.Position } @@ -77,7 +77,7 @@ func (system *TransientSystem) Update() error { EntitiestoMakeSolid = append(EntitiestoMakeSolid, TransientToWall{ Entity: query.Entity(), Position: *transientposition, - NewSprite: transient.GetNext(), + NewSprite: transient.Wall, }) slog.Debug("transient added to make solid") } @@ -91,18 +91,20 @@ func (system *TransientSystem) Update() error { system.World.RemoveEntity(convertible.Entity) // replace with solid entity - slog.Debug("transient add solid") + slog.Debug("transient add solid", "wall", convertible.NewSprite.Bounds()) entity := system.SolidMapper.New() pos, render, _, _ := system.SolidMapper.Get(entity) // set it up apropriately pos.Set(&convertible.Position) - render.Image = assets.Assets[convertible.NewSprite] + render.Image = convertible.NewSprite + render.Pos = pos + slog.Debug("new render", "render", render) // also setup the grid tile with a new solid, so that // collision detection works system.GridContainer.Grid.SetSolidTile( - assets.NewTileBlock(convertible.NewSprite), + assets.NewTileBlock(), convertible.Position.Point(), ) } diff --git a/util/ldtkhelpers.go b/util/ldtkhelpers.go new file mode 100644 index 0000000..ee409f1 --- /dev/null +++ b/util/ldtkhelpers.go @@ -0,0 +1,48 @@ +package util + +import ( + "openquell/config" + + "github.com/solarlune/ldtkgo" +) + +type TileSetSubRect struct { + X, Y, W, H int +} + +func Map2Subrect(raw map[string]any) *TileSetSubRect { + + // we need to translate this map for less typing + return &TileSetSubRect{ + W: int(raw["w"].(float64)), + H: int(raw["h"].(float64)), + X: int(raw["x"].(float64)), + Y: int(raw["y"].(float64)), + } +} + +func GetPropertyRef(entity *ldtkgo.Entity) string { + ref := entity.PropertyByIdentifier(config.LDTK_Entity_Ref) + if ref != nil { + if ref.Value != nil { + refid := ref.Value.(map[string]interface{}) + ref := refid["entityIid"].(string) + + if ref != "" { + return ref + } + } + } + + return "" +} + +func GetPropertyToggleTile(entity *ldtkgo.Entity) *TileSetSubRect { + + ref := entity.PropertyByIdentifier(config.LDTK_Toggle_Tile) + if ref != nil { + return Map2Subrect(ref.AsMap()) + } + + return nil +}