Asset: passat a unordered_map i carrega desde fitxer

This commit is contained in:
2025-08-09 14:30:59 +02:00
parent c7f5fed797
commit 5a02518de3
6 changed files with 489 additions and 428 deletions

View File

@@ -82,7 +82,7 @@ Director::~Director() {
void Director::init() {
// Configuración inicial de parametros
Asset::init(executable_path_); // Inicializa el sistema de gestión de archivos
setFileList(); // Crea el índice de archivos
loadAssets(); // Crea el índice de archivos
Input::init(
Asset::get()->get("gamecontrollerdb.txt"),
@@ -152,295 +152,19 @@ void Director::loadScoreFile() {
#endif
}
// Asigna los botones y teclas al objeto Input
void Director::bindInputs() {
/*static auto input = Input::get();
// Teclado - Movimiento del jugador
input->bindKey(Input::Action::UP, SDL_SCANCODE_UP);
input->bindKey(Input::Action::DOWN, SDL_SCANCODE_DOWN);
input->bindKey(Input::Action::LEFT, SDL_SCANCODE_LEFT);
input->bindKey(Input::Action::RIGHT, SDL_SCANCODE_RIGHT);
// Teclado - Disparo del jugador
input->bindKey(Input::Action::FIRE_LEFT, SDL_SCANCODE_Q);
input->bindKey(Input::Action::FIRE_CENTER, SDL_SCANCODE_W);
input->bindKey(Input::Action::FIRE_RIGHT, SDL_SCANCODE_E);
// Teclado - Interfaz
input->bindKey(Input::Action::START, SDL_SCANCODE_RETURN);
// Teclado - Menu de servicio
input->bindKey(Input::Action::SERVICE, SDL_SCANCODE_0);
input->bindKey(Input::Action::SM_SELECT, SDL_SCANCODE_RETURN);
input->bindKey(Input::Action::SM_BACK, SDL_SCANCODE_BACKSPACE);
// Teclado - Control del programa
input->bindKey(Input::Action::EXIT, SDL_SCANCODE_ESCAPE);
input->bindKey(Input::Action::PAUSE, SDL_SCANCODE_P);
input->bindKey(Input::Action::BACK, SDL_SCANCODE_BACKSPACE);
input->bindKey(Input::Action::WINDOW_DEC_SIZE, SDL_SCANCODE_F1);
input->bindKey(Input::Action::WINDOW_INC_SIZE, SDL_SCANCODE_F2);
input->bindKey(Input::Action::WINDOW_FULLSCREEN, SDL_SCANCODE_F3);
input->bindKey(Input::Action::TOGGLE_VIDEO_SHADERS, SDL_SCANCODE_F4);
input->bindKey(Input::Action::TOGGLE_VIDEO_INTEGER_SCALE, SDL_SCANCODE_F5);
input->bindKey(Input::Action::TOGGLE_VIDEO_VSYNC, SDL_SCANCODE_F6);
input->bindKey(Input::Action::TOGGLE_AUDIO, SDL_SCANCODE_F7);
input->bindKey(Input::Action::TOGGLE_AUTO_FIRE, SDL_SCANCODE_F8);
input->bindKey(Input::Action::CHANGE_LANG, SDL_SCANCODE_F9);
input->bindKey(Input::Action::RESET, SDL_SCANCODE_F10);
input->bindKey(Input::Action::SHOW_INFO, SDL_SCANCODE_F12);
// Asigna botones a inputs
auto gamepads = input->getGamepads();
for (auto &gamepad : gamepads) {
// Mando - Movimiento del jugador
input->bindGameControllerButton(gamepad, Input::Action::UP, SDL_GAMEPAD_BUTTON_DPAD_UP);
input->bindGameControllerButton(gamepad, Input::Action::DOWN, SDL_GAMEPAD_BUTTON_DPAD_DOWN);
input->bindGameControllerButton(gamepad, Input::Action::LEFT, SDL_GAMEPAD_BUTTON_DPAD_LEFT);
input->bindGameControllerButton(gamepad, Input::Action::RIGHT, SDL_GAMEPAD_BUTTON_DPAD_RIGHT);
// Mando - Disparo del jugador
input->bindGameControllerButton(gamepad, Input::Action::FIRE_LEFT, SDL_GAMEPAD_BUTTON_WEST);
input->bindGameControllerButton(gamepad, Input::Action::FIRE_CENTER, SDL_GAMEPAD_BUTTON_NORTH);
input->bindGameControllerButton(gamepad, Input::Action::FIRE_RIGHT, SDL_GAMEPAD_BUTTON_EAST);
// Mando - Interfaz
input->bindGameControllerButton(gamepad, Input::Action::START, SDL_GAMEPAD_BUTTON_START);
input->bindGameControllerButton(gamepad, Input::Action::SERVICE, SDL_GAMEPAD_BUTTON_BACK);
}
// Mapea las asignaciones a los botones desde el archivo de configuración, si se da el caso
const size_t MAX_CONTROLLERS = std::min(2, NUM_GAMEPADS);
for (size_t i = 0; i < MAX_CONTROLLERS; ++i) {
for (auto &controller : Options::controllers) {
if (input->getControllerName(i) == controller.name) {
for (size_t j = 0; j < controller.inputs.size(); ++j) {
input->bindGameControllerButton(i, controller.inputs.at(j), controller.buttons.at(j));
}
}
}
}
// Asigna botones a inputs desde otros inputs
for (auto &gamepad : gamepads) {
// Mando - Menu de servicio
input->bindGameControllerButton(gamepad, Input::Action::SM_SELECT, Input::Action::FIRE_LEFT);
input->bindGameControllerButton(gamepad, Input::Action::SM_BACK, Input::Action::FIRE_CENTER);
}
// Guarda las asignaciones de botones en las opciones de los dos primeros mandos
for (size_t i = 0; i < MAX_CONTROLLERS; ++i) {
// Variables asociadas al mando
Options::controllers.at(i).index = i;
Options::controllers.at(i).name = input->getControllerName(i);
Options::controllers.at(i).plugged = true;
// Asignaciones de botones
for (size_t j = 0; j < Options::controllers.at(i).inputs.size(); ++j) {
Options::controllers.at(i).buttons.at(j) = input->getControllerBinding(i, Options::controllers.at(i).inputs.at(j));
}
}
// Asegura que algún jugador tenga el teclado asignado
if (Options::getPlayerWhoUsesKeyboard() == 0) {
Options::setKeyboardToPlayer(1);
}*/
}
// Crea el indice de ficheros
void Director::setFileList() {
// Carga el indice de ficheros desde un fichero
void Director::loadAssets() {
#ifdef MACOS_BUNDLE
const std::string prefix = "/../Resources";
#else
const std::string PREFIX;
const std::string prefix = "";
#endif
// Ficheros de configuración
Asset::get()->add(system_folder_ + "/config.txt", AssetType::DATA, false, true);
Asset::get()->add(system_folder_ + "/controllers.json", AssetType::DATA, false, true);
Asset::get()->add(system_folder_ + "/score.bin", AssetType::DATA, false, true);
Asset::get()->add(PREFIX + "/data/config/param_320x240.txt", AssetType::DATA);
Asset::get()->add(PREFIX + "/data/config/param_320x256.txt", AssetType::DATA);
Asset::get()->add(PREFIX + "/data/config/demo1.bin", AssetType::DEMODATA);
Asset::get()->add(PREFIX + "/data/config/demo2.bin", AssetType::DEMODATA);
Asset::get()->add(PREFIX + "/data/config/gamecontrollerdb.txt", AssetType::DATA);
Asset::get()->add(PREFIX + "/data/config/formations.txt", AssetType::DATA);
Asset::get()->add(PREFIX + "/data/config/pools.txt", AssetType::DATA);
// Musicas
Asset::get()->add(PREFIX + "/data/music/intro.ogg", AssetType::MUSIC);
Asset::get()->add(PREFIX + "/data/music/playing.ogg", AssetType::MUSIC);
Asset::get()->add(PREFIX + "/data/music/title.ogg", AssetType::MUSIC);
Asset::get()->add(PREFIX + "/data/music/credits.ogg", AssetType::MUSIC);
// Sonidos
Asset::get()->add(PREFIX + "/data/sound/balloon_pop0.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/balloon_pop1.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/balloon_pop2.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/balloon_pop3.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/balloon_bounce0.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/balloon_bounce1.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/balloon_bounce2.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/balloon_bounce3.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/bullet.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/clock.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/coffee_out.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/continue_clock.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/debian_drop.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/debian_pickup.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/hi_score_achieved.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/item_drop.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/item_pickup.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/jump.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/logo.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/notify.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/player_collision.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/power_ball_explosion.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/service_menu_adjust.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/service_menu_move.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/service_menu_select.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/stage_change.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/tabe_hit.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/tabe.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/title.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/voice_aw_aw_aw.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/voice_coffee.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/voice_get_ready.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/voice_no.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/voice_power_up.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/voice_thankyou.wav", AssetType::SOUND);
Asset::get()->add(PREFIX + "/data/sound/walk.wav", AssetType::SOUND);
// Shaders
Asset::get()->add(PREFIX + "/data/shaders/crtpi_256.glsl", AssetType::DATA);
Asset::get()->add(PREFIX + "/data/shaders/crtpi_240.glsl", AssetType::DATA);
// Texturas - Balloons
Asset::get()->add(PREFIX + "/data/gfx/balloon/balloon0.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/balloon/balloon0.ani", AssetType::ANIMATION);
Asset::get()->add(PREFIX + "/data/gfx/balloon/balloon1.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/balloon/balloon1.ani", AssetType::ANIMATION);
Asset::get()->add(PREFIX + "/data/gfx/balloon/balloon2.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/balloon/balloon2.ani", AssetType::ANIMATION);
Asset::get()->add(PREFIX + "/data/gfx/balloon/balloon3.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/balloon/balloon3.ani", AssetType::ANIMATION);
// Texturas - Explosiones
Asset::get()->add(PREFIX + "/data/gfx/balloon/explosion0.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/balloon/explosion0.ani", AssetType::ANIMATION);
Asset::get()->add(PREFIX + "/data/gfx/balloon/explosion1.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/balloon/explosion1.ani", AssetType::ANIMATION);
Asset::get()->add(PREFIX + "/data/gfx/balloon/explosion2.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/balloon/explosion2.ani", AssetType::ANIMATION);
Asset::get()->add(PREFIX + "/data/gfx/balloon/explosion3.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/balloon/explosion3.ani", AssetType::ANIMATION);
// Texturas - Power Ball
Asset::get()->add(PREFIX + "/data/gfx/balloon/powerball.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/balloon/powerball.ani", AssetType::ANIMATION);
// Texturas - Bala
Asset::get()->add(PREFIX + "/data/gfx/bullet/bullet.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/bullet/bullet.ani", AssetType::ANIMATION);
// Texturas - Tabe
Asset::get()->add(PREFIX + "/data/gfx/tabe/tabe.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/tabe/tabe.ani", AssetType::ANIMATION);
// Texturas - Juego
Asset::get()->add(PREFIX + "/data/gfx/game/game_buildings.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/game/game_clouds1.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/game/game_clouds2.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/game/game_grass.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/game/game_power_meter.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/game/game_sky_colors.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/game/game_sun.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/game/game_moon.png", AssetType::BITMAP);
// Texturas - Intro
Asset::get()->add(PREFIX + "/data/gfx/intro/intro1.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/intro/intro2.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/intro/intro3.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/intro/intro4.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/intro/intro5.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/intro/intro6.png", AssetType::BITMAP);
// Texturas - Logo
Asset::get()->add(PREFIX + "/data/gfx/logo/logo_jailgames.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/logo/logo_jailgames_mini.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/logo/logo_since_1998.png", AssetType::BITMAP);
// Texturas - Items
Asset::get()->add(PREFIX + "/data/gfx/item/item_points1_disk.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/item/item_points1_disk.ani", AssetType::ANIMATION);
Asset::get()->add(PREFIX + "/data/gfx/item/item_points2_gavina.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/item/item_points2_gavina.ani", AssetType::ANIMATION);
Asset::get()->add(PREFIX + "/data/gfx/item/item_points3_pacmar.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/item/item_points3_pacmar.ani", AssetType::ANIMATION);
Asset::get()->add(PREFIX + "/data/gfx/item/item_clock.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/item/item_clock.ani", AssetType::ANIMATION);
Asset::get()->add(PREFIX + "/data/gfx/item/item_coffee.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/item/item_coffee.ani", AssetType::ANIMATION);
Asset::get()->add(PREFIX + "/data/gfx/item/item_debian.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/item/item_debian.ani", AssetType::ANIMATION);
Asset::get()->add(PREFIX + "/data/gfx/item/item_coffee_machine.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/item/item_coffee_machine.ani", AssetType::ANIMATION);
// Texturas - Titulo
Asset::get()->add(PREFIX + "/data/gfx/title/title_bg_tile.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/title/title_coffee.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/title/title_crisis.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/title/title_arcade_edition.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/title/title_dust.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/title/title_dust.ani", AssetType::ANIMATION);
// Texturas - Jugador 1
Asset::get()->add(PREFIX + "/data/gfx/player/player1.gif", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/player/player1_coffee1.pal", AssetType::PALETTE);
Asset::get()->add(PREFIX + "/data/gfx/player/player1_coffee2.pal", AssetType::PALETTE);
Asset::get()->add(PREFIX + "/data/gfx/player/player1_invencible.pal", AssetType::PALETTE);
Asset::get()->add(PREFIX + "/data/gfx/player/player1_power.png", AssetType::BITMAP);
// Texturas - Jugador 2
Asset::get()->add(PREFIX + "/data/gfx/player/player2.gif", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/gfx/player/player2_coffee1.pal", AssetType::PALETTE);
Asset::get()->add(PREFIX + "/data/gfx/player/player2_coffee2.pal", AssetType::PALETTE);
Asset::get()->add(PREFIX + "/data/gfx/player/player2_invencible.pal", AssetType::PALETTE);
Asset::get()->add(PREFIX + "/data/gfx/player/player2_power.png", AssetType::BITMAP);
// Animaciones del jugador
Asset::get()->add(PREFIX + "/data/gfx/player/player.ani", AssetType::ANIMATION);
Asset::get()->add(PREFIX + "/data/gfx/player/player_power.ani", AssetType::ANIMATION);
// Texturas - Golpe del jugador
Asset::get()->add(PREFIX + "/data/gfx/player/hit.png", AssetType::BITMAP);
// Fuentes de texto
Asset::get()->add(PREFIX + "/data/font/8bithud.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/font/8bithud.txt", AssetType::FONT);
Asset::get()->add(PREFIX + "/data/font/aseprite.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/font/aseprite.txt", AssetType::FONT);
Asset::get()->add(PREFIX + "/data/font/smb2.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/font/smb2_grad.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/font/smb2.txt", AssetType::FONT);
Asset::get()->add(PREFIX + "/data/font/04b_25.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/font/04b_25.txt", AssetType::FONT);
Asset::get()->add(PREFIX + "/data/font/04b_25_2x.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/font/04b_25_2x.txt", AssetType::FONT);
Asset::get()->add(PREFIX + "/data/font/04b_25_metal.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/font/04b_25_grey.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/font/04b_25_flat.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/font/04b_25_reversed.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/font/04b_25_flat_2x.png", AssetType::BITMAP);
Asset::get()->add(PREFIX + "/data/font/04b_25_reversed_2x.png", AssetType::BITMAP);
// Textos
Asset::get()->add(PREFIX + "/data/lang/es_ES.json", AssetType::LANG);
Asset::get()->add(PREFIX + "/data/lang/en_UK.json", AssetType::LANG);
Asset::get()->add(PREFIX + "/data/lang/ba_BA.json", AssetType::LANG);
// Cargar la configuración de assets (también aplicar el prefijo al archivo de configuración)
std::string config_path = executable_path_ + prefix + "/data/config/assets.txt";
Asset::get()->loadFromFile(config_path, prefix, system_folder_);
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Assets configuration loaded successfully");
// Si falta algun fichero, sale del programa
if (!Asset::get()->check()) {
@@ -598,11 +322,7 @@ void Director::reset() {
Lang::setLanguage(Options::settings.language);
Audio::get()->stopMusic();
Audio::get()->stopAllSounds();
{
Resource::get()->reload();
}
// Input::get()->discoverGameControllers();
bindInputs();
Resource::get()->reload();
ServiceMenu::get()->reset();
Section::name = Section::Name::LOGO;
}