void CObject::HandleSpecialSegment (void) { if ((info.nType == OBJ_PLAYER) && (gameData.multiplayer.nLocalPlayer == info.nId)) { CSegment* segP = SEGMENTS + info.nSegment; CPlayerData* playerP = gameData.multiplayer.players + gameData.multiplayer.nLocalPlayer; fix shields, fuel; if (gameData.app.nGameMode & GM_CAPTURE) segP->CheckForGoal (); else if (gameData.app.nGameMode & GM_HOARD) segP->CheckForHoardGoal (); else if (Controls [0].forwardThrustTime || Controls [0].verticalThrustTime || Controls [0].sidewaysThrustTime) { gameStates.entropy.nTimeLastMoved = -1; if ((gameData.app.nGameMode & GM_ENTROPY) && ((segP->m_owner < 0) || (segP->m_owner == GetTeam (gameData.multiplayer.nLocalPlayer) + 1))) { StopConquerWarning (); } } else if (gameStates.entropy.nTimeLastMoved < 0) gameStates.entropy.nTimeLastMoved = 0; shields = segP->Damage (playerP->shields + 1); if (shields > 0) { playerP->shields -= shields; MultiSendShields (); if (playerP->shields < 0) StartPlayerDeathSequence (this); else segP->ConquerCheck (); } else { StopConquerWarning (); fuel = segP->Refuel (INITIAL_ENERGY - playerP->energy); if (fuel > 0) playerP->energy += fuel; shields = segP->Repair (INITIAL_SHIELDS - playerP->shields); if (shields > 0) { playerP->shields += shields; MultiSendShields (); } if (!segP->m_owner) segP->ConquerCheck (); } } }
int CSegment::ConquerCheck (void) { CPlayerData *playerP = gameData.multiplayer.players + gameData.multiplayer.nLocalPlayer; int team = GetTeam (gameData.multiplayer.nLocalPlayer) + 1; time_t t; gameStates.entropy.bConquering = 0; if (!(gameData.app.nGameMode & GM_ENTROPY)) return 0; #if 0 if (gameStates.entropy.nTimeLastMoved < 0) { HUDMessage (0, "you are moving"); StopConquerWarning (); return 0; } if (playerP->shields < 0) { HUDMessage (0, "you are dead"); StopConquerWarning (); return 0; } if (playerP->secondaryAmmo [PROXMINE_INDEX] < extraGameInfo [1].nCaptureVirusLimit) { HUDMessage (0, "too few viruses"); StopConquerWarning (); return 0; } if (m_owner < 0) { HUDMessage (0, "neutral room"); StopConquerWarning (); return 0; } if (m_owner == team) { HUDMessage (0, "own room"); StopConquerWarning (); return 0; } #else if ((gameStates.entropy.nTimeLastMoved < 0) || (playerP->shields < 0) || (playerP->secondaryAmmo [PROXMINE_INDEX] < extraGameInfo [1].entropy.nCaptureVirusLimit) || (m_owner < 0) || (m_owner == team)) { StopConquerWarning (); return 0; } #endif t = SDL_GetTicks (); if (!gameStates.entropy.nTimeLastMoved) gameStates.entropy.nTimeLastMoved = (int) t; if (t - gameStates.entropy.nTimeLastMoved < extraGameInfo [1].entropy.nCaptureTimeLimit * 1000) { gameStates.entropy.bConquering = 1; if (m_owner > 0) StartConquerWarning (); return 0; } StopConquerWarning (); if (m_owner) MultiSendCaptureBonus ((char) gameData.multiplayer.nLocalPlayer); playerP->secondaryAmmo [PROXMINE_INDEX] -= extraGameInfo [1].entropy.nCaptureVirusLimit; if (playerP->secondaryAmmo [SMARTMINE_INDEX] > extraGameInfo [1].entropy.nBashVirusCapacity) playerP->secondaryAmmo [SMARTMINE_INDEX] -= extraGameInfo [1].entropy.nBashVirusCapacity; else playerP->secondaryAmmo [SMARTMINE_INDEX] = 0; MultiSendConquerRoom (char (team), char (m_owner), char (m_group)); ConquerRoom (char (team), char (m_owner), char (m_group)); return 1; }
void StartPlayerDeathSequence (CObject *playerP) { int nObject; Assert (playerP == gameData.objs.consoleP); gameData.objs.speedBoost [OBJ_IDX (gameData.objs.consoleP)].bBoosted = 0; if (gameStates.app.bPlayerIsDead) return; if (gameData.objs.deadPlayerCamera) { ReleaseObject (OBJ_IDX (gameData.objs.deadPlayerCamera)); gameData.objs.deadPlayerCamera = NULL; } StopConquerWarning (); //Assert (gameStates.app.bPlayerIsDead == 0); //Assert (gameData.objs.deadPlayerCamera == NULL); ResetRearView (); if (!(gameData.app.nGameMode & GM_MULTI)) HUDClearMessages (); nKilledInFrame = gameData.app.nFrameCount; nKilledObjNum = OBJ_IDX (playerP); gameStates.app.bDeathSequenceAborted = 0; if (gameData.app.nGameMode & GM_MULTI) { MultiSendKill (LOCALPLAYER.nObject); // If Hoard, increase number of orbs by 1 // Only if you haven't killed yourself // This prevents cheating if (gameData.app.nGameMode & GM_HOARD) if (!bMultiSuicide) if (LOCALPLAYER.secondaryAmmo [PROXMINE_INDEX]<12) LOCALPLAYER.secondaryAmmo [PROXMINE_INDEX]++; } paletteManager.SetRedEffect (40); gameStates.app.bPlayerIsDead = 1; #ifdef TACTILE if (TactileStick) Buffeting (70); #endif //LOCALPLAYER.flags &= ~ (PLAYER_FLAGS_AFTERBURNER); playerP->mType.physInfo.rotThrust.SetZero (); playerP->mType.physInfo.thrust.SetZero (); gameStates.app.nPlayerTimeOfDeath = gameData.time.xGame; nObject = CreateCamera (playerP); viewerSaveP = gameData.objs.viewerP; if (nObject != -1) gameData.objs.viewerP = gameData.objs.deadPlayerCamera = OBJECTS + nObject; else { Int3 (); gameData.objs.deadPlayerCamera = NULL; } CGenericCockpit::Save (true); cockpit->Activate (CM_LETTERBOX); if (gameData.demo.nState == ND_STATE_RECORDING) NDRecordLetterbox (); nPlayerFlagsSave = playerP->info.nFlags; nControlTypeSave = playerP->info.controlType; nRenderTypeSave = playerP->info.renderType; playerP->info.nFlags &= ~OF_SHOULD_BE_DEAD; // LOCALPLAYER.flags |= PLAYER_FLAGS_INVULNERABLE; playerP->info.controlType = CT_NONE; if (!gameStates.entropy.bExitSequence) { playerP->info.xShields = I2X (1000); MultiSendShields (); } paletteManager.SetEffect (0, 0, 0); }