diff --git a/data/maps/levels.yaml b/data/maps/levels.yaml new file mode 100644 index 0000000..56bcc56 --- /dev/null +++ b/data/maps/levels.yaml @@ -0,0 +1,45 @@ +# Índex ordenat de les 30 sales del joc (5 piràmides × 6 sales). El +# LevelManager carrega aquesta llista a l'arrencada i la fa servir com a +# font de veritat per a `currentPath()`, `advance()`, `setIndex()` i la +# resta de consultes que li facin la GameScene, l'Editor i els salts de +# debug. Per reordenar la progressió, canvia l'ordre d'aquesta seqüència +# (no cal renombrar fitxers). Per afegir una sala, crea el YAML i posa +# una entrada nova; els camps `pyramid` i `room` són purament informatius +# (apareixen als logs i al text d'intro de sala) — l'únic camp que +# realment carrega l'engine és `file`. +# +# Convenció de nomenclatura del fitxer: `data/maps/p/r.yaml` per +# dins la piràmide N, sala M. La carpeta `p/` agruparà més endavant +# les metadades comunes de la piràmide (tileset, paleta, música). + +sequence: + - { pyramid: 1, room: 1, file: data/maps/p1/r1.yaml } + - { pyramid: 1, room: 2, file: data/maps/p1/r2.yaml } + - { pyramid: 1, room: 3, file: data/maps/p1/r3.yaml } + - { pyramid: 1, room: 4, file: data/maps/p1/r4.yaml } + - { pyramid: 1, room: 5, file: data/maps/p1/r5.yaml } + - { pyramid: 1, room: 6, file: data/maps/p1/r6.yaml } + - { pyramid: 2, room: 1, file: data/maps/p2/r1.yaml } + - { pyramid: 2, room: 2, file: data/maps/p2/r2.yaml } + - { pyramid: 2, room: 3, file: data/maps/p2/r3.yaml } + - { pyramid: 2, room: 4, file: data/maps/p2/r4.yaml } + - { pyramid: 2, room: 5, file: data/maps/p2/r5.yaml } + - { pyramid: 2, room: 6, file: data/maps/p2/r6.yaml } + - { pyramid: 3, room: 1, file: data/maps/p3/r1.yaml } + - { pyramid: 3, room: 2, file: data/maps/p3/r2.yaml } + - { pyramid: 3, room: 3, file: data/maps/p3/r3.yaml } + - { pyramid: 3, room: 4, file: data/maps/p3/r4.yaml } + - { pyramid: 3, room: 5, file: data/maps/p3/r5.yaml } + - { pyramid: 3, room: 6, file: data/maps/p3/r6.yaml } + - { pyramid: 4, room: 1, file: data/maps/p4/r1.yaml } + - { pyramid: 4, room: 2, file: data/maps/p4/r2.yaml } + - { pyramid: 4, room: 3, file: data/maps/p4/r3.yaml } + - { pyramid: 4, room: 4, file: data/maps/p4/r4.yaml } + - { pyramid: 4, room: 5, file: data/maps/p4/r5.yaml } + - { pyramid: 4, room: 6, file: data/maps/p4/r6.yaml } + - { pyramid: 5, room: 1, file: data/maps/p5/r1.yaml } + - { pyramid: 5, room: 2, file: data/maps/p5/r2.yaml } + - { pyramid: 5, room: 3, file: data/maps/p5/r3.yaml } + - { pyramid: 5, room: 4, file: data/maps/p5/r4.yaml } + - { pyramid: 5, room: 5, file: data/maps/p5/r5.yaml } + - { pyramid: 5, room: 6, file: data/maps/p5/r6.yaml } diff --git a/data/maps/p1/r1.yaml b/data/maps/p1/r1.yaml new file mode 100644 index 0000000..76b1506 --- /dev/null +++ b/data/maps/p1/r1.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 1 +room: 1 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p1/r2.yaml b/data/maps/p1/r2.yaml new file mode 100644 index 0000000..c9f8a2b --- /dev/null +++ b/data/maps/p1/r2.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 1 +room: 2 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p1/r3.yaml b/data/maps/p1/r3.yaml new file mode 100644 index 0000000..a9f9709 --- /dev/null +++ b/data/maps/p1/r3.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 1 +room: 3 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p1/r4.yaml b/data/maps/p1/r4.yaml new file mode 100644 index 0000000..f73b602 --- /dev/null +++ b/data/maps/p1/r4.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 1 +room: 4 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p1/r5.yaml b/data/maps/p1/r5.yaml new file mode 100644 index 0000000..02ac37a --- /dev/null +++ b/data/maps/p1/r5.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 1 +room: 5 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p1/r6.yaml b/data/maps/p1/r6.yaml new file mode 100644 index 0000000..7d6d97b --- /dev/null +++ b/data/maps/p1/r6.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 1 +room: 6 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p2/r1.yaml b/data/maps/p2/r1.yaml new file mode 100644 index 0000000..8cb4456 --- /dev/null +++ b/data/maps/p2/r1.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 2 +room: 1 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p2/r2.yaml b/data/maps/p2/r2.yaml new file mode 100644 index 0000000..3432cc8 --- /dev/null +++ b/data/maps/p2/r2.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 2 +room: 2 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p2/r3.yaml b/data/maps/p2/r3.yaml new file mode 100644 index 0000000..c3f3fbf --- /dev/null +++ b/data/maps/p2/r3.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 2 +room: 3 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p2/r4.yaml b/data/maps/p2/r4.yaml new file mode 100644 index 0000000..9bd79c1 --- /dev/null +++ b/data/maps/p2/r4.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 2 +room: 4 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p2/r5.yaml b/data/maps/p2/r5.yaml new file mode 100644 index 0000000..5d3b4a9 --- /dev/null +++ b/data/maps/p2/r5.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 2 +room: 5 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p2/r6.yaml b/data/maps/p2/r6.yaml new file mode 100644 index 0000000..451af3e --- /dev/null +++ b/data/maps/p2/r6.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 2 +room: 6 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p3/r1.yaml b/data/maps/p3/r1.yaml new file mode 100644 index 0000000..b491c12 --- /dev/null +++ b/data/maps/p3/r1.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 3 +room: 1 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p3/r2.yaml b/data/maps/p3/r2.yaml new file mode 100644 index 0000000..c16ea92 --- /dev/null +++ b/data/maps/p3/r2.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 3 +room: 2 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p3/r3.yaml b/data/maps/p3/r3.yaml new file mode 100644 index 0000000..b8e2f1d --- /dev/null +++ b/data/maps/p3/r3.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 3 +room: 3 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p3/r4.yaml b/data/maps/p3/r4.yaml new file mode 100644 index 0000000..a45c987 --- /dev/null +++ b/data/maps/p3/r4.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 3 +room: 4 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p3/r5.yaml b/data/maps/p3/r5.yaml new file mode 100644 index 0000000..e66da3b --- /dev/null +++ b/data/maps/p3/r5.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 3 +room: 5 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p3/r6.yaml b/data/maps/p3/r6.yaml new file mode 100644 index 0000000..9d1d79b --- /dev/null +++ b/data/maps/p3/r6.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 3 +room: 6 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p4/r1.yaml b/data/maps/p4/r1.yaml new file mode 100644 index 0000000..32a80a9 --- /dev/null +++ b/data/maps/p4/r1.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 4 +room: 1 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p4/r2.yaml b/data/maps/p4/r2.yaml new file mode 100644 index 0000000..ede3b94 --- /dev/null +++ b/data/maps/p4/r2.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 4 +room: 2 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p4/r3.yaml b/data/maps/p4/r3.yaml new file mode 100644 index 0000000..780ef09 --- /dev/null +++ b/data/maps/p4/r3.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 4 +room: 3 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p4/r4.yaml b/data/maps/p4/r4.yaml new file mode 100644 index 0000000..09c8696 --- /dev/null +++ b/data/maps/p4/r4.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 4 +room: 4 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p4/r5.yaml b/data/maps/p4/r5.yaml new file mode 100644 index 0000000..590e01a --- /dev/null +++ b/data/maps/p4/r5.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 4 +room: 5 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p4/r6.yaml b/data/maps/p4/r6.yaml new file mode 100644 index 0000000..f76058e --- /dev/null +++ b/data/maps/p4/r6.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 4 +room: 6 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p5/r1.yaml b/data/maps/p5/r1.yaml new file mode 100644 index 0000000..e346bff --- /dev/null +++ b/data/maps/p5/r1.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 5 +room: 1 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p5/r2.yaml b/data/maps/p5/r2.yaml new file mode 100644 index 0000000..d67f75f --- /dev/null +++ b/data/maps/p5/r2.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 5 +room: 2 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p5/r3.yaml b/data/maps/p5/r3.yaml new file mode 100644 index 0000000..8de253c --- /dev/null +++ b/data/maps/p5/r3.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 5 +room: 3 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p5/r4.yaml b/data/maps/p5/r4.yaml new file mode 100644 index 0000000..b8dd31e --- /dev/null +++ b/data/maps/p5/r4.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 5 +room: 4 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p5/r5.yaml b/data/maps/p5/r5.yaml new file mode 100644 index 0000000..ea6f183 --- /dev/null +++ b/data/maps/p5/r5.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 5 +room: 5 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9] diff --git a/data/maps/p5/r6.yaml b/data/maps/p5/r6.yaml new file mode 100644 index 0000000..864d24b --- /dev/null +++ b/data/maps/p5/r6.yaml @@ -0,0 +1,140 @@ +# Mapa de la piràmide: graella 21×15 de tiles 16×16 sobre tomb.gif. +# Overscan horitzontal: 8 px per banda (les parets laterals ocupen 2 tiles +# en el tilemap però només 1.5 visibles al canvas, així que la textura es +# dibuixa amb un origen de x=-8). Vertical no cal overscan: 15·16 = 240. +# +# Format del tilemap: +# `data` és una llista de files; cada fila és una llista d'índexs del +# tileset (lineal esq→dre, dalt→baix). Amb un tileset de 512×256 i tiles +# de 16×16 hi ha 32 tiles per fila. Un valor negatiu (p.ex. -1) deixa +# la cel·la buida (transparent), útil per caselles que ocuparà un actor. + +pyramid: 5 +room: 6 +tileset: data/tilesets/tomb.gif +tile_size: 16 +origin: [-8, 0] + +# Índex de tile amb què cada jugador deixa rastre en trepitjar un sòl +# pintable. Un índex per jugador perquè a multijugador local el recorregut +# es distingeix a simple vista. Provisional fins que l'art del pintat +# estigui definit; canviar aquí l'índex és tot el que cal. Omet el camp +# per desactivar el pintat per a aquest jugador. +player1_paint_tile: 0 +player2_paint_tile: 4 + +# Física del contacte entre jugadors. Quan un jugador està quiet i l'altre +# el topa, el segon l'empenta a aquesta fracció de la velocitat normal (i +# ell mateix es ralentitza per mantenir el grup). En head-on, ambdós +# s'anul·len (sense push, sense moviment). +push_factor: 0.30 + +# Geometria lògica de la piràmide (separada del render visual del tileset). +# La graella de sarcòfags, el pitch entre ells i les amplades dels murs +# decideixen els límits del jugador i les seues caixes de col·lisió. Abans +# vivien com a `static constexpr` a map.hpp; ara cada piràmide pot definir +# la seua pròpia forma sense recompilar. +geometry: + grid_cols: 4 + grid_rows: 5 + sarc_w: 48 + sarc_h: 16 + pitch_x: 64 + pitch_y: 32 + hud_h: 24 + back_wall_h: 24 + side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 + +data: + - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + - [ 1, 91,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, 92, 1] + - [ 1, 98,113,113, 95,113, 94,113,113,113,113,113,113,113, 94,113,102,113,113, 96, 1] + - [ 1, 98, 8, 8, 6, 8, 17, 8, 10, 8, 17, 8, 8, 8, 17, 8, 8, 8, 8, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 9, 2, 8, 10, 8, 8, 8, 8, 10, 8, 8, 26, 8, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 8, 26, 8, 8, 9, 8, 8, 8, 8, 8, 10, 8, 6, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 8, 2, 8, 8, 8, 9, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 6, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 17, 8, 10, 8, 8, 10, 2, 8, 8, 26, 8, 8, 8, 8, 10, 8, 17, 96, 1] + - [ 1, 98, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 2, 2, 2, 8, 96, 1] + - [ 1, 98, 8, 10, 6, 6, 17, 8, 8, 8, 17, 8, 9, 8, 17, 8, 2, 8, 8, 96, 1] + - [ 1, 99, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,100, 1] + +# Spawns d'entitats per a aquest nivell. Es llegeixen des de +# EntityManager::loadFromLevel al GameScene. Convencions: +# - sarcophagus → `sarc_position: [sarc_col, sarc_row]` en la graella de +# sarcòfags (4×5). EntityManager calcula el rect píxel via +# Map::getSarcRect i l'ancoratge de tile per al perímetre. +# - la resta (torch, door, mummy, rolling_rock, wall_trap, floor_trap) +# → `position: [tile_col, tile_row]` en coordenades del tilemap +# (origen `[-8, 0]` per defecte). Pixel = tile*16 + tilemap_origin. +# +# Dos sarcòfags en cantonades oposades → perímetres aïllats (cap tile en +# comú). La porta va al centre inferior, on el tilemap té els tiles +# d'obertura (262/263). La momia al corredor central. L'antorxa al costat +# superior esquerre per verificar render d'una entitat decorativa. +entities: + - type: torch + position: [4, 2] + - type: torch + position: [8, 2] + - type: torch + position: [12, 2] + - type: torch + position: [16, 2] + - type: sarcophagus + sarc_position: [0, 0] + - type: sarcophagus + sarc_position: [1, 0] + - type: sarcophagus + sarc_position: [2, 0] + - type: sarcophagus + sarc_position: [3, 0] + - type: sarcophagus + sarc_position: [0, 1] + - type: sarcophagus + sarc_position: [1, 1] + - type: sarcophagus + sarc_position: [2, 1] + - type: sarcophagus + sarc_position: [3, 1] + - type: sarcophagus + sarc_position: [0, 2] + - type: sarcophagus + sarc_position: [1, 2] + - type: sarcophagus + sarc_position: [2, 2] + - type: sarcophagus + sarc_position: [3, 2] + - type: sarcophagus + sarc_position: [0, 3] + - type: sarcophagus + sarc_position: [1, 3] + - type: sarcophagus + sarc_position: [2, 3] + - type: sarcophagus + sarc_position: [3, 3] + - type: sarcophagus + sarc_position: [0, 4] + - type: sarcophagus + sarc_position: [1, 4] + - type: sarcophagus + sarc_position: [2, 4] + - type: sarcophagus + sarc_position: [3, 4] + - type: door + # Sense `position`: la porta sempre viu al mur trasser. La columna + # transitable la dicta `geometry.door_col`; el render i la caixa + # de col·lisió es deriven d'aquesta dada al loadFromLevel. + - type: mummy + position: [10, 7] + - type: mummy + position: [7, 9]