#include "mushroomblock.hpp" #include "../sprites.hpp" #include "../global_vars.hpp" #include "../objectids.hpp" #include "../visitors/mushroom_visitor.hpp" MushroomBlock::MushroomBlock(int x, int y, std::shared_ptr &renderer) : MarioBlock(x, y, renderer, g_terrain_texture, MUSHROOM_SRC, true, true) { setHidden(true); ensureCollision(); setId(MUSHROOM_ID); auto bottom_detect = SDLPP::RectColider(0.2, 1, 0.6, 0, NPC_FLOOR_DETECT); bottom_detect.setColor("#FF0000"); bottom_detect.setOutlineColor("#FF0000"); bottom_detect.setMinHeight(1); addCollision(bottom_detect); addCollision(SDLPP::RectColider(0, 0.25, 0.1, 0.6, NPC_LEFT_SIDE_DETECT)); addCollision( SDLPP::RectColider(0.9, 0.25, 0.1, 0.6, NPC_RIGHT_SIDE_DETECT)); } void MushroomBlock::custom_move(int ticks) { if (_parent != nullptr && !_parent->isBouncing() && !isTraveling()) { setHidden(false); travelToPos(_parent->getPos() - SDLPP::Vec2D(0, BLOCK_SIZE)); _parent = nullptr; } else if (_parent == nullptr && !isTraveling() && !_started_movement) { _started_movement = true; if(!_fire_flower) { setMovement(movementSpeed / 4, 0); } } gravity(ticks); MarioBlock::custom_move(ticks); } void MushroomBlock::setParent(MarioBlock *parent) { _parent = parent; } void MushroomBlock::handleVisitor(SDLPP::Visitor &visitor) { auto &m_visitor = dynamic_cast(visitor); if (m_visitor.getDeath()) { destroy(); } if (!_started_movement) { return; } setOnGround(m_visitor.isOnGround()); if (isOnGround()) { setPos(getPos().getX(), m_visitor.getGroundY() - BLOCK_SIZE); } if (!m_visitor.canGoLeft() || !m_visitor.canGoRight()) { setPos(m_visitor.getValidXPos(), getPos().getY()); setMovement(-getMovement().getX(), getMovement().getY()); } } void MushroomBlock::setFireFlower(bool fire_flower) { setTextureSourceRect(fire_flower ? FIRE_FLOWER_SRC : MUSHROOM_SRC); _fire_flower = fire_flower; }