diff --git a/data/enemies/bin.gif b/data/enemies/bin.gif index 50faf79..8d8221c 100644 Binary files a/data/enemies/bin.gif and b/data/enemies/bin.gif differ diff --git a/data/enemies/code.gif b/data/enemies/code.gif index 981fbcc..10f85b7 100644 Binary files a/data/enemies/code.gif and b/data/enemies/code.gif differ diff --git a/source/game/editor/map_editor.cpp b/source/game/editor/map_editor.cpp index 15e3646..f6c05d7 100644 --- a/source/game/editor/map_editor.cpp +++ b/source/game/editor/map_editor.cpp @@ -338,6 +338,7 @@ void MapEditor::update(float delta_time) { if (tile_index >= 0 && tile_index < static_cast(room_data_.collision_tile_map.size())) { if (room_data_.collision_tile_map[tile_index] != brush_tile_) { room_data_.collision_tile_map[tile_index] = brush_tile_; + room_->setCollisionTile(tile_index, brush_tile_); } } } else { @@ -551,6 +552,7 @@ void MapEditor::handleEvent(const SDL_Event& event) { // NOLINT(readability-fun if (editing_collision_) { if (tile_index >= 0 && tile_index < static_cast(room_data_.collision_tile_map.size())) { room_data_.collision_tile_map[tile_index] = brush_tile_; + room_->setCollisionTile(tile_index, brush_tile_); } } else { if (tile_index >= 0 && tile_index < static_cast(room_data_.tile_map.size())) { @@ -684,6 +686,7 @@ void MapEditor::handleMouseUp() { // NOLINT(readability-function-cognitive-comp if (IDX >= 0 && IDX < static_cast(room_data_.enemies.size())) { room_data_.enemies[IDX].x1 = SNAP_X; room_data_.enemies[IDX].y1 = SNAP_Y; + room_->getEnemyManager()->getEnemy(IDX)->resetToInitialPosition(room_data_.enemies[IDX]); selected_enemy_ = IDX; changed = true; } @@ -693,6 +696,7 @@ void MapEditor::handleMouseUp() { // NOLINT(readability-function-cognitive-comp if (IDX >= 0 && IDX < static_cast(room_data_.enemies.size())) { room_data_.enemies[IDX].x2 = SNAP_X; room_data_.enemies[IDX].y2 = SNAP_Y; + room_->getEnemyManager()->getEnemy(IDX)->resetToInitialPosition(room_data_.enemies[IDX]); selected_enemy_ = IDX; changed = true; } @@ -1229,6 +1233,7 @@ auto MapEditor::setRoomProperty(const std::string& property, const std::string& room_data_.conveyor_belt_direction = 0; val = "none"; } + room_->setConveyorBeltDirection(room_data_.conveyor_belt_direction); autosave(); return "conveyor: " + val; } @@ -1237,6 +1242,7 @@ auto MapEditor::setRoomProperty(const std::string& property, const std::string& std::string tileset = val; if (tileset.find('.') == std::string::npos) { tileset += ".gif"; } room_data_.tile_set_file = tileset; + room_->setTileSet(tileset); autosave(); return "tileset: " + tileset; } @@ -1301,6 +1307,19 @@ auto MapEditor::setRoomProperty(const std::string& property, const std::string& // Aplicar la nueva conexión if (our_field != nullptr) { *our_field = connection; } + // Sincronizar la conexión al Room vivo + Room::Border border = Room::Border::NONE; + if (property == "UP") { + border = Room::Border::TOP; + } else if (property == "DOWN") { + border = Room::Border::BOTTOM; + } else if (property == "LEFT") { + border = Room::Border::LEFT; + } else if (property == "RIGHT") { + border = Room::Border::RIGHT; + } + room_->setConnection(border, connection); + // Crear la conexión recíproca en la otra room if (connection != "0") { auto other = Resource::Cache::get()->getRoom(connection); diff --git a/source/game/entities/enemy.cpp b/source/game/entities/enemy.cpp index e7d36dc..6fc010e 100644 --- a/source/game/entities/enemy.cpp +++ b/source/game/entities/enemy.cpp @@ -56,6 +56,11 @@ void Enemy::resetToInitialPosition(const Data& data) { sprite_->setVelX(data.vx); sprite_->setVelY(data.vy); + x1_ = data.x1; + x2_ = data.x2; + y1_ = data.y1; + y2_ = data.y2; + applyFlipMirror(data.vx); collider_ = getRect(); diff --git a/source/game/gameplay/collision_map.hpp b/source/game/gameplay/collision_map.hpp index 40f4df5..09afec6 100644 --- a/source/game/gameplay/collision_map.hpp +++ b/source/game/gameplay/collision_map.hpp @@ -24,6 +24,15 @@ class CollisionMap { [[nodiscard]] auto getConveyorBeltDirection() const -> int { return conveyor_belt_direction_; } [[nodiscard]] auto getCollisionTileMap() const -> const std::vector& { return collision_tile_map_; } +#ifdef _DEBUG + void setCollisionTile(int index, int value) { + if (index >= 0 && index < static_cast(collision_tile_map_.size())) { + collision_tile_map_[index] = value; + } + } + void setConveyorBeltDirection(int direction) { conveyor_belt_direction_ = direction; } +#endif + private: std::vector collision_tile_map_; int conveyor_belt_direction_; diff --git a/source/game/gameplay/room.cpp b/source/game/gameplay/room.cpp index d3f150d..850429d 100644 --- a/source/game/gameplay/room.cpp +++ b/source/game/gameplay/room.cpp @@ -124,6 +124,51 @@ void Room::setItemColors(Uint8 color1, Uint8 color2) { item_mgr->getItem(i)->setColors(color1, color2); } } + +// Cambia un collision tile en vivo (para editor) +void Room::setCollisionTile(int index, int value) { + collision_map_->setCollisionTile(index, value); +} + +// Cambia una conexión de habitación en vivo (para editor) +void Room::setConnection(Border border, const std::string& room_name) { + switch (border) { + case Border::TOP: + upper_room_ = room_name; + break; + case Border::BOTTOM: + lower_room_ = room_name; + break; + case Border::LEFT: + left_room_ = room_name; + break; + case Border::RIGHT: + right_room_ = room_name; + break; + default: + break; + } +} + +// Cambia el tileset en vivo (para editor) +void Room::setTileSet(const std::string& tile_set_file) { + tile_set_file_ = tile_set_file; + surface_ = Resource::Cache::get()->getSurface(tile_set_file); + tile_set_width_ = surface_->getWidth() / TILE_SIZE; + tilemap_renderer_ = std::make_unique( + tile_map_, + tile_set_width_, + surface_, + bg_color_, + conveyor_belt_direction_); + tilemap_renderer_->initialize(collision_map_->getCollisionTileMap()); +} + +// Cambia la dirección del conveyor belt en vivo (para editor) +void Room::setConveyorBeltDirection(int direction) { + conveyor_belt_direction_ = direction; + collision_map_->setConveyorBeltDirection(direction); +} #endif // Actualiza las variables y objetos de la habitación diff --git a/source/game/gameplay/room.hpp b/source/game/gameplay/room.hpp index 60a0eff..68bd509 100644 --- a/source/game/gameplay/room.hpp +++ b/source/game/gameplay/room.hpp @@ -64,6 +64,10 @@ class Room { auto getItemManager() -> ItemManager* { return item_manager_.get(); } void setItemColors(Uint8 color1, Uint8 color2); void setTile(int index, int tile_value); + void setCollisionTile(int index, int value); + void setConnection(Border border, const std::string& room_name); + void setTileSet(const std::string& tile_set_file); + void setConveyorBeltDirection(int direction); [[nodiscard]] auto getTileSetFile() const -> const std::string& { return tile_set_file_; } [[nodiscard]] auto getTileSetWidth() const -> int { return tile_set_width_; } #endif