MapAdventureObjectPickupItem.cpp 3.41 KB
//
//  MapAdventureObjectSlide.cpp
//  WattsenglishFoodApp
//
//  Created by Katarzyna Kalinowska-Górska on 21/03/2020.
//

#include "AniMapUtils.h"
#include "MapAdventureObjectPickupItem.h"
#include "AniGeometryUtils.h"

MapAdventureObjectPickupItem::MapAdventureObjectPickupItem(const rapidjson::Value& p_mapObjectData, IMapImageObject* p_mapImageObject, bool oneTile) : IMapAdventureObject(p_mapObjectData) {
    m_objectClassName = "MapAdventureObjectPickupItem";
    
    m_mapImageObjects.insert({p_mapImageObject->objectName, p_mapImageObject});
    m_oneTile = oneTile;
    resetOccupiedTileIfNecessary();
}

MapAdventureObjectPickupItem::MapAdventureObjectPickupItem(std::string objectName, IMapImageObject* p_mapImageObject, bool oneTile) : IMapAdventureObject(objectName) {
    m_objectClassName = "MapAdventureObjectPickupItem";
    m_mapImageObjects.insert({p_mapImageObject->objectName, p_mapImageObject});
    m_oneTile = oneTile;
    resetOccupiedTileIfNecessary();
}

std::vector<AniMapUtils::TileData> MapAdventureObjectPickupItem::getOccupiedTiles() const {
    if(m_occupiedTile.col > -1 && m_occupiedTile.row > -1){
        return {m_occupiedTile};
    } else {
        auto itemMapObject = m_mapImageObjects.begin()->second;
        auto parentMap = itemMapObject->getParentMap();
        return AniMapUtils::getInstance().getTilesIntersectingRect(itemMapObject->getBoundingBox(), parentMap->getTileSize().width, parentMap->getTileSize().height, parentMap->getMapSize().width, parentMap->getMapSize().height);
    }
}

// TODO maybe calculate just border tiles? would be useful for big objects
std::vector<AniMapUtils::TileData> MapAdventureObjectPickupItem::getEntryTiles() const {
    return getOccupiedTiles(); //m_occupiedTiles;
}

void MapAdventureObjectPickupItem::pickUp(){
//    m_mapImageObjects.begin()->second->setOpacity(0);
    setActive(false);
    if(m_delegate != nullptr){
        auto event = new IMapAdventureObjectEvent(IMapAdventureObjectEventTypeItemPickedUp);
        m_delegate->onMapAdventureObjectEvent(this, event);
        delete event;
    }
}

void MapAdventureObjectPickupItem::reset(){
    m_mapImageObjects.begin()->second->setOpacity(255);
    setActive(true);
}

void MapAdventureObjectPickupItem::resetOccupiedTileIfNecessary(){
    if(m_oneTile){
        auto mapImageObject =  m_mapImageObjects.begin()->second;
        auto parentMap = mapImageObject->getParentMap();
        m_occupiedTile = AniMapUtils::getInstance().translateXYPointToColRow(mapImageObject->getPosition(), parentMap->getTileSize().width, parentMap->getTileSize().height, parentMap->getMapSize().width, parentMap->getMapSize().height);
    }
}

std::vector<AniMapUtils::TileData> MapAdventureObjectPickupItem::getOccupiedTilesRestrictedByIntersectionPercent(float percent) const{
    auto occupiedTiles = getOccupiedTiles();
    std::vector<AniMapUtils::TileData> tilesToReturn;
    auto itemMapObject = m_mapImageObjects.begin()->second;
    auto mapObjectRect = itemMapObject->getBoundingBox();
    auto parentMap = itemMapObject->getParentMap();
    for(auto it = occupiedTiles.begin(); it != occupiedTiles.end(); ++it){
        auto tileRect = AniMapUtils::getInstance().getTileRect(parentMap, (*it).col, (*it).row);
        auto intersectionPercent = AniGeometryUtils::calculateIntersectionPercentage(tileRect, mapObjectRect);
        if(intersectionPercent >= percent){
            tilesToReturn.push_back(*it);
        }
    }
    return tilesToReturn;
}