bool AreaSpawnEvent::configureRaidEvent(xmlNodePtr eventNode) { if(!RaidEvent::configureRaidEvent(eventNode)){ return false; } std::string strValue; int intValue; if(readXMLInteger(eventNode, "radius", intValue)){ int32_t radius = intValue; Position centerPos; if(readXMLInteger(eventNode, "centerx", intValue)){ centerPos.x = intValue; } else{ std::cout << "[Error] Raid: centerx tag missing for areaspawn event." << std::endl; return false; } if(readXMLInteger(eventNode, "centery", intValue)){ centerPos.y = intValue; } else{ std::cout << "[Error] Raid: centery tag missing for areaspawn event." << std::endl; return false; } if(readXMLInteger(eventNode, "centerz", intValue)){ centerPos.z = intValue; } else{ std::cout << "[Error] Raid: centerz tag missing for areaspawn event." << std::endl; return false; } m_fromPos.x = centerPos.x - radius; m_fromPos.y = centerPos.y - radius; m_fromPos.z = centerPos.z; m_toPos.x = centerPos.x + radius; m_toPos.y = centerPos.y + radius; m_toPos.z = centerPos.z; } else{ if(readXMLInteger(eventNode, "fromx", intValue)){ m_fromPos.x = intValue; } else{ std::cout << "[Error] Raid: fromx tag missing for areaspawn event." << std::endl; return false; } if(readXMLInteger(eventNode, "fromy", intValue)){ m_fromPos.y = intValue; } else{ std::cout << "[Error] Raid: fromy tag missing for areaspawn event." << std::endl; return false; } if(readXMLInteger(eventNode, "fromz", intValue)){ m_fromPos.z = intValue; } else{ std::cout << "[Error] Raid: fromz tag missing for areaspawn event." << std::endl; return false; } if(readXMLInteger(eventNode, "tox", intValue)){ m_toPos.x = intValue; } else{ std::cout << "[Error] Raid: tox tag missing for areaspawn event." << std::endl; return false; } if(readXMLInteger(eventNode, "toy", intValue)){ m_toPos.y = intValue; } else{ std::cout << "[Error] Raid: toy tag missing for areaspawn event." << std::endl; return false; } if(readXMLInteger(eventNode, "toz", intValue)){ m_toPos.z = intValue; } else{ std::cout << "[Error] Raid: toz tag missing for areaspawn event." << std::endl; return false; } } xmlNodePtr monsterNode = eventNode->children; while(monsterNode){ if(xmlStrcmp(monsterNode->name, (const xmlChar*)"monster") == 0){ std::string name; int32_t minAmount = 0; int32_t maxAmount = 0; if(readXMLString(monsterNode, "name", strValue)){ name = strValue; } else{ std::cout << "[Error] Raid: name tag missing for monster node." << std::endl; return false; } if(readXMLInteger(monsterNode, "minamount", intValue)){ minAmount = intValue; } if(readXMLInteger(monsterNode, "maxamount", intValue)){ maxAmount = intValue; } if(maxAmount == 0 && minAmount == 0){ if(readXMLInteger(monsterNode, "amount", intValue)){ maxAmount = intValue; minAmount = intValue; } else{ std::cout << "[Error] Raid: amount tag missing for monster node." << std::endl; return false; } } addMonster(name, minAmount, maxAmount); } monsterNode = monsterNode->next; } return true; }
bool AreaSpawnEvent::configureRaidEvent(const pugi::xml_node& eventNode) { if (!RaidEvent::configureRaidEvent(eventNode)) { return false; } pugi::xml_attribute attr; if ((attr = eventNode.attribute("radius"))) { int32_t radius = pugi::cast<int32_t>(attr.value()); Position centerPos; if ((attr = eventNode.attribute("centerx"))) { centerPos.x = pugi::cast<uint16_t>(attr.value()); } else { std::cout << "[Error] Raid: centerx tag missing for areaspawn event." << std::endl; return false; } if ((attr = eventNode.attribute("centery"))) { centerPos.y = pugi::cast<uint16_t>(attr.value()); } else { std::cout << "[Error] Raid: centery tag missing for areaspawn event." << std::endl; return false; } if ((attr = eventNode.attribute("centerz"))) { centerPos.z = pugi::cast<uint16_t>(attr.value()); } else { std::cout << "[Error] Raid: centerz tag missing for areaspawn event." << std::endl; return false; } m_fromPos.x = std::max<int32_t>(0, centerPos.getX() - radius); m_fromPos.y = std::max<int32_t>(0, centerPos.getY() - radius); m_fromPos.z = centerPos.z; m_toPos.x = std::min<int32_t>(0xFFFF, centerPos.getX() + radius); m_toPos.y = std::min<int32_t>(0xFFFF, centerPos.getY() + radius); m_toPos.z = centerPos.z; } else { if ((attr = eventNode.attribute("fromx"))) { m_fromPos.x = pugi::cast<uint16_t>(attr.value()); } else { std::cout << "[Error] Raid: fromx tag missing for areaspawn event." << std::endl; return false; } if ((attr = eventNode.attribute("fromy"))) { m_fromPos.y = pugi::cast<uint16_t>(attr.value()); } else { std::cout << "[Error] Raid: fromy tag missing for areaspawn event." << std::endl; return false; } if ((attr = eventNode.attribute("fromz"))) { m_fromPos.z = pugi::cast<uint16_t>(attr.value()); } else { std::cout << "[Error] Raid: fromz tag missing for areaspawn event." << std::endl; return false; } if ((attr = eventNode.attribute("tox"))) { m_toPos.x = pugi::cast<uint16_t>(attr.value()); } else { std::cout << "[Error] Raid: tox tag missing for areaspawn event." << std::endl; return false; } if ((attr = eventNode.attribute("toy"))) { m_toPos.y = pugi::cast<uint16_t>(attr.value()); } else { std::cout << "[Error] Raid: toy tag missing for areaspawn event." << std::endl; return false; } if ((attr = eventNode.attribute("toz"))) { m_toPos.z = pugi::cast<uint16_t>(attr.value()); } else { std::cout << "[Error] Raid: toz tag missing for areaspawn event." << std::endl; return false; } } for (pugi::xml_node monsterNode = eventNode.first_child(); monsterNode; monsterNode = monsterNode.next_sibling()) { std::string name; if ((attr = monsterNode.attribute("name"))) { name = attr.as_string(); } else { std::cout << "[Error] Raid: name tag missing for monster node." << std::endl; return false; } int32_t minAmount; if ((attr = monsterNode.attribute("minamount"))) { minAmount = pugi::cast<uint32_t>(attr.value()); } else { minAmount = 0; } int32_t maxAmount; if ((attr = monsterNode.attribute("maxamount"))) { maxAmount = pugi::cast<uint32_t>(attr.value()); } else { maxAmount = 0; } if (maxAmount == 0 && minAmount == 0) { if ((attr = monsterNode.attribute("amount"))) { minAmount = pugi::cast<uint32_t>(attr.value()); maxAmount = minAmount; } else { std::cout << "[Error] Raid: amount tag missing for monster node." << std::endl; return false; } } addMonster(name, minAmount, maxAmount); } return true; }
/** * used to add a monster's sprite record to the list of monster sprite records * * @param env required by all java jni * @param obj required by all java jni * @param monster_mapx the x map coordinates of the monster's starting * point. * @param monster_mapy the y map coordinates of the monster's starting * point. * @param animate_index starting animation index of monster. */ JNIEXPORT void JNICALL Java_org_davidliebman_android_awesomeguy_Panel_addMonster(JNIEnv * env, jobject obj, jint monster_mapx, jint monster_mapy, jint animate_index) { addMonster(monster_mapx, monster_mapy, animate_index); }
void CMapGenerator::createDirectConnections() { for (auto connection : mapGenOptions->getMapTemplate()->getConnections()) { auto zoneA = connection.getZoneA(); auto zoneB = connection.getZoneB(); //rearrange tiles in random order auto tilesCopy = zoneA->getTileInfo(); std::vector<int3> tiles(tilesCopy.begin(), tilesCopy.end()); int3 guardPos(-1,-1,-1); auto otherZoneTiles = zoneB->getTileInfo(); int3 posA = zoneA->getPos(); int3 posB = zoneB->getPos(); // auto zoneAid = zoneA->getId(); auto zoneBid = zoneB->getId(); if (posA.z == posB.z) { std::vector<int3> middleTiles; for (auto tile : tilesCopy) { if (isBlocked(tile)) //tiles may be occupied by subterranean gates already placed continue; foreachDirectNeighbour (tile, [&guardPos, tile, &otherZoneTiles, &middleTiles, this, zoneBid](int3 &pos) //must be direct since paths also also generated between direct neighbours { if (getZoneID(pos) == zoneBid) middleTiles.push_back(tile); }); } //find tiles with minimum manhattan distance from center of the mass of zone border size_t tilesCount = middleTiles.size() ? middleTiles.size() : 1; int3 middleTile = std::accumulate(middleTiles.begin(), middleTiles.end(), int3(0, 0, 0)); middleTile.x /= tilesCount; middleTile.y /= tilesCount; middleTile.z /= tilesCount; //TODO: implement division operator for int3? boost::sort(middleTiles, [middleTile](const int3 &lhs, const int3 &rhs) -> bool { //choose tiles with both corrdinates in the middle return lhs.mandist2d(middleTile) < rhs.mandist2d(middleTile); }); //remove 1/4 tiles from each side - path should cross zone borders at smooth angle size_t removedCount = tilesCount / 4; //rounded down middleTiles.erase(middleTiles.end() - removedCount, middleTiles.end()); middleTiles.erase(middleTiles.begin(), middleTiles.begin() + removedCount); RandomGeneratorUtil::randomShuffle(middleTiles, rand); for (auto tile : middleTiles) { guardPos = tile; if (guardPos.valid()) { setOccupied(guardPos, ETileType::FREE); //just in case monster is too weak to spawn zoneA->addMonster(this, guardPos, connection.getGuardStrength(), false, true); //zones can make paths only in their own area zoneA->crunchPath(this, guardPos, posA, true, zoneA->getFreePaths()); //make connection towards our zone center zoneB->crunchPath(this, guardPos, posB, true, zoneB->getFreePaths()); //make connection towards other zone center zoneA->addRoadNode(guardPos); zoneB->addRoadNode(guardPos); break; //we're done with this connection } } } if (!guardPos.valid()) connectionsLeft.push_back(connection); } }
bool AreaSpawnEvent::configureRaidEvent(xmlNodePtr eventNode) { if(!RaidEvent::configureRaidEvent(eventNode)) return false; int32_t intValue; std::string strValue; if(readXMLInteger(eventNode, "radius", intValue)) { int32_t radius = intValue; Position centerPos; if(readXMLString(eventNode, "centerPosition", strValue) || readXMLString(eventNode, "centerpos", strValue)) { IntegerVec posList = vectorAtoi(explodeString(strValue, ";")); if(posList.size() < 3) { std::clog << "[Error - AreaSpawnEvent::configureRaidEvent] Malformed centerPosition tag for areaspawn event." << std::endl; return false; } centerPos = Position(posList[0], posList[1], posList[2]); } else { if(!readXMLInteger(eventNode, "centerx", intValue)) { std::clog << "[Error - AreaSpawnEvent::configureRaidEvent] centerx tag missing for areaspawn event." << std::endl; return false; } centerPos.x = intValue; if(!readXMLInteger(eventNode, "centery", intValue)) { std::clog << "[Error - AreaSpawnEvent::configureRaidEvent] centery tag missing for areaspawn event." << std::endl; return false; } centerPos.y = intValue; if(!readXMLInteger(eventNode, "centerz", intValue)) { std::clog << "[Error - AreaSpawnEvent::configureRaidEvent] centerz tag missing for areaspawn event." << std::endl; return false; } centerPos.z = intValue; } m_fromPos.x = centerPos.x - radius; m_fromPos.y = centerPos.y - radius; m_fromPos.z = centerPos.z; m_toPos.x = centerPos.x + radius; m_toPos.y = centerPos.y + radius; m_toPos.z = centerPos.z; } else { if(readXMLString(eventNode, "fromPosition", strValue) || readXMLString(eventNode, "frompos", strValue)) { IntegerVec posList = vectorAtoi(explodeString(strValue, ";")); if(posList.size() < 3) { std::clog << "[Error - AreaSpawnEvent::configureRaidEvent] Malformed fromPosition tag for areaspawn event." << std::endl; return false; } m_fromPos = Position(posList[0], posList[1], posList[2]); } else { if(!readXMLInteger(eventNode, "fromx", intValue)) { std::clog << "[Error - AreaSpawnEvent::configureRaidEvent] fromx tag missing for areaspawn event." << std::endl; return false; } m_fromPos.x = intValue; if(!readXMLInteger(eventNode, "fromy", intValue)) { std::clog << "[Error - AreaSpawnEvent::configureRaidEvent] fromy tag missing for areaspawn event." << std::endl; return false; } m_fromPos.y = intValue; if(!readXMLInteger(eventNode, "fromz", intValue)) { std::clog << "[Error - AreaSpawnEvent::configureRaidEvent] fromz tag missing for areaspawn event." << std::endl; return false; } m_fromPos.z = intValue; } if(readXMLString(eventNode, "toPosition", strValue) || readXMLString(eventNode, "topos", strValue)) { IntegerVec posList = vectorAtoi(explodeString(strValue, ";")); if(posList.size() < 3) { std::clog << "[Error - AreaSpawnEvent::configureRaidEvent] Malformed toPosition tag for areaspawn event." << std::endl; return false; } m_toPos = Position(posList[0], posList[1], posList[2]); } else { if(!readXMLInteger(eventNode, "tox", intValue)) { std::clog << "[Error - AreaSpawnEvent::configureRaidEvent] tox tag missing for areaspawn event." << std::endl; return false; } m_toPos.x = intValue; if(!readXMLInteger(eventNode, "toy", intValue)) { std::clog << "[Error - AreaSpawnEvent::configureRaidEvent] toy tag missing for areaspawn event." << std::endl; return false; } m_toPos.y = intValue; if(!readXMLInteger(eventNode, "toz", intValue)) { std::clog << "[Error - AreaSpawnEvent::configureRaidEvent] toz tag missing for areaspawn event." << std::endl; return false; } m_toPos.z = intValue; } } xmlNodePtr monsterNode = eventNode->children; while(monsterNode) { if(!xmlStrcmp(monsterNode->name, (const xmlChar*)"monster")) { if(!readXMLString(monsterNode, "name", strValue)) { std::clog << "[Error - AreaSpawnEvent::configureRaidEvent] name tag missing for monster node." << std::endl; return false; } std::string name = strValue; int32_t min = 0, max = 0; if(readXMLInteger(monsterNode, "min", intValue) || readXMLInteger(monsterNode, "maxamount", intValue)) min = intValue; if(readXMLInteger(monsterNode, "max", intValue) || readXMLInteger(monsterNode, "maxamount", intValue)) max = intValue; if(!min && !max) { if(!readXMLInteger(monsterNode, "amount", intValue)) { std::clog << "[Error - AreaSpawnEvent::configureRaidEvent] amount tag missing for monster node." << std::endl; return false; } min = max = intValue; } addMonster(name, min, max); } monsterNode = monsterNode->next; } return true; }