diff --git a/mario/blocks.cpp b/mario/blocks.cpp index bced785..76c61bb 100644 --- a/mario/blocks.cpp +++ b/mario/blocks.cpp @@ -6,7 +6,8 @@ MarioBlock::MarioBlock(int x, int y, std::shared_ptr renderer, std::shared_ptr texture, SDL_Rect src) : RectangleRender( x * BLOCK_SIZE, 1 - (16-y) * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE, renderer, texture, src ) {} void MarioBlock::visit( SDLPP::Visitor &visitor ) { - if(!_tool && visitor.getVisitorType() == TOOL_VISITOR_TYPE) { + // TODO if character don't + if(!_tool && !_character && visitor.getVisitorType() == TOOL_VISITOR_TYPE) { destroy(); } visitor.visit(*this); @@ -14,6 +15,9 @@ void MarioBlock::visit( SDLPP::Visitor &visitor ) { void MarioBlock::setTool(bool tool) { _tool = tool; } +void MarioBlock::setCharacter(bool character) { + _character = character; +} const std::vector< uint64_t > possibleBlocks = { FLOOR_ID, HILL_INCLINE_ID, @@ -105,5 +109,7 @@ createTerrainBlock( uint64_t block_id, BlockType type, std::shared_ptr createMario( BlockType type, std::shared_ptr &renderer, int x, int y ) { //TODO add type additions - return createBlock( renderer, x, y, g_mario_texture, MARIO_STANDING_SRC, MARIO_ID, true ); + auto mario = createBlock( renderer, x, y, g_mario_texture, MARIO_STANDING_SRC, MARIO_ID, true ); + dynamic_cast(*mario).setCharacter(); + return mario; } diff --git a/mario/blocks.hpp b/mario/blocks.hpp index cb429e3..29f35c7 100644 --- a/mario/blocks.hpp +++ b/mario/blocks.hpp @@ -9,8 +9,10 @@ public: MarioBlock(int x, int y, std::shared_ptr renderer, std::shared_ptr texture, SDL_Rect src); void visit( SDLPP::Visitor &visitor ) override; void setTool(bool tool = true); + void setCharacter(bool character = true); private: bool _tool = false; + bool _character = false; }; extern const std::vector possibleBlocks; diff --git a/mario/editor.cpp b/mario/editor.cpp index 2731f21..eb33490 100644 --- a/mario/editor.cpp +++ b/mario/editor.cpp @@ -126,13 +126,14 @@ void pollEvents( SDLPP::Scene &scene ) { ToolVisitor visitor; visitor.setVisitorType(TOOL_VISITOR_TYPE); scene.visitCollisions(*current_tool, visitor); - if(visitor.removeBlock()) { + if(visitor.removeBlock() && !visitor.addBlock()) { // TODO check if modifier - objects[current_start_index + current_box.getX()][current_box.getY()] = {OVERWORLD, 0, 0, 0, 0, 0}; - } - if(visitor.addBlock()) { + auto prev = objects[current_start_index + current_box.getX()][current_box.getY()]; + objects[current_start_index + current_box.getX()][current_box.getY()] = {OVERWORLD, 0, std::get<2>(prev), std::get<3>(prev), 0, 0}; + } else if(visitor.addBlock()) { // TODO check if modifier - objects[current_start_index + current_box.getX()][current_box.getY()] = {OVERWORLD, current_tool->getId(), 0, 0, 0, 0}; + auto prev = objects[current_start_index + current_box.getX()][current_box.getY()]; + objects[current_start_index + current_box.getX()][current_box.getY()] = {OVERWORLD, current_tool->getId(), std::get<2>(prev), std::get<3>(prev), 0, 0}; auto obj = createTerrainBlock(current_tool->getId(), OVERWORLD, renderer, 1 + current_box.getX(), current_box.getY(), true); obj->getCollisions()[0]->setId(EDITOR_TERRAIN_ID); scene.addObject(obj);