// Cycle to next droid in group and make it the driver. // static void driveNextDriver(void) { DROID *psDroid; // Start from the current driven droid. for(psDroid = psDrivenDroid; psDroid; psDroid = psDroid->psNext) { if( (psDroid->selected) && (psDroid != psDrivenDroid) ) { // Found one so make it the driven droid. // psDrivenDroid->sMove.Status = MOVEINACTIVE; // psDroid->sMove.Status = MOVEDRIVE; psDrivenDroid = psDroid; camAllignWithTarget((BASE_OBJECT*)psDroid); driveTacticalSelectionChanged(); return; } } for(psDroid = apsDroidLists[selectedPlayer]; psDroid && (psDroid != psDrivenDroid); psDroid = psDroid->psNext) { if(psDroid->selected) { // Found one so make it the driven droid. // psDrivenDroid->sMove.Status = MOVEINACTIVE; // psDroid->sMove.Status = MOVEDRIVE; psDrivenDroid = psDroid; camAllignWithTarget((BASE_OBJECT*)psDroid); driveTacticalSelectionChanged(); return; } } // No other selected droids found. Oh well... }
// Cycle to next droid in group and make it the driver. // static void driveNextDriver(void) { DROID *psDroid; // Start from the current driven droid. for (psDroid = psDrivenDroid; psDroid; psDroid = psDroid->psNext) { if ((psDroid->selected) && (psDroid != psDrivenDroid)) { // Found one so make it the driven droid. psDrivenDroid = psDroid; camAllignWithTarget((BASE_OBJECT *)psDroid); return; } } for (psDroid = apsDroidLists[selectedPlayer]; psDroid && (psDroid != psDrivenDroid); psDroid = psDroid->psNext) { if (psDroid->selected) { // Found one so make it the driven droid. psDrivenDroid = psDroid; camAllignWithTarget((BASE_OBJECT *)psDroid); return; } } // No other selected droids found. Oh well... }
/* Updates the camera position/angle along with the object movement */ bool processWarCam( void ) { BASE_OBJECT *foundTarget; bool Status = true; /* Get out if the camera isn't active */ if(trackingCamera.status == CAM_INACTIVE) { return(true); } /* Ensure that the camera only ever flips state within this routine! */ switch(trackingCamera.status) { case CAM_REQUEST: /* See if we can find the target to follow */ foundTarget = camFindTarget(); if(foundTarget && !foundTarget->died) { /* We've got one, so store away info */ camAllignWithTarget(foundTarget); /* We're now into tracking status */ trackingCamera.status = CAM_TRACKING; /* Inform via console */ if(foundTarget->type == OBJ_DROID) { if(getWarCamStatus()) { CONPRINTF(ConsoleString,(ConsoleString,"WZ/CAM - %s",droidGetName((DROID*)foundTarget))); } } } else { /* We've requested a track with no droid selected */ trackingCamera.status = CAM_INACTIVE; } break; case CAM_TRACKING: /* Track the droid unless routine comes back false */ if(!camTrackCamera()) { /* Camera track came back false, either because droid died or is no longer selected, so reset to old values */ foundTarget = camFindTarget(); if(foundTarget && !foundTarget->died) { trackingCamera.status = CAM_REQUEST; } else { trackingCamera.status = CAM_RESET; } } processLeaderSelection(); break; case CAM_RESET: /* Reset camera to pre-droid tracking status */ if( (trackingCamera.target==NULL) ||(trackingCamera.target->type!=OBJ_TARGET)) { camSwitchOff(); } /* Switch to inactive mode */ trackingCamera.status = CAM_INACTIVE; Status = false; break; case CAM_INACTIVE: case CAM_TRACK_OBJECT: case CAM_TRACK_LOCATION: ASSERT(false, "Unexpected status for tracking camera"); break; } return Status; }
static void processLeaderSelection( void ) { DROID *psDroid; DROID *psPresent; DROID *psNew = NULL; UDWORD leaderClass; bool bSuccess; UDWORD dif; UDWORD bestSoFar; if (getWarCamStatus()) { /* Only do if we're tracking a droid */ if (trackingCamera.target->type != OBJ_DROID) { return; } } else { return; } /* Don't do if we're driving?! */ if (getDrivingStatus()) { return; } psPresent = (DROID*)trackingCamera.target; if (keyPressed(KEY_LEFTARROW)) { leaderClass = LEADER_LEFT; } else if (keyPressed(KEY_RIGHTARROW)) { leaderClass = LEADER_RIGHT; } else if (keyPressed(KEY_UPARROW)) { leaderClass = LEADER_UP; } else if (keyPressed(KEY_DOWNARROW)) { leaderClass = LEADER_DOWN; } else { leaderClass = LEADER_STATIC; } bSuccess = false; bestSoFar = UDWORD_MAX; switch (leaderClass) { case LEADER_LEFT: for (psDroid = apsDroidLists[selectedPlayer]; psDroid; psDroid = psDroid->psNext) { /* Is it even on the sscreen? */ if (DrawnInLastFrame(psDroid->sDisplay.frameNumber) && psDroid->selected && psDroid != psPresent) { if (psDroid->sDisplay.screenX < psPresent->sDisplay.screenX) { dif = psPresent->sDisplay.screenX - psDroid->sDisplay.screenX; if (dif < bestSoFar) { bestSoFar = dif; bSuccess = true; psNew = psDroid; } } } } break; case LEADER_RIGHT: for (psDroid = apsDroidLists[selectedPlayer]; psDroid; psDroid = psDroid->psNext) { /* Is it even on the sscreen? */ if (DrawnInLastFrame(psDroid->sDisplay.frameNumber) && psDroid->selected && psDroid != psPresent) { if (psDroid->sDisplay.screenX > psPresent->sDisplay.screenX) { dif = psDroid->sDisplay.screenX - psPresent->sDisplay.screenX; if (dif < bestSoFar) { bestSoFar = dif; bSuccess = true; psNew = psDroid; } } } } break; case LEADER_UP: for (psDroid = apsDroidLists[selectedPlayer]; psDroid; psDroid = psDroid->psNext) { /* Is it even on the sscreen? */ if (DrawnInLastFrame(psDroid->sDisplay.frameNumber) && psDroid->selected && psDroid != psPresent) { if (psDroid->sDisplay.screenY < psPresent->sDisplay.screenY) { dif = psPresent->sDisplay.screenY - psDroid->sDisplay.screenY; if (dif < bestSoFar) { bestSoFar = dif; bSuccess = true; psNew = psDroid; } } } } break; case LEADER_DOWN: for (psDroid = apsDroidLists[selectedPlayer]; psDroid; psDroid = psDroid->psNext) { /* Is it even on the sscreen? */ if (DrawnInLastFrame(psDroid->sDisplay.frameNumber) && psDroid->selected && psDroid != psPresent) { if (psDroid->sDisplay.screenY > psPresent->sDisplay.screenY) { dif = psDroid->sDisplay.screenY - psPresent->sDisplay.screenY; if (dif < bestSoFar) { bestSoFar = dif; bSuccess = true; psNew = psDroid; } } } } break; case LEADER_STATIC: break; } if (bSuccess) { camAllignWithTarget((BASE_OBJECT*)psNew); } }
// Start droid driving mode. // bool StartDriverMode(DROID *psOldDroid) { DROID *psDroid; DROID *psLastDriven; IdleTime = gameTime; psLastDriven = psDrivenDroid; psDrivenDroid = NULL; // Find a selected droid and make that the driven one. for(psDroid = apsDroidLists[selectedPlayer]; psDroid; psDroid = psDroid->psNext) { if(psDroid->selected) { if((psDrivenDroid == NULL) && (psDroid != psOldDroid)) { // The first droid found becomes the driven droid. if(!(DroidIsBuilding(psDroid) || DroidGoingToBuild(psDroid))) { // psDroid->sMove.Status = MOVEDRIVE; } psDrivenDroid = psDroid; debug( LOG_NEVER, "New driven droid\n" ); } } } // If that failed then find any droid and make it the driven one. if(psDrivenDroid == NULL) { psLastDriven = NULL; psDrivenDroid = intGotoNextDroidType(NULL,DROID_ANY,true); // If it's the same droid then try again if(psDrivenDroid == psOldDroid) { psDrivenDroid = intGotoNextDroidType(NULL,DROID_ANY,true); } if(psDrivenDroid == psOldDroid) { psDrivenDroid = NULL; } // If it failed then try for a transporter. if(psDrivenDroid == NULL) { psDrivenDroid = intGotoNextDroidType(NULL,DROID_TRANSPORTER,true); } // DBPRINTF(("Selected a new driven droid : %p\n",psDrivenDroid)); } if(psDrivenDroid) { driveDir = UNDEG(psDrivenDroid->rot.direction); driveSpeed = 0; driveBumpTime = gameTime; setDrivingStatus(true); if(DriveInterfaceEnabled) { debug( LOG_NEVER, "Interface enabled1 ! Disabling drive control\n" ); DriveControlEnabled = false; DirectControl = false; } else { DriveControlEnabled = true; DirectControl = true; // we are taking over the unit. } if(psLastDriven != psDrivenDroid) { debug( LOG_NEVER, "camAllignWithTarget\n" ); camAllignWithTarget((BASE_OBJECT*)psDrivenDroid); } return true; } else { } return false; }
/* Updates the camera position/angle along with the object movement */ BOOL processWarCam( void ) { BASE_OBJECT *foundTarget; BOOL Status = true; /* Get out if the camera isn't active */ if(trackingCamera.status == CAM_INACTIVE) { return(true); } /* Ensure that the camera only ever flips state within this routine! */ switch(trackingCamera.status) { case CAM_REQUEST: /* See if we can find the target to follow */ foundTarget = camFindTarget(); if(foundTarget && !foundTarget->died) { /* We've got one, so store away info */ camAllignWithTarget(foundTarget); /* We're now into tracking status */ trackingCamera.status = CAM_TRACKING; /* Inform via console */ if(foundTarget->type == OBJ_DROID) { if(getWarCamStatus()) { CONPRINTF(ConsoleString,(ConsoleString,"WZ/CAM - %s",droidGetName((DROID*)foundTarget))); } } else { // CONPRINTF(ConsoleString,(ConsoleString,"DROID-CAM V0.1 Enabled - Now tracking new location")); } } else { /* We've requested a track with no droid selected */ // addConsoleMessage("Droid-CAM V0.1 ERROR - No targets(s) selected",DEFAULT_JUSTIFY,SYSTEM_MESSAGE); trackingCamera.status = CAM_INACTIVE; } break; case CAM_TRACKING: /* Track the droid unless routine comes back false */ if(!camTrackCamera()) { /* Camera track came back false, either because droid died or is no longer selected, so reset to old values */ foundTarget = camFindTarget(); if(foundTarget && !foundTarget->died) { trackingCamera.status = CAM_REQUEST; } else { trackingCamera.status = CAM_RESET; } } processLeaderSelection(); break; case CAM_RESET: /* Reset camera to pre-droid tracking status */ if( (trackingCamera.target==NULL) ||(trackingCamera.target->type!=OBJ_TARGET)) { camSwitchOff(); } /* Switch to inactive mode */ trackingCamera.status = CAM_INACTIVE; // addConsoleMessage("Droid-CAM V0.1 Disabled",DEFAULT_JUSTIFY,SYSTEM_MESSAGE); Status = false; break; default: debug( LOG_FATAL, "Weirdy status for tracking Camera" ); abort(); break; } return Status; }