Ejemplo n.º 1
0
void PathFinding::searchPath(const QHash<QString, MapVisualiserThread::Map_full *> &all_map,const QString &destination_map,const quint8 &destination_x,const quint8 &destination_y,const QString &current_map,const quint8 &x,const quint8 &y,const QHash<quint16,quint32> &items)
{
    //path finding buggy
    {
        QList<QPair<CatchChallenger::Orientation,quint8> > path;
        emit result(path);
        return;
    }
    if(!all_map.contains(current_map))
    {
        QList<QPair<CatchChallenger::Orientation,quint8> > path;
        emit result(path);
        return;
    }
    tryCancel=false;
    QHash<QString,SimplifiedMapForPathFinding> simplifiedMapList;
    QHash<QString,MapVisualiserThread::Map_full *>::const_iterator i = all_map.constBegin();
    //load the data
    while (i != all_map.constEnd()) {
        if(i.value()->displayed)
        {
            SimplifiedMapForPathFinding simplifiedMap;
            simplifiedMap.width=i.value()->logicalMap.width;
            simplifiedMap.height=i.value()->logicalMap.height;
            if(i.value()->logicalMap.parsed_layer.dirt==NULL)
                simplifiedMap.dirt=NULL;
            else
            {
                simplifiedMap.dirt=new bool[simplifiedMap.width*simplifiedMap.height];
                memcpy(simplifiedMap.dirt,i.value()->logicalMap.parsed_layer.dirt,simplifiedMap.width*simplifiedMap.height);
            }
            if(i.value()->logicalMap.parsed_layer.ledges==NULL)
                simplifiedMap.ledges=NULL;
            else
            {
                simplifiedMap.ledges=new quint8[simplifiedMap.width*simplifiedMap.height];
                memcpy(simplifiedMap.ledges,i.value()->logicalMap.parsed_layer.ledges,simplifiedMap.width*simplifiedMap.height);
            }
            if(i.value()->logicalMap.parsed_layer.walkable==NULL)
                simplifiedMap.walkable=NULL;
            else
            {
                simplifiedMap.walkable=new bool[simplifiedMap.width*simplifiedMap.height];
                memcpy(simplifiedMap.walkable,i.value()->logicalMap.parsed_layer.walkable,simplifiedMap.width*simplifiedMap.height);
            }
            if(i.value()->logicalMap.parsed_layer.monstersCollisionMap==NULL)
                simplifiedMap.monstersCollisionMap=NULL;
            else
            {
                simplifiedMap.monstersCollisionMap=new quint8[simplifiedMap.width*simplifiedMap.height];
                memcpy(simplifiedMap.monstersCollisionMap,i.value()->logicalMap.parsed_layer.monstersCollisionMap,simplifiedMap.width*simplifiedMap.height);
            }
            simplifiedMapList[i.key()]=simplifiedMap;
        }
        ++i;
    }
    //resolv the border
    QHash<QString,SimplifiedMapForPathFinding>::const_iterator j = simplifiedMapList.constBegin();
    while (j != simplifiedMapList.constEnd()) {
        if(all_map.contains(all_map.value(j.key())->logicalMap.border_semi.bottom.fileName))
        {
            simplifiedMapList[j.key()].border.bottom.map=&simplifiedMapList[all_map.value(j.key())->logicalMap.border_semi.bottom.fileName];
            simplifiedMapList[j.key()].border.bottom.x_offset=all_map.value(j.key())->logicalMap.border_semi.bottom.x_offset;
        }
        else
        {
            simplifiedMapList[j.key()].border.bottom.map=NULL;
            simplifiedMapList[j.key()].border.bottom.x_offset=0;
        }
        if(all_map.contains(all_map.value(j.key())->logicalMap.border_semi.left.fileName))
        {
            simplifiedMapList[j.key()].border.left.map=&simplifiedMapList[all_map.value(j.key())->logicalMap.border_semi.left.fileName];
            simplifiedMapList[j.key()].border.left.y_offset=all_map.value(j.key())->logicalMap.border_semi.left.y_offset;
        }
        else
        {
            simplifiedMapList[j.key()].border.left.map=NULL;
            simplifiedMapList[j.key()].border.left.y_offset=0;
        }
        if(all_map.contains(all_map.value(j.key())->logicalMap.border_semi.right.fileName))
        {
            simplifiedMapList[j.key()].border.right.map=&simplifiedMapList[all_map.value(j.key())->logicalMap.border_semi.right.fileName];
            simplifiedMapList[j.key()].border.right.y_offset=all_map.value(j.key())->logicalMap.border_semi.right.y_offset;
        }
        else
        {
            simplifiedMapList[j.key()].border.right.map=NULL;
            simplifiedMapList[j.key()].border.right.y_offset=0;
        }
        if(all_map.contains(all_map.value(j.key())->logicalMap.border_semi.top.fileName))
        {
            simplifiedMapList[j.key()].border.top.map=&simplifiedMapList[all_map.value(j.key())->logicalMap.border_semi.top.fileName];
            simplifiedMapList[j.key()].border.top.x_offset=all_map.value(j.key())->logicalMap.border_semi.top.x_offset;
        }
        else
        {
            simplifiedMapList[j.key()].border.top.map=NULL;
            simplifiedMapList[j.key()].border.top.x_offset=0;
        }
        ++j;
    }
    //load for thread and unload if needed
    {
        QMutexLocker locker(&mutex);
        QHash<QString,SimplifiedMapForPathFinding>::const_iterator k = this->simplifiedMapList.constBegin();
        while (k != this->simplifiedMapList.constEnd()) {
            delete k.value().dirt;
            delete k.value().ledges;
            delete k.value().walkable;
            delete k.value().monstersCollisionMap;
            ++k;
        }
        this->simplifiedMapList=simplifiedMapList;
    }
    emit emitSearchPath(destination_map,destination_x,destination_y,current_map,x,y,items);
}
Ejemplo n.º 2
0
void PathFinding::searchPath(const std::unordered_map<std::string, MapVisualiserThread::Map_full *> &all_map,
                             const std::string &destination_map,const uint8_t &destination_x,const uint8_t &destination_y,
                             const std::string &current_map,const uint8_t &x,const uint8_t &y,const std::unordered_map<uint16_t,uint32_t> &items)
{
    //path finding buggy
    /*{
        std::vector<std::pair<CatchChallenger::Orientation,uint8_t> > path;
        emit result(path);
        return;
    }*/
    if(all_map.find(current_map)==all_map.cend())
    {
        std::vector<std::pair<CatchChallenger::Orientation,uint8_t> > path;
        emit result(std::string(),0,0,path);
        return;
    }
    tryCancel=false;
    std::unordered_map<std::string,SimplifiedMapForPathFinding> simplifiedMapList;
    //load the data
    for ( const auto &n : all_map ) {
        if(n.second->displayed)
        {
            SimplifiedMapForPathFinding simplifiedMap;
            simplifiedMap.width=n.second->logicalMap.width;
            simplifiedMap.height=n.second->logicalMap.height;
            if(n.second->logicalMap.parsed_layer.dirt==NULL)
                simplifiedMap.dirt=NULL;
            else
            {
                simplifiedMap.dirt=new bool[simplifiedMap.width*simplifiedMap.height];
                memcpy(simplifiedMap.dirt,n.second->logicalMap.parsed_layer.dirt,simplifiedMap.width*simplifiedMap.height);
            }
            if(n.second->logicalMap.parsed_layer.ledges==NULL)
                simplifiedMap.ledges=NULL;
            else
            {
                simplifiedMap.ledges=new uint8_t[simplifiedMap.width*simplifiedMap.height];
                memcpy(simplifiedMap.ledges,n.second->logicalMap.parsed_layer.ledges,simplifiedMap.width*simplifiedMap.height);
            }
            if(n.second->logicalMap.parsed_layer.walkable==NULL)
                simplifiedMap.walkable=NULL;
            else
            {
                simplifiedMap.walkable=new bool[simplifiedMap.width*simplifiedMap.height];
                memcpy(simplifiedMap.walkable,n.second->logicalMap.parsed_layer.walkable,simplifiedMap.width*simplifiedMap.height);
            }
            if(n.second->logicalMap.parsed_layer.monstersCollisionMap==NULL)
                simplifiedMap.monstersCollisionMap=NULL;
            else
            {
                simplifiedMap.monstersCollisionMap=new uint8_t[simplifiedMap.width*simplifiedMap.height];
                memcpy(simplifiedMap.monstersCollisionMap,n.second->logicalMap.parsed_layer.monstersCollisionMap,simplifiedMap.width*simplifiedMap.height);
            }
            simplifiedMapList[n.first]=simplifiedMap;
        }
    }
    //resolv the border
    for ( const auto &n : simplifiedMapList ) {
        if(all_map.find(all_map.at(n.first)->logicalMap.border_semi.bottom.fileName)!=all_map.cend())
        {
            simplifiedMapList[n.first].border.bottom.map=&simplifiedMapList[all_map.at(n.first)->logicalMap.border_semi.bottom.fileName];
            simplifiedMapList[n.first].border.bottom.x_offset=all_map.at(n.first)->logicalMap.border_semi.bottom.x_offset;
        }
        else
        {
            simplifiedMapList[n.first].border.bottom.map=NULL;
            simplifiedMapList[n.first].border.bottom.x_offset=0;
        }
        if(all_map.find(all_map.at(n.first)->logicalMap.border_semi.left.fileName)!=all_map.cend())
        {
            simplifiedMapList[n.first].border.left.map=&simplifiedMapList[all_map.at(n.first)->logicalMap.border_semi.left.fileName];
            simplifiedMapList[n.first].border.left.y_offset=all_map.at(n.first)->logicalMap.border_semi.left.y_offset;
        }
        else
        {
            simplifiedMapList[n.first].border.left.map=NULL;
            simplifiedMapList[n.first].border.left.y_offset=0;
        }
        if(all_map.find(all_map.at(n.first)->logicalMap.border_semi.right.fileName)!=all_map.cend())
        {
            simplifiedMapList[n.first].border.right.map=&simplifiedMapList[all_map.at(n.first)->logicalMap.border_semi.right.fileName];
            simplifiedMapList[n.first].border.right.y_offset=all_map.at(n.first)->logicalMap.border_semi.right.y_offset;
        }
        else
        {
            simplifiedMapList[n.first].border.right.map=NULL;
            simplifiedMapList[n.first].border.right.y_offset=0;
        }
        if(all_map.find(all_map.at(n.first)->logicalMap.border_semi.top.fileName)!=all_map.cend())
        {
            simplifiedMapList[n.first].border.top.map=&simplifiedMapList[all_map.at(n.first)->logicalMap.border_semi.top.fileName];
            simplifiedMapList[n.first].border.top.x_offset=all_map.at(n.first)->logicalMap.border_semi.top.x_offset;
        }
        else
        {
            simplifiedMapList[n.first].border.top.map=NULL;
            simplifiedMapList[n.first].border.top.x_offset=0;
        }
    }
    //load for thread and unload if needed
    {
        QMutexLocker locker(&mutex);
        for ( auto &n : simplifiedMapList ) {
            if(n.second.dirt!=NULL)
            {
                delete n.second.dirt;
                n.second.dirt=NULL;
            }
            if(n.second.ledges!=NULL)
            {
                delete n.second.ledges;
                n.second.ledges=NULL;
            }
            if(n.second.walkable!=NULL)
            {
                delete n.second.walkable;
                n.second.walkable=NULL;
            }
            if(n.second.monstersCollisionMap!=NULL)
            {
                delete n.second.monstersCollisionMap;
                n.second.monstersCollisionMap=NULL;
            }
        }
        this->simplifiedMapList=simplifiedMapList;
    }
    emit emitSearchPath(destination_map,destination_x,destination_y,current_map,x,y,items);
}