// There are between 1 and MAX_PADS landing pads in a level void Game::MakeLandingPads() { pads.clear(); int nLandingPads = rand()%MAX_PADS + 1; cout << " Landing pads: " << nLandingPads << endl; for (int i = 0; i < nLandingPads; i++) { int index, length; bool overlap; do { index = rand() % (viewport.GetLevelWidth() / Surface::SURFACE_SIZE); length = rand() % MAX_PAD_SIZE + 3; // Check for overlap overlap = false; if (index + length > (viewport.GetLevelWidth() / Surface::SURFACE_SIZE)) overlap = true; for (int j = 0; j < i; j++) { if (pads[j].GetIndex() == index) overlap = true; else if (pads[j].GetIndex() < index && pads[j].GetIndex() + pads[j].GetLength() >= index) overlap = true; else if (index < pads[j].GetIndex() && index + length >= pads[j].GetIndex()) overlap = true; } } while (overlap); pads.push_back(LandingPad(&viewport, index, length)); } }
void CAirBaseHandler::RegisterAirBase(CUnit* base) { AirBase* ab = SAFE_NEW AirBase(base); std::vector<int> args; int maxPadCount = 16; // default max pad count if (base->cob->GetFunctionId("QueryLandingPadCount") >= 0) { args.push_back(maxPadCount); base->cob->Call("QueryLandingPadCount", args); maxPadCount = args[0]; args.clear(); } for (int i = 0; i < maxPadCount; i++) { args.push_back(-1); } base->cob->Call("QueryLandingPad", args); // FIXME: use a set to avoid multiple bases per piece? for (int p = 0; p < (int)args.size(); p++) { const int piece = args[p]; if ((piece < 0) || (piece >= base->cob->pieces.size())) { continue; } LandingPad* pad = SAFE_NEW LandingPad(base, piece, ab); ab->pads.push_back(pad); ab->freePads.push_back(pad); } freeBases[base->allyteam].push_back(ab); bases[base->allyteam].push_back(ab); }