diff --git a/mario/maploader.cpp b/mario/maploader.cpp index e7215e4..27f4691 100644 --- a/mario/maploader.cpp +++ b/mario/maploader.cpp @@ -59,8 +59,10 @@ uint8_t combineAdditionalData( uint8_t id, uint8_t type ) { } MapObject parseBlock( std::ifstream &map_file ) { - uint8_t character_type = 0, character_id = 0, modifier_id = 0, - modifier_data = 0; + uint8_t character_type = 0; + uint8_t character_id = 0; + uint32_t modifier_id = 0; + uint8_t modifier_data = 0; uint16_t wide_terrain = read16Bits( map_file ); auto terrain = separateWideTerrain( wide_terrain ); uint16_t terrain_id = terrain.first; @@ -72,7 +74,7 @@ MapObject parseBlock( std::ifstream &map_file ) { additional_data &= ~ADDITIONAL_IS_MOD; auto modifier = separateAdditionalData( additional_data ); // TODO swap modifier id and data - modifier_id = modifier.second; + modifier_id = modifier.second | 0x6000; modifier_data = modifier.first; } else { // character @@ -163,6 +165,15 @@ void loadMap( std::shared_ptr< SDLPP::Scene > &scene, mario->setPos( i * BLOCK_SIZE, 1 - ( 16 - j ) * BLOCK_SIZE ); } + } else { + auto obj = createTerrainBlock( + block.getCharacterId(), block.getCharacterType(), + renderer, i, j, destructible, editor); + dynamic_cast< MarioBlock * >( obj.get() )->setTerrain( false ); + if ( editor ) { + obj->getCollisions()[0]->setId( EDITOR_CHARACTER_ID ); + } + scene->addObject(obj); } } if ( editor && block.hasModifier() ) { @@ -202,7 +213,8 @@ void saveMap( const std::string &file, std::vector< mapColumnType > &objects ) { additional_data = combineAdditionalData(block.getCharacterId(), block.getCharacterType()); } else if ( block.hasModifier() ) { // TODO seriously change order of id/data!!! - additional_data = combineAdditionalData(block.getModifierData(), block.getModifierId()); + // we have IDs like 0x600X but only X is useful data, the 0x6 at the beginning is to differentiate mods from characters + additional_data = combineAdditionalData(block.getModifierData(), block.getModifierId() & 0x000F); additional_data |= ADDITIONAL_IS_MOD; } if ( additional_data ) { diff --git a/mario/mapobject.cpp b/mario/mapobject.cpp index 2f5d168..5362df2 100644 --- a/mario/mapobject.cpp +++ b/mario/mapobject.cpp @@ -2,7 +2,7 @@ MapObject::MapObject( uint16_t terrain_id, LandType::Value terrain_type, uint8_t character_id, LandType::Value character_type, - uint8_t modifier_id, uint8_t modifier_data ) { + uint32_t modifier_id, uint8_t modifier_data ) { setTerrain(terrain_id, terrain_type); if(character_id != 0) setCharacter(character_id, character_type); @@ -12,7 +12,7 @@ MapObject::MapObject( uint16_t terrain_id, LandType::Value terrain_type, MapObject::MapObject( uint16_t terrain_id, uint8_t terrain_type, uint8_t character_id, uint8_t character_type, - uint8_t modifier_id, uint8_t modifier_data ) + uint32_t modifier_id, uint8_t modifier_data ) : MapObject( terrain_id, static_cast< LandType::Value >( terrain_type ), character_id, static_cast< LandType::Value >( character_type ), @@ -40,7 +40,7 @@ void MapObject::setCharacter( uint8_t id, uint8_t land_type ) { setCharacter( id, static_cast< LandType::Value >( land_type ) ); } -void MapObject::setModifier( uint8_t id, uint8_t data ) { +void MapObject::setModifier( uint32_t id, uint8_t data ) { modifier_id = id; modifier_data = data; if(hasCharacter()) { @@ -81,7 +81,7 @@ uint8_t MapObject::getCharacterId() { return character_id; } -uint8_t MapObject::getModifierId() { +uint32_t MapObject::getModifierId() { return modifier_id; } diff --git a/mario/mapobject.hpp b/mario/mapobject.hpp index 2b28d36..ac0629c 100644 --- a/mario/mapobject.hpp +++ b/mario/mapobject.hpp @@ -7,16 +7,16 @@ class MapObject { public: MapObject() = default; MapObject( uint16_t terrain_id, uint8_t terrain_type, uint8_t character_id, - uint8_t character_type, uint8_t modifier_id, + uint8_t character_type, uint32_t modifier_id, uint8_t modifier_data ); MapObject( uint16_t terrain_id, LandType::Value terrain_type, uint8_t character_id, LandType::Value character_type, - uint8_t modifier_id, uint8_t modifier_data ); + uint32_t modifier_id, uint8_t modifier_data ); 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( uint8_t id, uint8_t data ); + void setModifier( uint32_t id, uint8_t data ); void unsetTerrain(); void unsetModifier(); void unsetCharacter(); @@ -25,7 +25,7 @@ public: uint16_t getTerrainId(); uint8_t getCharacterId(); - uint8_t getModifierId(); + uint32_t getModifierId(); LandType::Value getTerrainType(); LandType::Value getCharacterType(); uint8_t getModifierData(); @@ -35,7 +35,7 @@ private: uint16_t terrain_id = 0; LandType::Value character_type = LandType::OVERWORLD; uint8_t character_id = 0; - uint8_t modifier_id = 0; + uint32_t modifier_id = 0; uint8_t modifier_data = 0; };