void TRoomDB::buildAreas() { QTime _time; _time.start(); QMapIterator<int, TRoom *> it( rooms ); while( it.hasNext() ) { it.next(); int id = it.key(); TRoom * pR = getRoom(id); if( !pR ) continue; TArea * pA = getArea(pR->getArea()); if( !pA ) { areas[pR->getArea()] = new TArea( mpMap, this ); } } // if the area has been created without any rooms add the area ID QMapIterator<int, QString> it2( areaNamesMap ); while( it2.hasNext() ) { it2.next(); int id = it2.key(); if( ! areas.contains( id ) ) { areas[id] = new TArea( mpMap, this ); } } qDebug()<<"BUILD AREAS run time:"<<_time.elapsed(); }
// this is call by TRoom destructor only bool TRoomDB::__removeRoom( int id ) { if( rooms.contains(id ) && id > 0 ) { TRoom * pR = getRoom( id ); if( !pR ) return false; QMapIterator<int, TRoom *> it( rooms ); while( it.hasNext() ) { it.next(); TRoom * r = it.value(); if( r->getNorth() == id ) r->setNorth(-1); if( r->getNortheast() == id ) r->setNortheast(-1); if( r->getNorthwest() == id ) r->setNorthwest(-1); if( r->getEast() == id ) r->setEast(-1); if( r->getWest() == id ) r->setWest(-1); if( r->getSouth() == id ) r->setSouth(-1); if( r->getSoutheast() == id ) r->setSoutheast(-1); if( r->getSouthwest() == id ) r->setSouthwest(-1); if( r->getUp() == id ) r->setUp(-1); if( r->getDown() == id ) r->setDown(-1); if( r->getIn() == id ) r->setIn(-1); if( r->getOut() == id ) r->setOut(-1); r->removeAllSpecialExitsToRoom( id ); } int areaID = pR->getArea(); TArea * pA = getArea( areaID ); if( !pA ) return false; pA->rooms.removeAll( id ); pA->exits.remove( id ); //note: this removes *all* keys=id mpMap->mMapGraphNeedsUpdate = true; } QList<QString> keyList = hashTable.keys(); QList<int> valueList = hashTable.values(); for( int i=0; i<valueList.size(); i++ ) { if( valueList[i] == id ) { hashTable.remove( keyList[i] ); } } return true; }
// Reconstruct the area exit data in a format that actually makes sense - only // needed until the TRoom & TArea classes can be restructured to store exits // using the exit direction as a key and the to room as a value instead of vice-versa const QMultiMap<int, QPair<QString, int>> TArea::getAreaExitRoomData() const { QMultiMap<int, QPair<QString, int>> results; QSet<int> roomsWithOtherAreaSpecialExits; QMapIterator<int, QPair<int, int>> itAreaExit = exits; // First parse the normal exits and also find the rooms where there is at // least one special area exit while (itAreaExit.hasNext()) { itAreaExit.next(); QPair<QString, int> exitData; exitData.second = itAreaExit.value().first; switch (itAreaExit.value().second) { case DIR_NORTH: exitData.first = QString("north"); break; case DIR_NORTHEAST: exitData.first = QString("northeast"); break; case DIR_NORTHWEST: exitData.first = QString("northwest"); break; case DIR_SOUTH: exitData.first = QString("south"); break; case DIR_WEST: exitData.first = QString("west"); break; case DIR_EAST: exitData.first = QString("east"); break; case DIR_SOUTHEAST: exitData.first = QString("southeast"); break; case DIR_SOUTHWEST: exitData.first = QString("southwest"); break; case DIR_UP: exitData.first = QString("up"); break; case DIR_DOWN: exitData.first = QString("down"); break; case DIR_IN: exitData.first = QString("in"); break; case DIR_OUT: exitData.first = QString("out"); break; case DIR_OTHER: roomsWithOtherAreaSpecialExits.insert(itAreaExit.key()); break; default: qWarning("TArea::getAreaExitRoomData() Warning: unrecognised exit code %i found for exit from room %i to room %i.", itAreaExit.value().second, itAreaExit.key(), itAreaExit.value().first); } if (!exitData.first.isEmpty()) { results.insert(itAreaExit.key(), exitData); } } // Now have to find the special area exits in the rooms where we know there // IS one QSetIterator<int> itRoomWithOtherAreaSpecialExit = roomsWithOtherAreaSpecialExits; while (itRoomWithOtherAreaSpecialExit.hasNext()) { int fromRoomId = itRoomWithOtherAreaSpecialExit.next(); TRoom* pFromRoom = mpRoomDB->getRoom(fromRoomId); if (pFromRoom) { QMapIterator<int, QString> itOtherExit = pFromRoom->getOtherMap(); while (itOtherExit.hasNext()) { itOtherExit.next(); QPair<QString, int> exitData; exitData.second = itOtherExit.key(); TRoom* pToRoom = mpRoomDB->getRoom(exitData.second); if (pToRoom && mpRoomDB->getArea(pToRoom->getArea()) != this) { // Note that pToRoom->getArea() is misnamed, should be getAreaId() ! if (itOtherExit.value().mid(0, 1) == QStringLiteral("0") || itOtherExit.value().mid(0, 1) == QStringLiteral("1")) { exitData.first = itOtherExit.value().mid(1); } else { exitData.first = itOtherExit.value(); } if (!exitData.first.isEmpty()) { results.insert(fromRoomId, exitData); } } } } } return results; }
void TArea::determineAreaExits() { exits.clear(); QSetIterator<int> itRoom(rooms); while (itRoom.hasNext()) { int id = itRoom.next(); TRoom* pR = mpRoomDB->getRoom(id); if (!pR) { continue; } int exitId = pR->getNorth(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_NORTH); exits.insertMulti(id, p); } exitId = pR->getNortheast(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_NORTHEAST); exits.insertMulti(id, p); } exitId = pR->getEast(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_EAST); exits.insertMulti(id, p); } exitId = pR->getSoutheast(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_SOUTHEAST); exits.insertMulti(id, p); } exitId = pR->getSouth(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_SOUTH); exits.insertMulti(id, p); } exitId = pR->getSouthwest(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_SOUTHWEST); exits.insertMulti(id, p); } exitId = pR->getWest(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_WEST); exits.insertMulti(id, p); } exitId = pR->getNorthwest(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_NORTHWEST); exits.insertMulti(id, p); } exitId = pR->getUp(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_UP); exits.insertMulti(id, p); } exitId = pR->getDown(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_DOWN); exits.insertMulti(id, p); } exitId = pR->getIn(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_IN); exits.insertMulti(id, p); } exitId = pR->getOut(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_OUT); exits.insertMulti(id, p); } const QMap<int, QString> otherMap = pR->getOtherMap(); QMapIterator<int, QString> it(otherMap); while (it.hasNext()) { it.next(); int _exit = it.key(); TRoom* pO = mpRoomDB->getRoom(_exit); if (pO) { if (pO->getArea() != getAreaID()) { QPair<int, int> p = QPair<int, int>(pO->getId(), DIR_OTHER); exits.insertMulti(id, p); } } } } }
void TArea::determineAreaExitsOfRoom(int id) { if (!mpRoomDB) { return; } TRoom* pR = mpRoomDB->getRoom(id); if (!pR) { return; } exits.remove(id); int exitId = pR->getNorth(); // The second term in the ifs below looks for exit room id in TArea // instance's own list of rooms which will fail (with a -1 if it is NOT in // the list and hence the area. if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_NORTH); exits.insertMulti(id, p); } exitId = pR->getNortheast(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_NORTHEAST); exits.insertMulti(id, p); } exitId = pR->getEast(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_EAST); exits.insertMulti(id, p); } exitId = pR->getSoutheast(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_SOUTHEAST); exits.insertMulti(id, p); } exitId = pR->getSouth(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_SOUTH); exits.insertMulti(id, p); } exitId = pR->getSouthwest(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_SOUTHWEST); exits.insertMulti(id, p); } exitId = pR->getWest(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_WEST); exits.insertMulti(id, p); } exitId = pR->getNorthwest(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_NORTHWEST); exits.insertMulti(id, p); } exitId = pR->getUp(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_UP); exits.insertMulti(id, p); } exitId = pR->getDown(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_DOWN); exits.insertMulti(id, p); } exitId = pR->getIn(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_IN); exits.insertMulti(id, p); } exitId = pR->getOut(); if (exitId > 0 && !rooms.contains(exitId)) { QPair<int, int> p = QPair<int, int>(exitId, DIR_OUT); exits.insertMulti(id, p); } const QMap<int, QString> otherMap = pR->getOtherMap(); QMapIterator<int, QString> it(otherMap); while (it.hasNext()) { it.next(); int _exit = it.key(); TRoom* pO = mpRoomDB->getRoom(_exit); if (pO) { if (pO->getArea() != getAreaID()) { QPair<int, int> p = QPair<int, int>(pO->getId(), DIR_OTHER); exits.insertMulti(id, p); } } } }