static void driveMoveCommandFollowers(DROID *psDroid) { DROID_GROUP *psGroup = psDroid->psGroup; for (DROID *psCurr = psGroup->psList; psCurr != NULL; psCurr = psCurr->psGrpNext) { driveMoveFollower(psCurr); } }
// Call once per frame. // void driveUpdate(void) { DROID *psDroid; PROPULSION_STATS *psPropStats; AllInRange = true; if(DirectControl) { if(psDrivenDroid != NULL) { if(bMultiMessages && (driveBumpTime < gameTime)) // send latest info about driven droid. { sendDroidInfo(psDrivenDroid, DORDER_MOVE, psDrivenDroid->pos.x, psDrivenDroid->pos.y, NULL, NULL, 0, 0, 0, false); } //TO BE DONE: //clear the order on taking over the droid, to stop attacks.. //send some sort of message when droids stopo and get inrange. // Check the driven droid is still selected if(psDrivenDroid->selected == false) { // if it's not then reset the driving system. driveSelectionChanged(); return; } // Update the driven droid. if(driveControl(psDrivenDroid)) { // If control did something then force the droid's move status. if(psDrivenDroid->sMove.Status != MOVEDRIVE) { psDrivenDroid->sMove.Status = MOVEDRIVE; ASSERT( (psDrivenDroid->droidType != DROID_TRANSPORTER),"Tried to control a transporter" ); driveDir = UNDEG(psDrivenDroid->rot.direction); } DoFollowRangeCheck = true; } // Is the driven droid under user control? if(psDrivenDroid->sMove.Status == MOVEDRIVE) { // Is it a command droid if( (psDrivenDroid->droidType == DROID_COMMAND) && (psDrivenDroid->psGroup != NULL) ) { driveMoveCommandFollowers(psDrivenDroid); } for(psDroid = apsDroidLists[selectedPlayer]; psDroid; psDroid = psDroid->psNext) { psPropStats = asPropulsionStats + psDroid->asBits[COMP_PROPULSION].nStat; if( (psDroid->selected) && (psDroid != psDrivenDroid) && (psDroid->droidType != DROID_TRANSPORTER) && //((psPropStats->propulsionType != PROPULSION_TYPE_LIFT) || (psDroid->droidType == DROID_CYBORG)) ) { ((psPropStats->propulsionType != PROPULSION_TYPE_LIFT) || cyborgDroid(psDroid)) ) { // Send new orders to it's followers. driveMoveFollower(psDroid); } } } if(AllInRange) { DoFollowRangeCheck = false; } if(driveBumpTime < gameTime) { // Send next order in 1 second. driveBumpTime = gameTime+GAME_TICKS_PER_SEC; } } else { if(StartDriverMode(NULL) == false) { // nothing } } } }