From dc1470ec0eddba99861e8a46400b0ca1b887cdf5 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 3 Apr 2026 08:17:41 +0200 Subject: [PATCH] - nou format per a assets.yaml - ResourceList gestiona addAsset i removeAsset --- config/assets.yaml | 885 +++++++++--------------- source/core/resources/resource_list.cpp | 214 ++++-- source/core/resources/resource_list.hpp | 4 + source/game/editor/map_editor.cpp | 77 +-- source/game/editor/map_editor.hpp | 3 - 5 files changed, 490 insertions(+), 693 deletions(-) diff --git a/config/assets.yaml b/config/assets.yaml index c5006ff..4f21b52 100644 --- a/config/assets.yaml +++ b/config/assets.yaml @@ -4,624 +4,369 @@ assets: # FONTS fonts: - - type: BITMAP - path: ${PREFIX}/data/font/smb2.gif - - type: FONT - path: ${PREFIX}/data/font/smb2.fnt - - type: BITMAP - path: ${PREFIX}/data/font/aseprite.gif - - type: FONT - path: ${PREFIX}/data/font/aseprite.fnt - - type: BITMAP - path: ${PREFIX}/data/font/gauntlet.gif - - type: FONT - path: ${PREFIX}/data/font/gauntlet.fnt - - type: BITMAP - path: ${PREFIX}/data/font/subatomic.gif - - type: FONT - path: ${PREFIX}/data/font/subatomic.fnt - - type: BITMAP - path: ${PREFIX}/data/font/8bithud.gif - - type: FONT - path: ${PREFIX}/data/font/8bithud.fnt + BITMAP: + - ${PREFIX}/data/font/smb2.gif + - ${PREFIX}/data/font/aseprite.gif + - ${PREFIX}/data/font/gauntlet.gif + - ${PREFIX}/data/font/subatomic.gif + - ${PREFIX}/data/font/8bithud.gif + FONT: + - ${PREFIX}/data/font/smb2.fnt + - ${PREFIX}/data/font/aseprite.fnt + - ${PREFIX}/data/font/gauntlet.fnt + - ${PREFIX}/data/font/subatomic.fnt + - ${PREFIX}/data/font/8bithud.fnt # PALETTES palettes: - - type: PALETTE - path: ${PREFIX}/data/palette/zx-spectrum.pal - - type: PALETTE - path: ${PREFIX}/data/palette/zx-spectrum-adjusted.pal - - type: PALETTE - path: ${PREFIX}/data/palette/zxarne-5.2.pal - - type: PALETTE - path: ${PREFIX}/data/palette/black-and-white.pal - - type: PALETTE - path: ${PREFIX}/data/palette/green-phosphor.pal - - type: PALETTE - path: ${PREFIX}/data/palette/orange-screen.pal - - type: PALETTE - path: ${PREFIX}/data/palette/ruzx-spectrum.pal - - type: PALETTE - path: ${PREFIX}/data/palette/ruzx-spectrum-revision-2.pal - - type: PALETTE - path: ${PREFIX}/data/palette/pico-8.pal - - type: PALETTE - path: ${PREFIX}/data/palette/sweetie.pal - - type: PALETTE - path: ${PREFIX}/data/palette/island-joy.pal - - type: PALETTE - path: ${PREFIX}/data/palette/lost-century.pal - - type: PALETTE - path: ${PREFIX}/data/palette/na.pal - - type: PALETTE - path: ${PREFIX}/data/palette/steam-lords.pal - - type: PALETTE - path: ${PREFIX}/data/palette/winds-seed-pc98.pal - - type: PALETTE - path: ${PREFIX}/data/palette/psychic-fibre.pal - - type: PALETTE - path: ${PREFIX}/data/palette/shido-cyberneon.pal - - type: PALETTE - path: ${PREFIX}/data/palette/darkseed.pal - - type: PALETTE - path: ${PREFIX}/data/palette/antiquity.pal - - type: PALETTE - path: ${PREFIX}/data/palette/bubblegum.pal - - type: PALETTE - path: ${PREFIX}/data/palette/vanilla-milkshake.pal - - type: PALETTE - path: ${PREFIX}/data/palette/aged-terracotta.pal - - type: PALETTE - path: ${PREFIX}/data/palette/h16da.pal + PALETTE: + - ${PREFIX}/data/palette/zx-spectrum.pal + - ${PREFIX}/data/palette/zx-spectrum-adjusted.pal + - ${PREFIX}/data/palette/zxarne-5.2.pal + - ${PREFIX}/data/palette/black-and-white.pal + - ${PREFIX}/data/palette/green-phosphor.pal + - ${PREFIX}/data/palette/orange-screen.pal + - ${PREFIX}/data/palette/ruzx-spectrum.pal + - ${PREFIX}/data/palette/ruzx-spectrum-revision-2.pal + - ${PREFIX}/data/palette/pico-8.pal + - ${PREFIX}/data/palette/sweetie.pal + - ${PREFIX}/data/palette/island-joy.pal + - ${PREFIX}/data/palette/lost-century.pal + - ${PREFIX}/data/palette/na.pal + - ${PREFIX}/data/palette/steam-lords.pal + - ${PREFIX}/data/palette/winds-seed-pc98.pal + - ${PREFIX}/data/palette/psychic-fibre.pal + - ${PREFIX}/data/palette/shido-cyberneon.pal + - ${PREFIX}/data/palette/darkseed.pal + - ${PREFIX}/data/palette/antiquity.pal + - ${PREFIX}/data/palette/bubblegum.pal + - ${PREFIX}/data/palette/vanilla-milkshake.pal + - ${PREFIX}/data/palette/aged-terracotta.pal + - ${PREFIX}/data/palette/h16da.pal # LOCALE locale: - - type: DATA - path: ${PREFIX}/data/locale/en.yaml - - type: DATA - path: ${PREFIX}/data/locale/ca.yaml + DATA: + - ${PREFIX}/data/locale/en.yaml + - ${PREFIX}/data/locale/ca.yaml # INPUT input: - - type: DATA - path: ${PREFIX}/gamecontrollerdb.txt + DATA: + - ${PREFIX}/gamecontrollerdb.txt # SYSTEM system: - - type: DATA - path: ${SYSTEM_FOLDER}/config.yaml - required: false - absolute: true - - type: DATA - path: ${SYSTEM_FOLDER}/debug.yaml - required: false - absolute: true - - type: DATA - path: ${SYSTEM_FOLDER}/editor.yaml - required: false - absolute: true - - type: DATA - path: ${SYSTEM_FOLDER}/stats_buffer.csv - required: false - absolute: true - - type: DATA - path: ${SYSTEM_FOLDER}/stats.csv - required: false - absolute: true - - type: DATA - path: ${SYSTEM_FOLDER}/cheevos.bin - required: false - absolute: true - - type: DATA - path: ${SYSTEM_FOLDER}/shaders/postfx.yaml - required: false - absolute: true - - type: DATA - path: ${SYSTEM_FOLDER}/shaders/crtpi.yaml - required: false - absolute: true + DATA: + - path: ${SYSTEM_FOLDER}/config.yaml + required: false + absolute: true + - path: ${SYSTEM_FOLDER}/debug.yaml + required: false + absolute: true + - path: ${SYSTEM_FOLDER}/editor.yaml + required: false + absolute: true + - path: ${SYSTEM_FOLDER}/stats_buffer.csv + required: false + absolute: true + - path: ${SYSTEM_FOLDER}/stats.csv + required: false + absolute: true + - path: ${SYSTEM_FOLDER}/cheevos.bin + required: false + absolute: true + - path: ${SYSTEM_FOLDER}/shaders/postfx.yaml + required: false + absolute: true + - path: ${SYSTEM_FOLDER}/shaders/crtpi.yaml + required: false + absolute: true # CONSOLE console: - - type: DATA - path: ${PREFIX}/data/console/commands.yaml + DATA: + - ${PREFIX}/data/console/commands.yaml # ROOMS rooms: - - type: ROOM - path: ${PREFIX}/data/room/01.yaml - - type: ROOM - path: ${PREFIX}/data/room/02.yaml - - type: ROOM - path: ${PREFIX}/data/room/03.yaml - - type: ROOM - path: ${PREFIX}/data/room/04.yaml - - type: ROOM - path: ${PREFIX}/data/room/05.yaml - - type: ROOM - path: ${PREFIX}/data/room/06.yaml - - type: ROOM - path: ${PREFIX}/data/room/07.yaml - - type: ROOM - path: ${PREFIX}/data/room/08.yaml - - type: ROOM - path: ${PREFIX}/data/room/09.yaml - - type: ROOM - path: ${PREFIX}/data/room/10.yaml - - type: ROOM - path: ${PREFIX}/data/room/11.yaml - - type: ROOM - path: ${PREFIX}/data/room/12.yaml - - type: ROOM - path: ${PREFIX}/data/room/13.yaml - - type: ROOM - path: ${PREFIX}/data/room/14.yaml - - type: ROOM - path: ${PREFIX}/data/room/15.yaml - - type: ROOM - path: ${PREFIX}/data/room/16.yaml - - type: ROOM - path: ${PREFIX}/data/room/17.yaml - - type: ROOM - path: ${PREFIX}/data/room/18.yaml - - type: ROOM - path: ${PREFIX}/data/room/19.yaml - - type: ROOM - path: ${PREFIX}/data/room/20.yaml - - type: ROOM - path: ${PREFIX}/data/room/21.yaml - - type: ROOM - path: ${PREFIX}/data/room/22.yaml - - type: ROOM - path: ${PREFIX}/data/room/23.yaml - - type: ROOM - path: ${PREFIX}/data/room/24.yaml - - type: ROOM - path: ${PREFIX}/data/room/25.yaml - - type: ROOM - path: ${PREFIX}/data/room/26.yaml - - type: ROOM - path: ${PREFIX}/data/room/27.yaml - - type: ROOM - path: ${PREFIX}/data/room/28.yaml - - type: ROOM - path: ${PREFIX}/data/room/29.yaml - - type: ROOM - path: ${PREFIX}/data/room/30.yaml - - type: ROOM - path: ${PREFIX}/data/room/31.yaml - - type: ROOM - path: ${PREFIX}/data/room/32.yaml - - type: ROOM - path: ${PREFIX}/data/room/33.yaml - - type: ROOM - path: ${PREFIX}/data/room/34.yaml - - type: ROOM - path: ${PREFIX}/data/room/35.yaml - - type: ROOM - path: ${PREFIX}/data/room/36.yaml - - type: ROOM - path: ${PREFIX}/data/room/37.yaml - - type: ROOM - path: ${PREFIX}/data/room/38.yaml - - type: ROOM - path: ${PREFIX}/data/room/39.yaml - - type: ROOM - path: ${PREFIX}/data/room/40.yaml - - type: ROOM - path: ${PREFIX}/data/room/41.yaml - - type: ROOM - path: ${PREFIX}/data/room/42.yaml - - type: ROOM - path: ${PREFIX}/data/room/43.yaml - - type: ROOM - path: ${PREFIX}/data/room/44.yaml - - type: ROOM - path: ${PREFIX}/data/room/45.yaml - - type: ROOM - path: ${PREFIX}/data/room/46.yaml - - type: ROOM - path: ${PREFIX}/data/room/47.yaml - - type: ROOM - path: ${PREFIX}/data/room/48.yaml - - type: ROOM - path: ${PREFIX}/data/room/49.yaml - - type: ROOM - path: ${PREFIX}/data/room/50.yaml - - type: ROOM - path: ${PREFIX}/data/room/51.yaml - - type: ROOM - path: ${PREFIX}/data/room/52.yaml - - type: ROOM - path: ${PREFIX}/data/room/53.yaml - - type: ROOM - path: ${PREFIX}/data/room/54.yaml - - type: ROOM - path: ${PREFIX}/data/room/55.yaml - - type: ROOM - path: ${PREFIX}/data/room/56.yaml - - type: ROOM - path: ${PREFIX}/data/room/57.yaml - - type: ROOM - path: ${PREFIX}/data/room/58.yaml - - type: ROOM - path: ${PREFIX}/data/room/59.yaml - - type: ROOM - path: ${PREFIX}/data/room/60.yaml + ROOM: + - ${PREFIX}/data/room/01.yaml + - ${PREFIX}/data/room/02.yaml + - ${PREFIX}/data/room/03.yaml + - ${PREFIX}/data/room/04.yaml + - ${PREFIX}/data/room/05.yaml + - ${PREFIX}/data/room/06.yaml + - ${PREFIX}/data/room/07.yaml + - ${PREFIX}/data/room/08.yaml + - ${PREFIX}/data/room/09.yaml + - ${PREFIX}/data/room/10.yaml + - ${PREFIX}/data/room/11.yaml + - ${PREFIX}/data/room/12.yaml + - ${PREFIX}/data/room/13.yaml + - ${PREFIX}/data/room/14.yaml + - ${PREFIX}/data/room/15.yaml + - ${PREFIX}/data/room/16.yaml + - ${PREFIX}/data/room/17.yaml + - ${PREFIX}/data/room/18.yaml + - ${PREFIX}/data/room/19.yaml + - ${PREFIX}/data/room/20.yaml + - ${PREFIX}/data/room/21.yaml + - ${PREFIX}/data/room/22.yaml + - ${PREFIX}/data/room/23.yaml + - ${PREFIX}/data/room/24.yaml + - ${PREFIX}/data/room/25.yaml + - ${PREFIX}/data/room/26.yaml + - ${PREFIX}/data/room/27.yaml + - ${PREFIX}/data/room/28.yaml + - ${PREFIX}/data/room/29.yaml + - ${PREFIX}/data/room/30.yaml + - ${PREFIX}/data/room/31.yaml + - ${PREFIX}/data/room/32.yaml + - ${PREFIX}/data/room/33.yaml + - ${PREFIX}/data/room/34.yaml + - ${PREFIX}/data/room/35.yaml + - ${PREFIX}/data/room/36.yaml + - ${PREFIX}/data/room/37.yaml + - ${PREFIX}/data/room/38.yaml + - ${PREFIX}/data/room/39.yaml + - ${PREFIX}/data/room/40.yaml + - ${PREFIX}/data/room/41.yaml + - ${PREFIX}/data/room/42.yaml + - ${PREFIX}/data/room/43.yaml + - ${PREFIX}/data/room/44.yaml + - ${PREFIX}/data/room/45.yaml + - ${PREFIX}/data/room/46.yaml + - ${PREFIX}/data/room/47.yaml + - ${PREFIX}/data/room/48.yaml + - ${PREFIX}/data/room/49.yaml + - ${PREFIX}/data/room/50.yaml + - ${PREFIX}/data/room/51.yaml + - ${PREFIX}/data/room/52.yaml + - ${PREFIX}/data/room/53.yaml + - ${PREFIX}/data/room/54.yaml + - ${PREFIX}/data/room/55.yaml + - ${PREFIX}/data/room/56.yaml + - ${PREFIX}/data/room/57.yaml + - ${PREFIX}/data/room/58.yaml + - ${PREFIX}/data/room/59.yaml + - ${PREFIX}/data/room/60.yaml # TILESETS tilesets: - - type: BITMAP - path: ${PREFIX}/data/tilesets/standard.gif + BITMAP: + - ${PREFIX}/data/tilesets/standard.gif # ENEMIES enemies: - - type: ANIMATION - path: ${PREFIX}/data/enemies/abad_bell.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/abad_bell.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/abad.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/abad.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/amstrad_cs.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/amstrad_cs.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/flying_arounder.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/flying_arounder.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/stopped_arounder.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/stopped_arounder.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/walking_arounder.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/walking_arounder.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/arounders_door.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/arounders_door.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/arounders_machine.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/arounders_machine.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/bat.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/bat.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/batman_bell.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/batman_bell.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/batman_fire.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/batman_fire.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/batman.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/batman.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/bell.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/bell.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/bin.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/bin.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/bird.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/bird.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/breakout.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/breakout.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/bry.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/bry.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/chip.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/chip.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/code.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/code.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/congo.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/congo.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/crosshair.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/crosshair.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/demon.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/demon.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/dimallas.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/dimallas.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/floppy.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/floppy.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/dong.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/dong.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/guitar.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/guitar.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/heavy.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/heavy.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/jailer1.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/jailer1.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/jailer2.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/jailer2.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/jailer3.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/jailer3.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/jailbattle_alien.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/jailbattle_alien.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/jailbattle_human.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/jailbattle_human.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/jeannine.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/jeannine.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/lamp.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/lamp.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/lord_abad.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/lord_abad.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/matatunos.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/matatunos.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/mummy.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/mummy.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/paco.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/paco.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/elsa.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/elsa.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/qvoid.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/qvoid.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/robot.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/robot.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/sam.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/sam.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/shock.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/shock.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/sigmasua.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/sigmasua.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/spark.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/spark.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/special/aerojailer.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/special/aerojailer.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/special/arounder.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/special/arounder.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/special/pepe_rosita_job.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/special/pepe_rosita_job.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/special/shooting_star.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/special/shooting_star.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/spider.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/spider.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/tree_thing.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/tree_thing.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/tuno.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/tuno.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/tv_panel.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/tv_panel.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/tv.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/tv.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/upv_student.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/upv_student.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/wave.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/wave.gif - - type: ANIMATION - path: ${PREFIX}/data/enemies/z80.yaml - - type: BITMAP - path: ${PREFIX}/data/enemies/z80.gif + ANIMATION: + - ${PREFIX}/data/enemies/abad_bell.yaml + - ${PREFIX}/data/enemies/abad.yaml + - ${PREFIX}/data/enemies/amstrad_cs.yaml + - ${PREFIX}/data/enemies/flying_arounder.yaml + - ${PREFIX}/data/enemies/stopped_arounder.yaml + - ${PREFIX}/data/enemies/walking_arounder.yaml + - ${PREFIX}/data/enemies/arounders_door.yaml + - ${PREFIX}/data/enemies/arounders_machine.yaml + - ${PREFIX}/data/enemies/bat.yaml + - ${PREFIX}/data/enemies/batman_bell.yaml + - ${PREFIX}/data/enemies/batman_fire.yaml + - ${PREFIX}/data/enemies/batman.yaml + - ${PREFIX}/data/enemies/bell.yaml + - ${PREFIX}/data/enemies/bin.yaml + - ${PREFIX}/data/enemies/bird.yaml + - ${PREFIX}/data/enemies/breakout.yaml + - ${PREFIX}/data/enemies/bry.yaml + - ${PREFIX}/data/enemies/chip.yaml + - ${PREFIX}/data/enemies/code.yaml + - ${PREFIX}/data/enemies/congo.yaml + - ${PREFIX}/data/enemies/crosshair.yaml + - ${PREFIX}/data/enemies/demon.yaml + - ${PREFIX}/data/enemies/dimallas.yaml + - ${PREFIX}/data/enemies/floppy.yaml + - ${PREFIX}/data/enemies/dong.yaml + - ${PREFIX}/data/enemies/guitar.yaml + - ${PREFIX}/data/enemies/heavy.yaml + - ${PREFIX}/data/enemies/jailer1.yaml + - ${PREFIX}/data/enemies/jailer2.yaml + - ${PREFIX}/data/enemies/jailer3.yaml + - ${PREFIX}/data/enemies/jailbattle_alien.yaml + - ${PREFIX}/data/enemies/jailbattle_human.yaml + - ${PREFIX}/data/enemies/jeannine.yaml + - ${PREFIX}/data/enemies/lamp.yaml + - ${PREFIX}/data/enemies/lord_abad.yaml + - ${PREFIX}/data/enemies/matatunos.yaml + - ${PREFIX}/data/enemies/mummy.yaml + - ${PREFIX}/data/enemies/paco.yaml + - ${PREFIX}/data/enemies/elsa.yaml + - ${PREFIX}/data/enemies/qvoid.yaml + - ${PREFIX}/data/enemies/robot.yaml + - ${PREFIX}/data/enemies/sam.yaml + - ${PREFIX}/data/enemies/shock.yaml + - ${PREFIX}/data/enemies/sigmasua.yaml + - ${PREFIX}/data/enemies/spark.yaml + - ${PREFIX}/data/enemies/special/aerojailer.yaml + - ${PREFIX}/data/enemies/special/arounder.yaml + - ${PREFIX}/data/enemies/special/pepe_rosita_job.yaml + - ${PREFIX}/data/enemies/special/shooting_star.yaml + - ${PREFIX}/data/enemies/spider.yaml + - ${PREFIX}/data/enemies/tree_thing.yaml + - ${PREFIX}/data/enemies/tuno.yaml + - ${PREFIX}/data/enemies/tv_panel.yaml + - ${PREFIX}/data/enemies/tv.yaml + - ${PREFIX}/data/enemies/upv_student.yaml + - ${PREFIX}/data/enemies/wave.yaml + - ${PREFIX}/data/enemies/z80.yaml + BITMAP: + - ${PREFIX}/data/enemies/abad_bell.gif + - ${PREFIX}/data/enemies/abad.gif + - ${PREFIX}/data/enemies/amstrad_cs.gif + - ${PREFIX}/data/enemies/flying_arounder.gif + - ${PREFIX}/data/enemies/stopped_arounder.gif + - ${PREFIX}/data/enemies/walking_arounder.gif + - ${PREFIX}/data/enemies/arounders_door.gif + - ${PREFIX}/data/enemies/arounders_machine.gif + - ${PREFIX}/data/enemies/bat.gif + - ${PREFIX}/data/enemies/batman_bell.gif + - ${PREFIX}/data/enemies/batman_fire.gif + - ${PREFIX}/data/enemies/batman.gif + - ${PREFIX}/data/enemies/bell.gif + - ${PREFIX}/data/enemies/bin.gif + - ${PREFIX}/data/enemies/bird.gif + - ${PREFIX}/data/enemies/breakout.gif + - ${PREFIX}/data/enemies/bry.gif + - ${PREFIX}/data/enemies/chip.gif + - ${PREFIX}/data/enemies/code.gif + - ${PREFIX}/data/enemies/congo.gif + - ${PREFIX}/data/enemies/crosshair.gif + - ${PREFIX}/data/enemies/demon.gif + - ${PREFIX}/data/enemies/dimallas.gif + - ${PREFIX}/data/enemies/floppy.gif + - ${PREFIX}/data/enemies/dong.gif + - ${PREFIX}/data/enemies/guitar.gif + - ${PREFIX}/data/enemies/heavy.gif + - ${PREFIX}/data/enemies/jailer1.gif + - ${PREFIX}/data/enemies/jailer2.gif + - ${PREFIX}/data/enemies/jailer3.gif + - ${PREFIX}/data/enemies/jailbattle_alien.gif + - ${PREFIX}/data/enemies/jailbattle_human.gif + - ${PREFIX}/data/enemies/jeannine.gif + - ${PREFIX}/data/enemies/lamp.gif + - ${PREFIX}/data/enemies/lord_abad.gif + - ${PREFIX}/data/enemies/matatunos.gif + - ${PREFIX}/data/enemies/mummy.gif + - ${PREFIX}/data/enemies/paco.gif + - ${PREFIX}/data/enemies/elsa.gif + - ${PREFIX}/data/enemies/qvoid.gif + - ${PREFIX}/data/enemies/robot.gif + - ${PREFIX}/data/enemies/sam.gif + - ${PREFIX}/data/enemies/shock.gif + - ${PREFIX}/data/enemies/sigmasua.gif + - ${PREFIX}/data/enemies/spark.gif + - ${PREFIX}/data/enemies/special/aerojailer.gif + - ${PREFIX}/data/enemies/special/arounder.gif + - ${PREFIX}/data/enemies/special/pepe_rosita_job.gif + - ${PREFIX}/data/enemies/special/shooting_star.gif + - ${PREFIX}/data/enemies/spider.gif + - ${PREFIX}/data/enemies/tree_thing.gif + - ${PREFIX}/data/enemies/tuno.gif + - ${PREFIX}/data/enemies/tv_panel.gif + - ${PREFIX}/data/enemies/tv.gif + - ${PREFIX}/data/enemies/upv_student.gif + - ${PREFIX}/data/enemies/wave.gif + - ${PREFIX}/data/enemies/z80.gif # PLAYER player: - - type: BITMAP - path: ${PREFIX}/data/player/player.gif - - type: ANIMATION - path: ${PREFIX}/data/player/player.yaml - - type: BITMAP - path: ${PREFIX}/data/player/player2.gif - - type: ANIMATION - path: ${PREFIX}/data/player/player2.yaml - - type: BITMAP - path: ${PREFIX}/data/player/player_game_over.gif - - type: ANIMATION - path: ${PREFIX}/data/player/player_game_over.yaml + BITMAP: + - ${PREFIX}/data/player/player.gif + - ${PREFIX}/data/player/player2.gif + - ${PREFIX}/data/player/player_game_over.gif + ANIMATION: + - ${PREFIX}/data/player/player.yaml + - ${PREFIX}/data/player/player2.yaml + - ${PREFIX}/data/player/player_game_over.yaml # ITEMS items: - - type: BITMAP - path: ${PREFIX}/data/items/items.gif + BITMAP: + - ${PREFIX}/data/items/items.gif # MUSIC music: - - type: MUSIC - path: ${PREFIX}/data/music/title.ogg - - type: MUSIC - path: ${PREFIX}/data/music/game.ogg - - type: MUSIC - path: ${PREFIX}/data/music/loading_data1.ogg - - type: MUSIC - path: ${PREFIX}/data/music/loading_data2.ogg - - type: MUSIC - path: ${PREFIX}/data/music/loading_header.ogg - - type: MUSIC - path: ${PREFIX}/data/music/loading_screen_color.ogg - - type: MUSIC - path: ${PREFIX}/data/music/loading_screen_data.ogg - - type: MUSIC - path: ${PREFIX}/data/music/ending1.ogg - - type: MUSIC - path: ${PREFIX}/data/music/ending2.ogg - - type: MUSIC - path: ${PREFIX}/data/music/game_over.ogg + MUSIC: + - ${PREFIX}/data/music/title.ogg + - ${PREFIX}/data/music/game.ogg + - ${PREFIX}/data/music/loading_data1.ogg + - ${PREFIX}/data/music/loading_data2.ogg + - ${PREFIX}/data/music/loading_header.ogg + - ${PREFIX}/data/music/loading_screen_color.ogg + - ${PREFIX}/data/music/loading_screen_data.ogg + - ${PREFIX}/data/music/ending1.ogg + - ${PREFIX}/data/music/ending2.ogg + - ${PREFIX}/data/music/game_over.ogg # SOUNDS sounds: - - type: SOUND - path: ${PREFIX}/data/sound/item.wav - - type: SOUND - path: ${PREFIX}/data/sound/death.wav - - type: SOUND - path: ${PREFIX}/data/sound/notify.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump1.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump2.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump3.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump4.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump5.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump6.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump7.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump8.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump9.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump10.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump11.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump12.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump13.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump14.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump15.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump16.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump17.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump18.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump19.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump20.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump21.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump22.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump23.wav - - type: SOUND - path: ${PREFIX}/data/sound/jump24.wav + SOUND: + - ${PREFIX}/data/sound/item.wav + - ${PREFIX}/data/sound/death.wav + - ${PREFIX}/data/sound/notify.wav + - ${PREFIX}/data/sound/jump1.wav + - ${PREFIX}/data/sound/jump2.wav + - ${PREFIX}/data/sound/jump3.wav + - ${PREFIX}/data/sound/jump4.wav + - ${PREFIX}/data/sound/jump5.wav + - ${PREFIX}/data/sound/jump6.wav + - ${PREFIX}/data/sound/jump7.wav + - ${PREFIX}/data/sound/jump8.wav + - ${PREFIX}/data/sound/jump9.wav + - ${PREFIX}/data/sound/jump10.wav + - ${PREFIX}/data/sound/jump11.wav + - ${PREFIX}/data/sound/jump12.wav + - ${PREFIX}/data/sound/jump13.wav + - ${PREFIX}/data/sound/jump14.wav + - ${PREFIX}/data/sound/jump15.wav + - ${PREFIX}/data/sound/jump16.wav + - ${PREFIX}/data/sound/jump17.wav + - ${PREFIX}/data/sound/jump18.wav + - ${PREFIX}/data/sound/jump19.wav + - ${PREFIX}/data/sound/jump20.wav + - ${PREFIX}/data/sound/jump21.wav + - ${PREFIX}/data/sound/jump22.wav + - ${PREFIX}/data/sound/jump23.wav + - ${PREFIX}/data/sound/jump24.wav # LOGO logo: - - type: BITMAP - path: ${PREFIX}/data/logo/jailgames.gif - - type: BITMAP - path: ${PREFIX}/data/logo/since_1998.gif + BITMAP: + - ${PREFIX}/data/logo/jailgames.gif + - ${PREFIX}/data/logo/since_1998.gif # LOADING loading: - - type: BITMAP - path: ${PREFIX}/data/loading/loading_screen_bn.gif - - type: BITMAP - path: ${PREFIX}/data/loading/loading_screen_color.gif - - type: BITMAP - path: ${PREFIX}/data/loading/program_jaildoc.gif + BITMAP: + - ${PREFIX}/data/loading/loading_screen_bn.gif + - ${PREFIX}/data/loading/loading_screen_color.gif + - ${PREFIX}/data/loading/program_jaildoc.gif # TITLE title: - - type: BITMAP - path: ${PREFIX}/data/title/title_logo.gif + BITMAP: + - ${PREFIX}/data/title/title_logo.gif # ENDING ending: - - type: BITMAP - path: ${PREFIX}/data/ending/ending1.gif - - type: BITMAP - path: ${PREFIX}/data/ending/ending2.gif - - type: BITMAP - path: ${PREFIX}/data/ending/ending3.gif - - type: BITMAP - path: ${PREFIX}/data/ending/ending4.gif - - type: BITMAP - path: ${PREFIX}/data/ending/ending5.gif + BITMAP: + - ${PREFIX}/data/ending/ending1.gif + - ${PREFIX}/data/ending/ending2.gif + - ${PREFIX}/data/ending/ending3.gif + - ${PREFIX}/data/ending/ending4.gif + - ${PREFIX}/data/ending/ending5.gif # CREDITS credits: - - type: BITMAP - path: ${PREFIX}/data/credits/shine.gif - - type: ANIMATION - path: ${PREFIX}/data/credits/shine.yaml + BITMAP: + - ${PREFIX}/data/credits/shine.gif + ANIMATION: + - ${PREFIX}/data/credits/shine.yaml diff --git a/source/core/resources/resource_list.cpp b/source/core/resources/resource_list.cpp index 708ee48..56e6de4 100644 --- a/source/core/resources/resource_list.cpp +++ b/source/core/resources/resource_list.cpp @@ -51,8 +51,97 @@ namespace Resource { addToMap(file_path, type, required, absolute); } + // Añade un asset al mapa y lo persiste en assets.yaml + void List::addAsset(const std::string& path, Type type) { + // Añadir al mapa en memoria + addToMap(path, type, true, true); + + // Persistir en assets.yaml + if (config_file_path_.empty()) { return; } + + std::ifstream in(config_file_path_); + if (!in.is_open()) { return; } + std::string content((std::istreambuf_iterator(in)), std::istreambuf_iterator()); + in.close(); + + // Construir la ruta con variable ${PREFIX} (invertir la sustitución) + std::string var_path = path; + if (!prefix_.empty() && !executable_path_.empty()) { + std::string full_prefix = executable_path_ + prefix_; + auto pos = var_path.find(full_prefix); + if (pos != std::string::npos) { + var_path.replace(pos, full_prefix.length(), "${PREFIX}"); + } + } + + // Buscar la última entrada con el mismo prefijo de ruta e insertar después + std::string entry = " - " + var_path + "\n"; + auto last_pos = content.rfind(var_path.substr(0, var_path.rfind('/'))); + if (last_pos != std::string::npos) { + auto end_of_line = content.find('\n', last_pos); + if (end_of_line != std::string::npos) { + content.insert(end_of_line + 1, entry); + } + } + + std::ofstream out(config_file_path_); + if (out.is_open()) { + out << content; + out.close(); + } + } + + // Quita un asset del mapa y lo elimina de assets.yaml + void List::removeAsset(const std::string& filename) { + // Obtener la ruta antes de borrar del mapa + auto it = file_list_.find(filename); + std::string file_path; + if (it != file_list_.end()) { + file_path = it->second.file; + file_list_.erase(it); + } + + // Persistir en assets.yaml + if (config_file_path_.empty() || file_path.empty()) { return; } + + std::ifstream in(config_file_path_); + if (!in.is_open()) { return; } + std::string content((std::istreambuf_iterator(in)), std::istreambuf_iterator()); + in.close(); + + // Construir la ruta con variable ${PREFIX} + std::string var_path = file_path; + if (!prefix_.empty() && !executable_path_.empty()) { + std::string full_prefix = executable_path_ + prefix_; + auto pos = var_path.find(full_prefix); + if (pos != std::string::npos) { + var_path.replace(pos, full_prefix.length(), "${PREFIX}"); + } + } + + // Buscar la línea con el path y eliminarla + auto pos = content.find(var_path); + if (pos != std::string::npos) { + auto line_start = content.rfind('\n', pos); + line_start = (line_start == std::string::npos) ? 0 : line_start; + auto line_end = content.find('\n', pos); + if (line_end != std::string::npos) { + content.erase(line_start, line_end - line_start); + } + } + + std::ofstream out(config_file_path_); + if (out.is_open()) { + out << content; + out.close(); + } + } + // Carga recursos desde un archivo de configuración con soporte para variables void List::loadFromFile(const std::string& config_file_path, const std::string& prefix, const std::string& system_folder) { // NOLINT(readability-convert-member-functions-to-static) + config_file_path_ = config_file_path; + prefix_ = prefix; + std::ifstream file(config_file_path); if (!file.is_open()) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, @@ -89,56 +178,87 @@ namespace Resource { const std::string& category = it.key().get_value(); const auto& category_assets = it.value(); - // Verificar que es un array - if (!category_assets.is_sequence()) { - SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, - "Warning: Category '%s' is not a sequence, skipping", - category.c_str()); - continue; - } + if (category_assets.is_mapping()) { + // Nuevo formato: categoría → { TIPO: [paths...], TIPO2: [paths...] } + for (auto type_it = category_assets.begin(); type_it != category_assets.end(); ++type_it) { + try { + auto type_str = type_it.key().get_value(); + Type type = parseAssetType(type_str); + const auto& items = type_it.value(); - // Procesar cada asset en la categoría - for (const auto& asset : category_assets) { - try { - // Verificar campos obligatorios - if (!asset.contains("type") || !asset.contains("path")) { - SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, - "Warning: Asset in category '%s' missing 'type' or 'path', skipping", - category.c_str()); - continue; + if (!items.is_sequence()) { + SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, + "Warning: Type '%s' in category '%s' is not a sequence, skipping", + type_str.c_str(), category.c_str()); + continue; + } + + for (const auto& item : items) { + try { + if (item.is_string()) { + // Formato simple: solo el path + auto path = replaceVariables(item.get_value(), prefix, system_folder); + addToMap(path, type, true, false); + } else if (item.is_mapping() && item.contains("path")) { + // Formato expandido: { path, required?, absolute? } + auto path = replaceVariables(item["path"].get_value(), prefix, system_folder); + bool required = !item.contains("required") || item["required"].get_value(); + bool absolute = item.contains("absolute") && item["absolute"].get_value(); + addToMap(path, type, required, absolute); + } else { + SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, + "Warning: Invalid item in type '%s', category '%s', skipping", + type_str.c_str(), category.c_str()); + } + } catch (const std::exception& e) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "Error parsing asset in category '%s', type '%s': %s", + category.c_str(), type_str.c_str(), e.what()); + } + } + } catch (const std::exception& e) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "Error parsing type in category '%s': %s", + category.c_str(), e.what()); } - - // Extraer campos - auto type_str = asset["type"].get_value(); - auto path = asset["path"].get_value(); - - // Valores por defecto - bool required = true; - bool absolute = false; - - // Campos opcionales - if (asset.contains("required")) { - required = asset["required"].get_value(); - } - if (asset.contains("absolute")) { - absolute = asset["absolute"].get_value(); - } - - // Reemplazar variables en la ruta - path = replaceVariables(path, prefix, system_folder); - - // Parsear el tipo de asset - Type type = parseAssetType(type_str); - - // Añadir al mapa - addToMap(path, type, required, absolute); - - } catch (const std::exception& e) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, - "Error parsing asset in category '%s': %s", - category.c_str(), - e.what()); } + } else if (category_assets.is_sequence()) { + // Formato antiguo (retrocompatibilidad): categoría → [{type, path}, ...] + for (const auto& asset : category_assets) { + try { + if (!asset.contains("type") || !asset.contains("path")) { + SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, + "Warning: Asset in category '%s' missing 'type' or 'path', skipping", + category.c_str()); + continue; + } + + auto type_str = asset["type"].get_value(); + auto path = asset["path"].get_value(); + bool required = true; + bool absolute = false; + + if (asset.contains("required")) { + required = asset["required"].get_value(); + } + if (asset.contains("absolute")) { + absolute = asset["absolute"].get_value(); + } + + path = replaceVariables(path, prefix, system_folder); + Type type = parseAssetType(type_str); + addToMap(path, type, required, absolute); + + } catch (const std::exception& e) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "Error parsing asset in category '%s': %s", + category.c_str(), e.what()); + } + } + } else { + SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, + "Warning: Category '%s' has invalid format, skipping", + category.c_str()); } } diff --git a/source/core/resources/resource_list.hpp b/source/core/resources/resource_list.hpp index 5790fcc..b293b28 100644 --- a/source/core/resources/resource_list.hpp +++ b/source/core/resources/resource_list.hpp @@ -33,6 +33,8 @@ namespace Resource { // --- Métodos para la gestión de recursos --- void add(const std::string& file_path, Type type, bool required = true, bool absolute = false); + void addAsset(const std::string& path, Type type); // Añade al mapa y persiste en assets.yaml + void removeAsset(const std::string& filename); // Quita del mapa y persiste en assets.yaml void loadFromFile(const std::string& config_file_path, const std::string& prefix = "", const std::string& system_folder = ""); // Con soporte para variables void loadFromString(const std::string& config_content, const std::string& prefix = "", const std::string& system_folder = ""); // Para cargar desde pack (release) [[nodiscard]] auto get(const std::string& filename) const -> std::string; // Obtiene la ruta completa @@ -56,6 +58,8 @@ namespace Resource { // --- Variables internas --- std::unordered_map file_list_; // Mapa para búsqueda O(1) std::string executable_path_; // Ruta del ejecutable + std::string config_file_path_; // Ruta del fichero assets.yaml + std::string prefix_; // Prefijo para rutas (${PREFIX}) // --- Métodos internos --- [[nodiscard]] static auto getTypeName(Type type) -> std::string; // Obtiene el nombre del tipo diff --git a/source/game/editor/map_editor.cpp b/source/game/editor/map_editor.cpp index 25d9288..451dca1 100644 --- a/source/game/editor/map_editor.cpp +++ b/source/game/editor/map_editor.cpp @@ -1266,74 +1266,6 @@ auto MapEditor::setRoomProperty(const std::string& property, const std::string& return "Unknown property: " + property + " (use: bgcolor, border, itemcolor1, itemcolor2, conveyor, tileset, up, down, left, right)"; } -// Obtiene la ruta de assets.yaml derivada de la ruta de una room -auto MapEditor::getAssetsYamlPath() -> std::string { - std::string ref_path = Resource::List::get()->get(room_path_); - if (ref_path.empty()) { return ""; } - // ref_path es algo como .../data/room/03.yaml → queremos .../config/assets.yaml - auto pos = ref_path.find("/data/room/"); - if (pos == std::string::npos) { return ""; } - return ref_path.substr(0, pos) + "/config/assets.yaml"; -} - -// Añade una room a assets.yaml (bajo la sección rooms:) -void MapEditor::addRoomToAssetsYaml(const std::string& room_name) { - std::string assets_path = getAssetsYamlPath(); - if (assets_path.empty()) { return; } - - // Leer el fichero - std::ifstream in(assets_path); - if (!in.is_open()) { return; } - std::string content((std::istreambuf_iterator(in)), std::istreambuf_iterator()); - in.close(); - - // Buscar la última entrada de room y añadir después - std::string entry = " - type: ROOM\n path: ${PREFIX}/data/room/" + room_name + "\n"; - auto last_room = content.rfind("path: ${PREFIX}/data/room/"); - if (last_room != std::string::npos) { - auto end_of_line = content.find('\n', last_room); - if (end_of_line != std::string::npos) { - content.insert(end_of_line + 1, entry); - } - } - - std::ofstream out(assets_path); - if (out.is_open()) { - out << content; - out.close(); - } -} - -// Quita una room de assets.yaml -void MapEditor::removeRoomFromAssetsYaml(const std::string& room_name) { - std::string assets_path = getAssetsYamlPath(); - if (assets_path.empty()) { return; } - - std::ifstream in(assets_path); - if (!in.is_open()) { return; } - std::string content((std::istreambuf_iterator(in)), std::istreambuf_iterator()); - in.close(); - - // Buscar "path: ${PREFIX}/data/room/XX.yaml" y eliminar esa entry (2 líneas: type + path) - std::string search = "path: ${PREFIX}/data/room/" + room_name; - auto pos = content.find(search); - if (pos != std::string::npos) { - // Retroceder hasta " - type: ROOM\n" - auto line_start = content.rfind(" - type: ROOM", pos); - // Avanzar hasta el fin de la línea del path - auto line_end = content.find('\n', pos); - if (line_start != std::string::npos && line_end != std::string::npos) { - content.erase(line_start, line_end - line_start + 1); - } - } - - std::ofstream out(assets_path); - if (out.is_open()) { - out << content; - out.close(); - } -} - // Crea una nueva habitación auto MapEditor::createNewRoom(const std::string& direction) -> std::string { if (!active_) { return "Editor not active"; } @@ -1444,11 +1376,10 @@ auto MapEditor::createNewRoom(const std::string& direction) -> std::string { } file.close(); - // Registrar en Resource::List, cache y assets.yaml - Resource::List::get()->add(new_path, Resource::List::Type::ROOM, true, true); + // Registrar en Resource::List (mapa + assets.yaml) y cache + Resource::List::get()->addAsset(new_path, Resource::List::Type::ROOM); Resource::Cache::get()->getRooms().emplace_back( RoomResource{.name = new_name, .room = std::make_shared(new_room)}); - addRoomToAssetsYaml(new_name); // Conectar la room actual con la nueva (recíproco: ya hecho arriba para la nueva) if (direction == "UP") { @@ -1546,8 +1477,8 @@ auto MapEditor::deleteRoom() -> std::string { std::remove_if(cache_rooms.begin(), cache_rooms.end(), [&](const RoomResource& r) { return r.name == deleted_name; }), cache_rooms.end()); - // Quitar de assets.yaml - removeRoomFromAssetsYaml(deleted_name); + // Quitar de Resource::List (mapa + assets.yaml) + Resource::List::get()->removeAsset(deleted_name); // Re-entrar al editor en la room destino if (GameControl::enter_editor) { GameControl::enter_editor(); } diff --git a/source/game/editor/map_editor.hpp b/source/game/editor/map_editor.hpp index a9a0df5..fe22dd5 100644 --- a/source/game/editor/map_editor.hpp +++ b/source/game/editor/map_editor.hpp @@ -109,9 +109,6 @@ class MapEditor { void handleMouseUp(); void updateDrag(); void autosave(); - auto getAssetsYamlPath() -> std::string; - void addRoomToAssetsYaml(const std::string& room_name); - void removeRoomFromAssetsYaml(const std::string& room_name); void updateStatusBarInfo(); static auto snapToGrid(float value) -> float; static auto pointInRect(float px, float py, const SDL_FRect& rect) -> bool;