int GrToggleFullScreenGame (void) { static char szFullscreen [2][30] = {"toggling fullscreen mode off", "toggling fullscreen mode on"}; int i = GrToggleFullScreen (); FlushInput (); if (gameStates.app.bGameRunning) { HUDMessage (MSGC_GAME_FEEDBACK, szFullscreen [i]); StopPlayerMovement (); } return i; }
void ReadFlyingControls (CObject *objP) { fix forwardThrustTime; CObject* gmObjP; int bMulti; if (gameData.time.xFrame <= 0) return; if (gameStates.app.bPlayerIsDead || gameStates.app.bEnterGame) { StopPlayerMovement (); FlushInput (); /* VmVecZero(&objP->mType.physInfo.rotThrust); VmVecZero(&objP->mType.physInfo.thrust); VmVecZero(&objP->mType.physInfo.velocity); */ gameStates.app.bEnterGame--; return; } if ((objP->info.nType != OBJ_PLAYER) || (objP->info.nId != gameData.multiplayer.nLocalPlayer)) return; //references to CPlayerShip require that this obj be the CPlayerData tGuidedMissileInfo *gmiP = gameData.objs.guidedMissile + gameData.multiplayer.nLocalPlayer; gmObjP = gmiP->objP; if (gmObjP && (gmObjP->info.nSignature == gmiP->nSignature)) { CAngleVector vRotAngs; CFixMatrix mRot, mOrient; fix speed; //this is a horrible hack. guided missile stuff should not be //handled in the middle of a routine that is dealing with the CPlayerData objP->mType.physInfo.rotThrust.SetZero (); vRotAngs [PA] = Controls [0].pitchTime / 2 + gameStates.gameplay.seismic.nMagnitude / 64; vRotAngs [BA] = Controls [0].bankTime / 2 + gameStates.gameplay.seismic.nMagnitude / 16; vRotAngs [HA] = Controls [0].headingTime / 2 + gameStates.gameplay.seismic.nMagnitude / 64; mRot = CFixMatrix::Create (vRotAngs); mOrient = gmObjP->info.position.mOrient * mRot; gmObjP->info.position.mOrient = mOrient; speed = WI_speed (gmObjP->info.nId, gameStates.app.nDifficultyLevel); gmObjP->mType.physInfo.velocity = gmObjP->info.position.mOrient.FVec () * speed; if(IsMultiGame) MultiSendGuidedInfo (gmObjP, 0); } else { #if DBG if (Controls [0].headingTime) Controls [0].headingTime = Controls [0].headingTime; #endif objP->mType.physInfo.rotThrust = CFixVector::Create (Controls [0].pitchTime, Controls [0].headingTime, //Controls [0].headingTime ? I2X (1) / 4 : 0; //Controls [0].headingTime; Controls [0].bankTime); } forwardThrustTime = Controls [0].forwardThrustTime; if ((LOCALPLAYER.flags & PLAYER_FLAGS_AFTERBURNER) && (d_rand () < OBJECTS [gameData.multiplayer.nLocalPlayer].DriveDamage ())) { if (Controls [0].afterburnerState) { //CPlayerData has key down fix afterburner_scale; int oldCount,newCount; //add in value from 0..1 afterburner_scale = I2X (1) + min (I2X (1) / 2, gameData.physics.xAfterburnerCharge) * 2; forwardThrustTime = FixMul (gameData.time.xFrame, afterburner_scale); //based on full thrust oldCount = (gameData.physics.xAfterburnerCharge / (DROP_DELTA_TIME / AFTERBURNER_USE_SECS)); if (!gameStates.gameplay.bAfterburnerCheat) gameData.physics.xAfterburnerCharge -= gameData.time.xFrame / AFTERBURNER_USE_SECS; if (gameData.physics.xAfterburnerCharge < 0) gameData.physics.xAfterburnerCharge = 0; newCount = (gameData.physics.xAfterburnerCharge / (DROP_DELTA_TIME / AFTERBURNER_USE_SECS)); if (gameStates.app.bNostalgia && (oldCount != newCount)) gameStates.render.bDropAfterburnerBlob = 1; //drop blob (after physics called) } else { fix xChargeUp = min (gameData.time.xFrame / 8, I2X (1) - gameData.physics.xAfterburnerCharge); //recharge over 8 seconds if (xChargeUp > 0) { fix xCurEnergy = LOCALPLAYER.energy - I2X (10); xCurEnergy = max (xCurEnergy, 0) / 10; //don't drop below 10 if (xCurEnergy > 0) { //maybe limit charge up by energy xChargeUp = min (xChargeUp, xCurEnergy / 10); if (xChargeUp > 0) { gameData.physics.xAfterburnerCharge += xChargeUp; LOCALPLAYER.energy -= xChargeUp * 100 / 10; //full charge uses 10% of energy } } } } } // Set CObject's thrust vector for forward/backward objP->mType.physInfo.thrust = objP->info.position.mOrient.FVec () * forwardThrustTime; // slide left/right objP->mType.physInfo.thrust += objP->info.position.mOrient.RVec () * Controls [0].sidewaysThrustTime; // slide up/down objP->mType.physInfo.thrust += objP->info.position.mOrient.UVec () * Controls [0].verticalThrustTime; objP->mType.physInfo.thrust *= 2 * objP->DriveDamage (); if (!gameStates.input.bSkipControls) memcpy (&gameData.physics.playerThrust, &objP->mType.physInfo.thrust, sizeof (gameData.physics.playerThrust)); bMulti = IsMultiGame; if ((objP->mType.physInfo.flags & PF_WIGGLE) && !gameData.objs.speedBoost [objP->Index ()].bBoosted) { #if 1//!DBG WiggleObject (objP); #endif } // As of now, objP->mType.physInfo.thrust & objP->mType.physInfo.rotThrust are // in units of time... In other words, if thrust==gameData.time.xFrame, that // means that the user was holding down the MaxThrust key for the // whole frame. So we just scale them up by the max, and divide by // gameData.time.xFrame to make them independant of framerate // Prevent divide overflows on high frame rates. // In a signed divide, you get an overflow if num >= div<<15 fix ft = gameData.time.xFrame; // Note, you must check for ft < I2X (1)/2, else you can get an overflow on the << 15. if ((ft < I2X (1)/2) && ((ft << 15) <= gameData.pig.ship.player->maxThrust)) ft = (gameData.pig.ship.player->maxThrust >> 15) + 1; objP->mType.physInfo.thrust *= FixDiv (gameData.pig.ship.player->maxThrust, ft); if ((ft < I2X (1)/2) && ((ft << 15) <= gameData.pig.ship.player->maxRotThrust)) ft = (gameData.pig.ship.player->maxThrust >> 15) + 1; objP->mType.physInfo.rotThrust *= FixDiv (gameData.pig.ship.player->maxRotThrust, ft); }
//------------------------------------------------------------------------------ //this is for system-level keys, such as help, etc. //returns 1 if screen changed int HandleSystemKey (int key) { int bScreenChanged = 0; int bStopPlayerMovement = 1; //if (gameStates.gameplay.bSpeedBoost) // return 0; if (!gameStates.app.bPlayerIsDead) switch (key) { case KEY_ESC: if (gameData.app.bGamePaused) gameData.app.bGamePaused = 0; else { gameStates.app.bGameAborted = 1; SetFunctionMode (FMODE_MENU); } break; case KEY_SHIFTED + KEY_F1: bScreenChanged = SelectNextWindowFunction (0); break; case KEY_SHIFTED + KEY_F2: bScreenChanged = SelectNextWindowFunction (1); break; case KEY_SHIFTED + KEY_F3: gameOpts->render.cockpit.nWindowSize = (gameOpts->render.cockpit.nWindowSize + 1) % 4; bScreenChanged = 1; //SelectNextWindowFunction(1); break; case KEY_CTRLED + KEY_F3: gameOpts->render.cockpit.nWindowPos = (gameOpts->render.cockpit.nWindowPos + 1) % 6; bScreenChanged = 1; //SelectNextWindowFunction(1); break; case KEY_SHIFTED + KEY_CTRLED + KEY_F3: gameOpts->render.cockpit.nWindowZoom = (gameOpts->render.cockpit.nWindowZoom + 1) % 4; bScreenChanged = 1; //SelectNextWindowFunction(1); break; } if (!gameStates.app.bPlayerIsDead || (LOCALPLAYER.lives > 1)) { switch (key) { /* case KEY_SHIFTED + KEY_ESC: console.Show (); break; */ case KEY_COMMAND + KEY_P: case KEY_CTRLED + KEY_P: case KEY_PAUSE: DoGamePause (); break; case KEY_CTRLED + KEY_ALTED + KEY_S: if (!ToggleFreeCam ()) return 0; break; case KEY_COMMAND + KEY_SHIFTED + KEY_P: case KEY_PRINT_SCREEN: gameStates.app.bSaveScreenshot = 1; SaveScreenShot (NULL, 0); break; case KEY_F1: ShowHelp (); break; case KEY_F2: //gameStates.app.bConfigMenu = 1; break; if (!IsMultiGame) { paletteManager.SaveEffect (); paletteManager.ResetEffect (); paletteManager.LoadEffect (); } ConfigMenu (); if (!IsMultiGame) paletteManager.LoadEffect (); break; case KEY_F3: if (!GuidedInMainView ()) { SetFreeCam (0); SetChaseCam (0); cockpit->Toggle (); bScreenChanged = 1; } break; case KEY_F7 + KEY_SHIFTED: paletteManager.SaveEffect (); JoyDefsCalibrate (); paletteManager.LoadEffect (); break; case KEY_SHIFTED + KEY_MINUS: case KEY_MINUS: ShrinkWindow (); bScreenChanged = 1; break; case KEY_SHIFTED + KEY_EQUALS: case KEY_EQUALS: GrowWindow (); bScreenChanged = 1; break; case KEY_CTRLED + KEY_F5: saveGameManager.Save (0, 0, 1, 0); break; case KEY_CTRLED + KEY_F9: saveGameManager.Load (0, 0, 1, 0); break; case KEY_F5: if (gameData.demo.nState == ND_STATE_RECORDING) { NDStopRecording (); } else if (gameData.demo.nState == ND_STATE_NORMAL) if (!gameData.app.bGamePaused) //can't start demo while paused NDStartRecording (); break; case KEY_ALTED + KEY_F4: gameData.multigame.bShowReticleName = (gameData.multigame.bShowReticleName + 1) % 2; case KEY_F7: gameData.multigame.kills.bShowList = (gameData.multigame.kills.bShowList + 1) % (IsTeamGame ? 4 : 3); if (IsMultiGame) MultiSortKillList (); bStopPlayerMovement = 0; break; case KEY_CTRLED + KEY_F7: if ((gameStates.render.cockpit.bShowPingStats = !gameStates.render.cockpit.bShowPingStats)) ResetPingStats (); break; case KEY_CTRLED + KEY_F8: gameData.stats.nDisplayMode = (gameData.stats.nDisplayMode + 1) % 5; gameOpts->render.cockpit.bPlayerStats = gameData.stats.nDisplayMode != 0; break; case KEY_F8: MultiSendMsgStart (-1); bStopPlayerMovement = 0; break; case KEY_F9: case KEY_F10: case KEY_F11: case KEY_F12: MultiSendMacro (key); bStopPlayerMovement = 0; break; // send taunt macros case KEY_CTRLED + KEY_F12: gameData.trackIR.x = gameData.trackIR.y = 0; break; case KEY_ALTED + KEY_F12: if (!ToggleChaseCam ()) return 0; break; case KEY_SHIFTED + KEY_F9: case KEY_SHIFTED + KEY_F10: case KEY_SHIFTED + KEY_F11: case KEY_SHIFTED + KEY_F12: MultiDefineMacro (key); bStopPlayerMovement = 0; break; // redefine taunt macros case KEY_ALTED + KEY_F2: if (!gameStates.app.bPlayerIsDead && !(IsMultiGame && !IsCoopGame)) { paletteManager.SaveEffectAndReset (); paletteManager.SetEffect (); // get only the effect color back saveGameManager.Save (0, 0, 0, NULL); paletteManager.LoadEffect (); } break; // 0 means not between levels. case KEY_ALTED + KEY_F3: if (!gameStates.app.bPlayerIsDead && (!IsMultiGame || IsCoopGame)) { paletteManager.SaveEffectAndReset (); saveGameManager.Load (1, 0, 0, NULL); if (gameData.app.bGamePaused) DoGamePause (); } break; case KEY_F4 + KEY_SHIFTED: if (!gameStates.app.bD1Mission) DoEscortMenu (); break; case KEY_F4 + KEY_SHIFTED + KEY_ALTED: if (!gameStates.app.bD1Mission) ChangeGuidebotName (); break; case KEY_MINUS + KEY_ALTED: songManager.Prev (); break; case KEY_EQUALS + KEY_ALTED: songManager.Next (); break; //added 8/23/99 by Matt Mueller for hot key res/fullscreen changing, and menu access case KEY_CTRLED + KEY_SHIFTED + KEY_PADDIVIDE: case KEY_ALTED + KEY_CTRLED + KEY_PADDIVIDE: case KEY_ALTED + KEY_SHIFTED + KEY_PADDIVIDE: RenderOptionsMenu (); break; case KEY_CTRLED + KEY_F1: SwitchDisplayMode (-1); break; case KEY_CTRLED + KEY_F2: SwitchDisplayMode (1); break; case KEY_ALTED + KEY_ENTER: case KEY_ALTED + KEY_PADENTER: GrToggleFullScreenGame (); break; default: return bScreenChanged; } //switch (key) } if (bStopPlayerMovement) { StopPlayerMovement (); gameStates.app.bEnterGame = 2; } return bScreenChanged; }
void DeadPlayerFrame (void) { fix xTimeDead, h; CFixVector fVec; if (gameStates.app.bPlayerIsDead) { xTimeDead = gameData.time.xGame - gameStates.app.nPlayerTimeOfDeath; // If unable to create camera at time of death, create now. if (!gameData.objs.deadPlayerCamera) { CObject *playerP = OBJECTS + LOCALPLAYER.nObject; int nObject = CreateCamera (playerP); if (nObject != -1) gameData.objs.viewerP = gameData.objs.deadPlayerCamera = OBJECTS + nObject; else Int3 (); } h = DEATH_SEQUENCE_EXPLODE_TIME - xTimeDead; h = max (0, h); gameData.objs.consoleP->mType.physInfo.rotVel = CFixVector::Create(h / 4, h / 2, h / 3); xCameraToPlayerDistGoal = min (xTimeDead * 8, I2X (20)) + gameData.objs.consoleP->info.xSize; SetCameraPos (&gameData.objs.deadPlayerCamera->info.position.vPos, gameData.objs.consoleP); fVec = gameData.objs.consoleP->info.position.vPos - gameData.objs.deadPlayerCamera->info.position.vPos; gameData.objs.deadPlayerCamera->info.position.mOrient = CFixMatrix::CreateF(fVec); if (xTimeDead > DEATH_SEQUENCE_EXPLODE_TIME) { if (!gameStates.app.bPlayerExploded) { if (LOCALPLAYER.hostages.nOnBoard > 1) HUDInitMessage (TXT_SHIP_DESTROYED_2, LOCALPLAYER.hostages.nOnBoard); else if (LOCALPLAYER.hostages.nOnBoard == 1) HUDInitMessage (TXT_SHIP_DESTROYED_1); else HUDInitMessage (TXT_SHIP_DESTROYED_0); #ifdef TACTILE if (TactileStick) ClearForces (); #endif gameStates.app.bPlayerExploded = 1; if (gameData.app.nGameMode & GM_NETWORK) { AdjustMineSpawn (); MultiCapObjects (); } DropPlayerEggs (gameData.objs.consoleP); gameStates.app.bPlayerEggsDropped = 1; if (IsMultiGame) MultiSendPlayerExplode (MULTI_PLAYER_EXPLODE); gameData.objs.consoleP->ExplodeBadassPlayer (); //is this next line needed, given the badass call above? gameData.objs.consoleP->Explode (0); gameData.objs.consoleP->info.nFlags &= ~OF_SHOULD_BE_DEAD; //don't really kill CPlayerData gameData.objs.consoleP->info.renderType = RT_NONE; //..just make him disappear gameData.objs.consoleP->SetType (OBJ_GHOST); //..and kill intersections LOCALPLAYER.flags &= ~PLAYER_FLAGS_HEADLIGHT_ON; #if 0 if (gameOpts->gameplay.bFastRespawn) gameStates.app.bDeathSequenceAborted = 1; #endif } } else { if (d_rand () < gameData.time.xFrame * 4) { if (gameData.app.nGameMode & GM_MULTI) MultiSendCreateExplosion (gameData.multiplayer.nLocalPlayer); CreateSmallFireballOnObject (gameData.objs.consoleP, I2X (1), 1); } } if (gameStates.app.bDeathSequenceAborted) { //xTimeDead > DEATH_SEQUENCE_LENGTH) { StopPlayerMovement (); gameStates.app.bEnterGame = 2; if (!gameStates.app.bPlayerEggsDropped) { if (gameData.app.nGameMode & GM_NETWORK) { AdjustMineSpawn (); MultiCapObjects (); } DropPlayerEggs (gameData.objs.consoleP); gameStates.app.bPlayerEggsDropped = 1; if (gameData.app.nGameMode & GM_MULTI) MultiSendPlayerExplode (MULTI_PLAYER_EXPLODE); } DoPlayerDead (); //kill_playerP (); } } }