コード例 #1
0
// 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));
   }   
}
コード例 #2
0
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);
}