diff --git a/mario/blocks/simpleblocks.cpp b/mario/blocks/simpleblocks.cpp index 03564ee..cf5e106 100644 --- a/mario/blocks/simpleblocks.cpp +++ b/mario/blocks/simpleblocks.cpp @@ -468,5 +468,5 @@ MushroomModifierBlock::MushroomModifierBlock( TeleportModifierBlock::TeleportModifierBlock( int x, int y, std::shared_ptr &renderer) : MarioBlock(x, y, renderer, g_mod_texture, MOD_TELEPORT_SRC, false) { - setId(MUSHROOM_MODIFIER_ID); + setId(TELEPORT_MODIFIER_ID); } diff --git a/mario/maploader.cpp b/mario/maploader.cpp index f4316b9..4e4ed84 100644 --- a/mario/maploader.cpp +++ b/mario/maploader.cpp @@ -33,9 +33,22 @@ uint8_t read8Bits(std::ifstream &file) { file.read((char *)&data, sizeof(uint8_t) / sizeof(char)); return data; } +std::string readString(std::ifstream &file) { + std::string res = ""; + char tmp{}; + file.read(&tmp, 1); + while (tmp != '\0') { + res += tmp; + file.read(&tmp, 1); + } + return res; +} void write8Bits(std::ofstream &file, uint8_t data) { file.write((char *)&data, sizeof(uint8_t) / sizeof(char)); } +void writeString(std::ofstream &file, const std::string &text) { + file.write(text.c_str(), text.size() + 1); +} uint16_t read16Bits(std::ifstream &file) { uint16_t data; @@ -74,6 +87,7 @@ MapObject parseBlock(std::ifstream &map_file) { uint8_t character_id = 0; uint32_t modifier_id = 0; uint8_t modifier_data = 0; + std::string modifier_text = ""; uint16_t wide_terrain = read16Bits(map_file); auto terrain = separateWideTerrain(wide_terrain); uint16_t terrain_id = terrain.first; @@ -86,6 +100,9 @@ MapObject parseBlock(std::ifstream &map_file) { auto modifier = separateAdditionalData(additional_data); modifier_id = modifier.first | 0x6000; modifier_data = modifier.second; + if(modifier_id == TELEPORT_MODIFIER_ID) { + modifier_text = readString(map_file); + } } else { // character auto character = separateAdditionalData(additional_data); @@ -94,7 +111,7 @@ MapObject parseBlock(std::ifstream &map_file) { } } return MapObject(terrain_id, terrain_type, character_id, character_type, - modifier_id, modifier_data); + modifier_id, modifier_data, modifier_text); } void loadEmptyMap(std::vector &objects, size_t editor_width) { @@ -167,7 +184,7 @@ void loadMapV01(std::shared_ptr &scene, mushroom = true; } if (!editor && block.getModifierId() == TELEPORT_MODIFIER_ID) { - teleport_level = "test.marmap"; + teleport_level = block.getModifierText(); } // TODO add modifiers to createTerrainBlock if (block.getTerrainId() != 0) { @@ -270,6 +287,9 @@ void saveMap(const std::string &file, std::vector &objects) { } if (additional_data) { write8Bits(output_file, additional_data); + if(additional_data & ADDITIONAL_IS_MOD && additional_data & !block.getModifierText().empty()) { + writeString(output_file, block.getModifierText()); + } } } } diff --git a/mario/mapobject.cpp b/mario/mapobject.cpp index feaaf31..943a03e 100644 --- a/mario/mapobject.cpp +++ b/mario/mapobject.cpp @@ -2,20 +2,25 @@ MapObject::MapObject(uint16_t terrain_id, LandType::Value terrain_type, uint8_t character_id, LandType::Value character_type, - uint32_t modifier_id, uint8_t modifier_data) { + uint32_t modifier_id, uint8_t modifier_data, const std::string &modifier_text) { setTerrain(terrain_id, terrain_type); if (character_id != 0) setCharacter(character_id, character_type); - if (modifier_id != 0) - setModifier(modifier_id, modifier_data); + if (modifier_id != 0) { + if(!modifier_text.empty()) { + setModifier(modifier_id, modifier_text); + } else { + setModifier(modifier_id, modifier_data); + } + } } MapObject::MapObject(uint16_t terrain_id, uint8_t terrain_type, uint8_t character_id, uint8_t character_type, - uint32_t modifier_id, uint8_t modifier_data) + uint32_t modifier_id, uint8_t modifier_data, const std::string &modifier_text) : MapObject(terrain_id, static_cast(terrain_type), character_id, static_cast(character_type), - modifier_id, modifier_data) {} + modifier_id, modifier_data, modifier_text) {} void MapObject::setTerrain(uint16_t id, LandType::Value land_type) { terrain_id = id; @@ -48,6 +53,15 @@ void MapObject::setModifier(uint32_t id, uint8_t data) { } } +void MapObject::setModifier(uint32_t id, const std::string &text) { + setModifier(id, 0); + modifier_text = text; +} + +const std::string &MapObject::getModifierText() { + return modifier_text; +} + void MapObject::unsetTerrain() { setTerrain(0, 0); } diff --git a/mario/mapobject.hpp b/mario/mapobject.hpp index 0a39848..cf077e3 100644 --- a/mario/mapobject.hpp +++ b/mario/mapobject.hpp @@ -8,15 +8,16 @@ public: MapObject() = default; MapObject(uint16_t terrain_id, uint8_t terrain_type, uint8_t character_id, uint8_t character_type, uint32_t modifier_id, - uint8_t modifier_data); + uint8_t modifier_data, const std::string &modifier_text); MapObject(uint16_t terrain_id, LandType::Value terrain_type, uint8_t character_id, LandType::Value character_type, - uint32_t modifier_id, uint8_t modifier_data); + uint32_t modifier_id, uint8_t modifier_data, const std::string &modifier_text); void setTerrain(uint16_t id, LandType::Value land_type); void setTerrain(uint16_t id, uint8_t land_type); void setCharacter(uint8_t id, LandType::Value land_type); void setCharacter(uint8_t id, uint8_t land_type); void setModifier(uint32_t id, uint8_t data); + void setModifier(uint32_t id, const std::string &text); void unsetTerrain(); void unsetModifier(); void unsetCharacter(); @@ -29,6 +30,7 @@ public: LandType::Value getTerrainType(); LandType::Value getCharacterType(); uint8_t getModifierData(); + const std::string &getModifierText(); private: LandType::Value terrain_type = LandType::OVERWORLD; @@ -37,6 +39,7 @@ private: uint8_t character_id = 0; uint32_t modifier_id = 0; uint8_t modifier_data = 0; + std::string modifier_text = ""; }; #endif diff --git a/mario/scenes/editor_main.cpp b/mario/scenes/editor_main.cpp index df277f2..5bce1aa 100644 --- a/mario/scenes/editor_main.cpp +++ b/mario/scenes/editor_main.cpp @@ -765,6 +765,11 @@ void placeTool(SDLPP::Scene &scene) { global_vars.mouse.edit_box.getY(), false, true); new_obj->setTextureKeepSRC(global_vars.translucent_mod_texture); new_obj->setData(global_vars.current_tool->getData()); + if(new_obj->getId() == TELEPORT_MODIFIER_ID) { + // TODO input + new_obj->setTeleportLevel("test2.marmap"); + obj.setModifier(global_vars.current_tool->getId(), "test2.marmap"); + } new_obj->getCollisions()[0]->setId(EDITOR_TERRAIN_ID); // TODO createModifierBlock dynamic_cast(new_obj.get())->setTerrain(false);