Mario: added destructible modifier to editor

This commit is contained in:
2021-05-26 00:46:19 +02:00
parent 6fe283bb34
commit c2fb78b0a6
12 changed files with 100 additions and 33 deletions
+22 -11
View File
@@ -5,6 +5,7 @@
#include "sprites.hpp"
#include "blocks.hpp"
#include "objectids.hpp"
#include "global_vars.hpp"
// TODO move to one function
void loadMap( std::shared_ptr< SDLPP::Scene > &scene,
@@ -45,6 +46,10 @@ void loadMap( std::shared_ptr< SDLPP::Scene > &scene,
if ( id == FLOOR_ID || id == BRICK_ID || id == BRICK_TOP_ID ) {
collision = true;
}
// TODO definitely make this somehow more streamlined, probably flags
if(modifier_type == DESTRUCTIBLE_ID) {
destructible = true;
}
// TODO add modifiers to createTerrainBlock
auto obj =
createTerrainBlock( id, static_cast< LandType::Value >( type ),
@@ -112,6 +117,12 @@ void loadMap( std::shared_ptr< SDLPP::Scene > &scene, const std::string &file,
renderer, i, j ) );
}
}
if ( modifier_type ) {
auto mod = createTerrainBlock( modifier_type, LandType::OVERWORLD, renderer, i, j, g_translucent_terrain_texture, true );
mod->getCollisions()[0]->setId( EDITOR_TERRAIN_ID );
dynamic_cast<MarioBlock*>(mod.get())->setTerrain(false);
scene->addObject(mod);
}
}
}
if ( objects.size() < 18 ) {
@@ -129,24 +140,24 @@ void saveMap( const std::string &file, std::vector< mapColumnType > &objects ) {
for ( auto &col : objects ) {
for ( int i = 0; i < 16; i++ ) {
auto &obj = col[i];
uint16_t wide_type = std::get< 0 >( obj );
uint16_t wide_type = std::get< MapObject::TERRAIN_TYPE >( obj );
wide_type = wide_type << 12;
uint16_t write_num = ( 0x0FFF & std::get< 1 >( obj ) ) | wide_type;
// 3 becuase character type can be 0 (overworld), 4 because modifier
// data can be 0 (breakable)
if ( std::get< 3 >( obj ) || std::get< 4 >( obj ) ) {
uint16_t write_num = ( 0x0FFF & std::get< MapObject::TERRAIN_ID >( obj ) ) | wide_type;
// character type can be 0 (overworld), modifier data can be 0
if ( std::get< MapObject::CHARACTER_ID >( obj ) || std::get< MapObject::MODIFIER_TYPE >( obj ) ) {
write_num |= 0x8000;
}
output_file.write( ( char * )&write_num,
sizeof( uint16_t ) / sizeof( char ) );
uint8_t additional_data = 0;
if ( std::get< 3 >( obj ) ) {
additional_data |= std::get< 2 >( obj ) << 4;
additional_data |= std::get< 3 >( obj );
} else if ( std::get< 4 >( obj ) ) {
additional_data |= std::get< 4 >( obj ) << 4;
if ( std::get< MapObject::CHARACTER_ID >( obj ) ) {
additional_data |= std::get< MapObject::CHARACTER_TYPE >( obj ) << 4;
additional_data |= std::get< MapObject::CHARACTER_ID >( obj );
} else if ( std::get< MapObject::MODIFIER_TYPE >( obj ) ) {
std::cout << "SAVING MODIFIERS!" << std::endl;
additional_data |= std::get< MapObject::MODIFIER_TYPE >( obj ) << 4;
additional_data |= 0x80;
additional_data |= std::get< 5 >( obj );
additional_data |= std::get< MapObject::MODIFIER_DATA >( obj );
}
if ( additional_data ) {
output_file.write( ( char * )&additional_data,