// select the n'th command droid void selCommander(int n) { for (DROID *psCurr = apsDroidLists[selectedPlayer]; psCurr; psCurr = psCurr->psNext) { if (droidIsCommanderNum(psCurr, n)) { if (!psCurr->selected) { clearSelection(); psCurr->selected = true; } else { clearSelection(); psCurr->selected = true; // this horrible bit of code is taken from activateGroupAndMove // and sets the camera position to that of the commander if (getWarCamStatus()) { camToggleStatus(); // messy - fix this processWarCam(); // odd, but necessary camToggleStatus(); // messy - FIXME } else { /* Centre display on him if warcam isn't active */ setViewPos(map_coord(psCurr->pos.x), map_coord(psCurr->pos.y), true); } } return; } } }
/* Informs the tracking camera that we want to start tracking to a new radar target */ void requestRadarTrack(SDWORD x, SDWORD y) { radarX = (SWORD)x; radarY = (SWORD)y; bRadarTrackingRequested = true; trackingCamera.status = CAM_REQUEST; processWarCam(); }
// --------------------------------------------------------------------- void selNextUnassignedUnit( void ) { DROID *psCurr; DROID *psResult; DROID *psFirst; BOOL bLaterInList; for(psCurr = apsDroidLists[selectedPlayer],psFirst = NULL,psResult = NULL,bLaterInList = false; psCurr && !psResult; psCurr = psCurr->psNext) { /* Only look at unselected ones */ if(psCurr->group==UBYTE_MAX) { /* Keep a record of first one */ if(!psFirst) { psFirst = psCurr; } if(psCurr == psOldNS) { bLaterInList = true; } /* First one...? */ if(!psOldNS) { psResult = psCurr; } /* Dont choose same one again */ else if(psCurr!=psOldNS && bLaterInList) { psResult = psCurr; } } } /* If we didn't get one - then select first one */ if(!psResult) { if(psFirst) { psResult = psFirst; } } if(psResult && !psResult->died) { selDroidDeselect(selectedPlayer); // psResult->selected = true; SelectDroid(psResult); if(getWarCamStatus()) { camToggleStatus(); // messy - fix this // setViewPos(map_coord(psCentreDroid->pos.x), map_coord(psCentreDroid->pos.y)); processWarCam(); //odd, but necessary camToggleStatus(); // messy - FIXME } else if(!getWarCamStatus()) { // camToggleStatus(); /* Centre display on him if warcam isn't active */ setViewPos(map_coord(psResult->pos.x), map_coord(psResult->pos.y), true); } psOldNS = psResult; } else { addConsoleMessage(_("Unable to locate any repair units!"),LEFT_JUSTIFY,SYSTEM_MESSAGE); } }
// ffs am // --------------------------------------------------------------------- void selNextSpecifiedUnit(UDWORD unitType) { DROID *psCurr; DROID *psResult; DROID *psFirst; BOOL bLaterInList, bMatch; for(psCurr = apsDroidLists[selectedPlayer],psFirst = NULL,psResult = NULL,bLaterInList = false; psCurr && !psResult; psCurr = psCurr->psNext) { //if( psCurr->droidType == (SDWORD)unitType ) //exceptions - as always... bMatch = false; if (unitType == DROID_CONSTRUCT) { if (psCurr->droidType == DROID_CONSTRUCT || psCurr->droidType == DROID_CYBORG_CONSTRUCT) { bMatch = true; } } else if (unitType == DROID_REPAIR) { if (psCurr->droidType == DROID_REPAIR || psCurr->droidType == DROID_CYBORG_REPAIR) { bMatch = true; } } else if(psCurr->droidType == (SDWORD)unitType) { bMatch = true; } if (bMatch) { /* Always store away the first one we find */ if(!psFirst) { psFirst = psCurr; } if(psCurr == psOldRD) { bLaterInList = true; } /* Nothing previously found... */ if(!psOldRD) { psResult = psCurr; } /* Only select is this isn't the old one and it's further on in list */ else if(psCurr!=psOldRD && bLaterInList) { psResult = psCurr; } } } /* Did we get one? */ if(!psResult) { /* was there at least one - the first one? Resetting */ if(psFirst) { psResult = psFirst; } } if(psResult && !psResult->died) { selDroidDeselect(selectedPlayer); // psResult->selected = true; SelectDroid(psResult); if(getWarCamStatus()) { camToggleStatus(); // messy - fix this // setViewPos(map_coord(psCentreDroid->pos.x), map_coord(psCentreDroid->pos.y)); processWarCam(); //odd, but necessary camToggleStatus(); // messy - FIXME } else if(!getWarCamStatus()) { // camToggleStatus(); /* Centre display on him if warcam isn't active */ setViewPos(map_coord(psResult->pos.x), map_coord(psResult->pos.y), true); } psOldRD = psResult; } else { switch(unitType) { case DROID_REPAIR: addConsoleMessage(_("Unable to locate any repair units!"),LEFT_JUSTIFY,SYSTEM_MESSAGE); break; case DROID_CONSTRUCT: addConsoleMessage(_("Unable to locate any Trucks!"),LEFT_JUSTIFY,SYSTEM_MESSAGE); break; case DROID_SENSOR: addConsoleMessage(_("Unable to locate any Sensor Units!"),LEFT_JUSTIFY,SYSTEM_MESSAGE); break; case DROID_COMMAND: addConsoleMessage(_("Unable to locate any Commanders!"),LEFT_JUSTIFY,SYSTEM_MESSAGE); break; } } }
/* Attempts to find a new location for the tracking camera to go to, or a new object (target) for it to track. */ static void findSomethingInteresting(void) { enum { SEEK_DROID, SEEK_TARGET, SEEK_LAST, SEEK_OVERRIDE, } type; UDWORD player,otherPlayer; DROID *psDroid; UDWORD numWith; BOOL bSeekOnlyLocations; UDWORD i; BOOL bHaveHuman = false; PROPULSION_STATS *psPropStats; //--- //---- /* There may be droids, so don't rule it out */ bSeekOnlyLocations = false; /* Check all the droid lists, looking for empty ones */ for(i = 0,numWith = 0; i<MAX_PLAYERS; i++) { /* Keep a count of how many are empty */ if(apsDroidLists[i]) { /* We got one */ numWith++; if(i<MAX_PLAYERS-2) { bHaveHuman = true; } } } /* If they were all empty, then record this fact and only seek locations */ /* We need two sides for this to work! */ if(numWith<2 || !bHaveHuman) { bSeekOnlyLocations = true; } /* Keep going until we get one */ // while(!gotNewTarget) // { /* Are we only to seek locations? */ if(bSeekOnlyLocations) { /* Then force the switch outcome - hacky I know, but same as if else in code */ type = SEEK_OVERRIDE; } else { /* We're off hunting droids */ type = rand()%2 == 0? SEEK_DROID : SEEK_TARGET; } /* Check which */ switch (type) { /* Go after a droid, or a droid location */ case SEEK_DROID: case SEEK_TARGET: /* Choose a player at random */ player = rand()%MAX_PLAYERS; /* Have they got any droids? */ while(apsDroidLists[player]==NULL) { /* Nope, so choose another one until we get one with droids */ player = rand()%MAX_PLAYERS; } /* Choose a player at random */ otherPlayer = rand()%MAX_PLAYERS; /* Have they got any structures? Make sure it's not their own we're checking! */ while(apsStructLists[otherPlayer]==NULL || otherPlayer==player) { /* Nope, so choose another one until we get one with droids */ otherPlayer = rand()%MAX_PLAYERS; } /* If there was a droid last time, deselect it */ if(psLastDroid && !psLastDroid->died) { psLastDroid->selected = false; } /* Jump to droid and track */ psDroid = getDroidForDemo(player); /* Only do if we've got a droid and an enemy building to attack */ if(psDroid && apsStructLists[otherPlayer]) { psDroid->selected = true; selectedPlayer = player; realSelectedPlayer = selectedPlayer; psLastDroid = psDroid; // if(orderState(psDroid,DORDER_ATTACK) == false) // { orderDroidLoc(psDroid,DORDER_MOVE, apsStructLists[otherPlayer]->pos.x, apsStructLists[otherPlayer]->pos.y, ModeQueue); // } if(!getWarCamStatus()) { /* Start the tracking */ camToggleStatus(); } else { camToggleStatus(); processWarCam(); camToggleStatus(); } psPropStats = asPropulsionStats + psDroid->asBits[COMP_PROPULSION].nStat; if ( psPropStats->propulsionType == PROPULSION_TYPE_LIFT ) { /* Track vtols for longer */ demoCamInterval = 3*DEFAULT_DEMO_INTERVAL; } else { demoCamInterval = DEFAULT_DEMO_INTERVAL; } } break; /* Go to a new location cos there's no droids left in the world....ahhhhhhh*/ case SEEK_OVERRIDE: requestRadarTrack((16 + rand()%(mapWidth-31))*TILE_UNITS, (16 + rand()%(mapHeight-31)) * TILE_UNITS ); break; default: break; } // } }