int ToggleChaseCam (void) { #if !DBG if (IsMultiGame && !IsCoopGame && (!EGI_FLAG (bEnableCheats, 0, 0, 0) || COMPETITION)) { HUDMessage (0, "Chase camera is not available"); return 0; } #endif return SetChaseCam (!gameStates.render.bChaseCam); }
int ToggleFreeCam (void) { #if !DBG if ((IsMultiGame && !(IsCoopGame || EGI_FLAG (bEnableCheats, 0, 0, 0)))) { HUDMessage (0, "Free camera is not available"); return 0; } #endif return SetFreeCam (!gameStates.render.bFreeCam); }
int LoadThruster (int nStyle) { static char szThruster [2][13] = {"thrust3d.tga", "thrust2d.tga"}; if (nStyle < 0) nStyle = EGI_FLAG (bThrusterFlames, 1, 1, 0); int b3D = (nStyle == 2); char *pszTex = szThruster [nStyle == 1]; return LoadAddonBitmap (&bmpThruster [b3D], pszTex, bHaveThruster + b3D); }
void CObject::CheckAfterburnerBlobDrop (void) { if (gameStates.render.bDropAfterburnerBlob) { Assert (this == gameData.objs.consoleP); DropAfterburnerBlobs (this, 2, I2X (5) / 2, -1, NULL, 0); // -1 means use default lifetime if (IsMultiGame) MultiSendDropBlobs ((char) gameData.multiplayer.nLocalPlayer); gameStates.render.bDropAfterburnerBlob = 0; } if ((info.nType == OBJ_WEAPON) && (gameData.weapons.info [info.nId].nAfterburnerSize)) { int nObject, bSmoke; fix vel; fix delay, lifetime, nSize; #if 1 if ((info.nType == OBJ_WEAPON) && gameData.objs.bIsMissile [info.nId]) { if (SHOW_SMOKE && gameOpts->render.particles.bMissiles) return; if ((gameStates.app.bNostalgia || EGI_FLAG (bThrusterFlames, 1, 1, 0)) && (info.nId != MERCURYMSL_ID)) return; } #endif if ((vel = mType.physInfo.velocity.Mag()) > I2X (200)) delay = I2X (1) / 16; else if (vel > I2X (40)) delay = FixDiv (I2X (13), vel); else delay = DEG90; if ((bSmoke = SHOW_SMOKE && gameOpts->render.particles.bMissiles)) { nSize = I2X (3); lifetime = I2X (1) / 12; delay = 0; } else { nSize = I2X (gameData.weapons.info [info.nId].nAfterburnerSize) / 16; lifetime = 3 * delay / 2; if (!IsMultiGame) { delay /= 2; lifetime *= 2; } } nObject = OBJ_IDX (this); if (bSmoke || (gameData.objs.xLastAfterburnerTime [nObject] + delay < gameData.time.xGame) || (gameData.objs.xLastAfterburnerTime [nObject] > gameData.time.xGame)) { DropAfterburnerBlobs (this, 1, nSize, lifetime, NULL, bSmoke); gameData.objs.xLastAfterburnerTime [nObject] = gameData.time.xGame; } } }
int ControlsLimitTurnRate (int bUseMouse) { if (!(gameOpts->input.bLimitTurnRate || IsMultiGame)) return 0; if (gameStates.render.automap.bDisplay || gameOpts->input.mouse.bJoystick || gameStates.app.bNostalgia || COMPETITION || !(bUseMouse && EGI_FLAG (bMouseLook, 0, 1, 0))) { KCCLAMP (Controls [0].pitchTime, nMaxTurnRate / FASTPITCH); KCCLAMP (Controls [0].headingTime, nMaxTurnRate); } KCCLAMP (Controls [0].bankTime, gameStates.input.kcFrameTime); return 1; }
void CObject::RotateMarker (void) { if (EGI_FLAG (bRotateMarkers, 0, 1, 0) && gameStates.app.tick40fps.bTick) { static time_t t0 = 0; time_t t = (gameStates.app.nSDLTicks - t0) % 1000; t0 = gameStates.app.nSDLTicks; if (t) { CAngleVector a = CAngleVector::Create (0, 0, (fixang) ((float) (I2X (1) / 512) * t / 25.0f)); CFixMatrix mRotate = CFixMatrix::Create (a); CFixMatrix mOrient = mRotate * info.position.mOrient; info.position.mOrient = mOrient; info.position.mOrient.CheckAndFix (); } } }
int CCamera::Ready (time_t t) { m_info.nWaitFrames++; if (!m_info.bVisible) return 0; if (m_info.bTeleport && !EGI_FLAG (bTeleporterCams, 0, 1, 0)) return 0; if (m_info.objP && (m_info.objP->info.nFlags & (OF_EXPLODING | OF_SHOULD_BE_DEAD | OF_DESTROYED))) return 0; if (gameOpts->render.cameras.nFPS && !m_info.bTimedOut) { if (t - m_info.nTimeout < 1000 / gameOpts->render.cameras.nFPS) return 0; m_info.bTimedOut = 1; } return m_info.nWaitFrames; }
CObject *CreateLighting (CObject *parentObjP) { short nObject; CObject *objP; if (!EGI_FLAG (bUseLightning, 0, 0, 1)) return NULL; nObject = CreateFireball (0, parentObjP->info.nSegment, parentObjP->info.position.vPos, 2 * parentObjP->info.xSize, RT_LIGHTNING); if (nObject < 0) return NULL; objP = OBJECTS + nObject; objP->info.xLifeLeft = IMMORTAL_TIME; objP->cType.explInfo.nSpawnTime = -1; objP->cType.explInfo.nDeleteObj = -1; objP->cType.explInfo.nDeleteTime = -1; objP->info.xSize = 1; return objP; }
void ToggleBomb (void) { int bomb = bLastSecondaryWasSuper [PROXMINE_INDEX] ? PROXMINE_INDEX : SMARTMINE_INDEX; if ((gameData.app.nGameMode & (GM_HOARD | GM_ENTROPY)) || !(LOCALPLAYER.secondaryAmmo [PROXMINE_INDEX] || LOCALPLAYER.secondaryAmmo [SMARTMINE_INDEX])) { DigiPlaySampleOnce (SOUND_BAD_SELECTION, F1_0); HUDInitMessage (TXT_NOBOMBS); } else if (!LOCALPLAYER.secondaryAmmo [bomb]) { DigiPlaySampleOnce (SOUND_BAD_SELECTION, F1_0); HUDInitMessage (TXT_NOBOMB_ANY, (bomb == SMARTMINE_INDEX)? TXT_SMART_MINES : !COMPETITION && EGI_FLAG (bSmokeGrenades, 0, 0, 0) ? TXT_SMOKE_GRENADES : TXT_PROX_BOMBS); } else { bLastSecondaryWasSuper [PROXMINE_INDEX] = !bLastSecondaryWasSuper [PROXMINE_INDEX]; DigiPlaySampleOnce (SOUND_GOOD_SELECTION_SECONDARY, F1_0); } }
tObject *CreateLighting (tObject *parentObjP) { short nObject; tObject *objP; if (!EGI_FLAG (bUseLightnings, 0, 0, 1)) return NULL; nObject = CreateObject (OBJ_FIREBALL, 0, -1, parentObjP->nSegment, &parentObjP->position.vPos, &vmdIdentityMatrix, 2 * parentObjP->size, CT_EXPLOSION, MT_NONE, RT_LIGHTNING, 1); if (nObject < 0) return NULL; objP = OBJECTS + nObject; objP->lifeleft = IMMORTAL_TIME; objP->cType.explInfo.nSpawnTime = -1; objP->cType.explInfo.nDeleteObj = -1; objP->cType.explInfo.nDeleteTime = -1; objP->size = 1; return objP; }
void UpdateFiringState (void) { int bGatling = (gameData.weapons.nPrimary == VULCAN_INDEX) || (gameData.weapons.nPrimary == GAUSS_INDEX); if ((Controls [0].firePrimaryState != 0) || (Controls [0].firePrimaryDownCount != 0)) { if (gameData.weapons.firing [0].nStart <= 0) { gameData.weapons.firing [0].nStart = gameStates.app.nSDLTicks; if (bGatling) { if (EGI_FLAG (bGatlingSpeedUp, 1, 0, 0)) gameData.weapons.firing [0].bSound = 1; else { gameData.weapons.firing [0].nStart -= GATLING_DELAY + 1; gameData.weapons.firing [0].bSound = 0; } } } gameData.weapons.firing [0].nDuration = gameStates.app.nSDLTicks - gameData.weapons.firing [0].nStart; gameData.weapons.firing [0].nStop = 0; } else if (gameData.weapons.firing [0].nDuration) { gameData.weapons.firing [0].nStop = gameStates.app.nSDLTicks; gameData.weapons.firing [0].nDuration = gameData.weapons.firing [0].nStart = 0; } else if (gameData.weapons.firing [0].nStop > 0) { if (gameStates.app.nSDLTicks - gameData.weapons.firing [0].nStop >= GATLING_DELAY /*WIFireTicks (gameData.weapons.nPrimary) * 4 / 5*/) { gameData.weapons.firing [0].nStop = 0; } } if ((Controls [0].fireSecondaryState != 0) || (Controls [0].fireSecondaryDownCount != 0)) { if (gameData.weapons.firing [1].nStart <= 0) gameData.weapons.firing [1].nStart = gameStates.app.nSDLTicks; gameData.weapons.firing [1].nDuration = gameStates.app.nSDLTicks - gameData.weapons.firing [1].nStart; gameData.weapons.firing [1].nStop = 0; } else if (gameData.weapons.firing [1].nDuration) { gameData.weapons.firing [1].nStop = gameStates.app.nSDLTicks; gameData.weapons.firing [1].nDuration = gameData.weapons.firing [1].nStart = 0; } }
int SetupMonitorFace (short nSegment, short nSide, short nCamera, CSegFace *faceP) { CCamera *cameraP = cameraManager.Camera (nCamera); int bHaveMonitorBg, bIsTeleCam = cameraP->GetTeleport (); #if !DBG int i; #endif #if RENDER2TEXTURE int bCamBufAvail = cameraP->HaveBuffer (1) == 1; #else int bCamBufAvail = 0; #endif if (!gameStates.render.bDoCameras) return 0; bHaveMonitorBg = cameraP->Valid () && /*!cameraP->bShadowMap &&*/ (cameraP->Texture ().Texture () || bCamBufAvail) && (!bIsTeleCam || EGI_FLAG (bTeleporterCams, 0, 1, 0)); if (bHaveMonitorBg) { cameraP->GetUVL (faceP, NULL, FACES.texCoord + faceP->nIndex, FACES.vertices + faceP->nIndex); if (bIsTeleCam) { #if DBG faceP->bmBot = &cameraP->Texture (); gameStates.render.grAlpha = 1.0f; #else faceP->bmTop = &cameraP->Texture (); for (i = 0; i < 4; i++) gameData.render.color.vertices [faceP->index [i]].color.alpha = 0.7f; #endif } else if (/*gameOpts->render.cameras.bFitToWall ||*/ (faceP->nOvlTex == 0) || !faceP->bmBot) faceP->bmBot = &cameraP->Texture (); else faceP->bmTop = &cameraP->Texture (); faceP->pTexCoord = cameraP->TexCoord (); } faceP->bTeleport = bIsTeleCam; cameraP->SetVisible (1); return bHaveMonitorBg || gameOpts->render.cameras.bFitToWall; }
void RenderFastShadows (fix nEyeOffset, int nWindow, short nStartSeg) { #if 0//OOF_TEST_CUBE # if 1 for (bShadowTest = 1; bShadowTest >= 0; bShadowTest--) # else for (bShadowTest = 0; bShadowTest < 2; bShadowTest++) # endif #endif { gameStates.render.nShadowPass = 2; OglStartFrame (0, 0); gameData.render.shadows.nFrame = !gameData.render.shadows.nFrame; //RenderObjectShadows (); RenderMine (nStartSeg, nEyeOffset, nWindow); } #if DBG if (!bShadowTest) #endif { gameStates.render.nShadowPass = 3; OglStartFrame (0, 0); if (gameStates.render.bShadowMaps) { #if DBG if (gameStates.render.bExternalView) #else if (gameStates.render.bExternalView && (!IsMultiGame || IsCoopGame || EGI_FLAG (bEnableCheats, 0, 0, 0))) #endif G3SetViewMatrix(gameData.render.mine.viewerEye, externalView.pPos ? externalView.pPos->mOrient : gameData.objs.viewerP->info.position.mOrient, gameStates.render.xZoom, 1); else G3SetViewMatrix(gameData.render.mine.viewerEye, gameData.objs.viewerP->info.position.mOrient, FixDiv (gameStates.render.xZoom, gameStates.render.nZoomFactor), 1); ApplyShadowMaps (nStartSeg, nEyeOffset, nWindow); } else { RenderShadowQuad (0); } } }
void HUDShowIcons (void) { if (gameStates.app.bNostalgia) return; if (gameStates.app.bEndLevelSequence) return; HUDToggleWeaponIcons (); if (gameOpts->render.cockpit.bHUD || SHOW_COCKPIT) { HUDShowPlayerStats (); HUDShowObjTally (); if (!gameStates.app.bDemoData && EGI_FLAG (nWeaponIcons, 0, 1, 0)) { cmScaleX *= HUD_ASPECT; HUDShowWeaponIcons (); if (gameOpts->render.weaponIcons.bEquipment) { if (bHaveInvBms < 0) LoadInventoryIcons (); if (bHaveInvBms > 0) HUDShowInventoryIcons (); } cmScaleX /= HUD_ASPECT; } } }
int RenderObject (CObject *objP, int nWindow, int bForce) { short nObject = objP->Index (); int bSpectate = 0, bDepthSort = RENDERPATH || (gameOpts->render.bDepthSort > 0); int nType = objP->info.nType; if (nType == 255) { objP->Die (); return 0; } int bEmissive = (objP->info.nType == OBJ_WEAPON) && gameData.objs.bIsWeapon [objP->info.nId] && !gameData.objs.bIsMissile [objP->info.nId]; if (bEmissive && gameStates.render.bQueryCoronas) return 0; if ((gameStates.render.nShadowPass != 2) && (objP == gameData.objs.guidedMissile [gameData.multiplayer.nLocalPlayer].objP) && (objP->info.nSignature == gameData.objs.guidedMissile [gameData.multiplayer.nLocalPlayer].nSignature)) { return 0; } #if DBG if (nObject == nDbgObj) nDbgObj = nDbgObj; #endif if (nObject != LOCALPLAYER.nObject) { if (objP == gameData.objs.viewerP) return 0; } else if ((gameData.objs.viewerP == gameData.objs.consoleP) && !automap.m_bDisplay) { if ((bSpectate = (gameStates.render.bFreeCam && !nWindow))) ; #if DBG else if ((gameStates.render.nShadowPass != 2) && !gameStates.app.bPlayerIsDead && (nWindow || (!gameStates.render.bChaseCam && (gameStates.app.bEndLevelSequence < EL_LOOKBACK)))) { //don't render ship model if neither external view nor main view #else else if ((gameStates.render.nShadowPass != 2) && !gameStates.app.bPlayerIsDead && (nWindow || ((IsMultiGame && !IsCoopGame && !EGI_FLAG (bEnableCheats, 0, 0, 0)) || (!gameStates.render.bChaseCam && (gameStates.app.bEndLevelSequence < EL_LOOKBACK))))) { #endif #if 0 if (gameOpts->render.particles.bPlayers) { SEM_ENTER (SEM_SMOKE) DoPlayerSmoke (objP, -1); SEM_LEAVE (SEM_SMOKE) } #endif return 0; } } if ((nType == OBJ_NONE)/* || (nType==OBJ_CAMBOT)*/){ #if TRACE console.printf (1, "ERROR!!!Bogus obj %d in seg %d is rendering!\n", nObject, objP->info.nSegment); #endif return 0; } int mldSave = gameStates.render.detail.nMaxLinearDepth; gameStates.render.nState = 1; gameData.objs.color.index = 0; gameStates.render.detail.nMaxLinearDepth = gameStates.render.detail.nMaxLinearDepthObjects; switch (objP->info.renderType) { case RT_NONE: if (gameStates.render.nType != 1) return 0; break; case RT_POLYOBJ: if (nType == OBJ_EFFECT) { objP->info.renderType = (objP->info.nId == SMOKE_ID) ? RT_SMOKE : RT_LIGHTNING; return 0; } if (gameStates.render.nType != 1) return 0; if (nType == OBJ_PLAYER) { if (!RenderPlayerModel (objP, bDepthSort, bSpectate)) return 0; } else if (nType == OBJ_ROBOT) { if (!RenderRobotModel (objP, bDepthSort, bSpectate)) return 0; } else if (nType == OBJ_WEAPON) { if (!RenderWeaponModel (objP, bDepthSort, bSpectate)) return 0; } else if (nType == OBJ_REACTOR) { if (!RenderReactorModel (objP, bDepthSort, bSpectate)) return 0; } else if (nType == OBJ_POWERUP) { if (!RenderPowerupModel (objP, bDepthSort, bSpectate)) return 0; } else if (nType == OBJ_HOSTAGE) { if (!RenderHostageModel (objP, bDepthSort, bSpectate)) return 0; } else { if (!RenderPolyModel (objP, bDepthSort, bSpectate)) return 0; } break; case RT_MORPH: if (gameStates.render.nType != 1) return 0; if (gameStates.render.nShadowPass != 2) objP->MorphDraw (); break; case RT_THRUSTER: if (gameStates.render.bQueryCoronas || (gameStates.render.nType != 1)) return 0; if (nWindow && (objP->mType.physInfo.flags & PF_WIGGLE)) break; case RT_FIREBALL: if (!RenderFireball (objP, bForce)) return 0; break; case RT_EXPLBLAST: if (!RenderExplBlast (objP, bForce)) return 0; break; case RT_SHRAPNELS: if (!RenderShrapnel (objP, bForce)) return 0; break; case RT_WEAPON_VCLIP: if (!RenderWeapon (objP, bForce)) return 0; break; case RT_HOSTAGE: if (!RenderHostage (objP, bDepthSort, bForce)) return 0; break; case RT_POWERUP: if (!RenderPowerup (objP, bDepthSort, bForce)) return 0; break; case RT_LASER: if (!RenderLaser (objP, bForce)) return 0; break; case RT_SMOKE: case RT_LIGHTNING: break; default: PrintLog ("Unknown renderType <%d>\n", objP->info.renderType); } #ifdef NEWDEMO if (objP->info.renderType != RT_NONE) if (gameData.demo.nState == ND_STATE_RECORDING) { if (!gameData.demo.bWasRecorded [nObject]) { NDRecordRenderObject (objP); gameData.demo.bWasRecorded [nObject] = 1; } } #endif gameStates.render.detail.nMaxLinearDepth = mldSave; gameData.render.nTotalObjects++; ogl.ClearError (0); return 1; }
// --------------------------------------------------------------------- //called when one of these weapons is picked up //when you pick up a secondary, you always get the weapon & ammo for it // Returns true if powerup picked up, else returns false. int PickupSecondary (tObject *objP, int nWeaponIndex, int nAmount, int nPlayer) { int nMaxAmount; int nPickedUp; int nCutPoint, bEmpty = 0, bSmokeGrens; tPlayer *playerP = gameData.multiplayer.players + nPlayer; if ((nWeaponIndex == PROXMINE_INDEX) && !COMPETITION && EGI_FLAG (bSmokeGrenades, 0, 0, 0)) { bSmokeGrens = 1; nMaxAmount = 4; } else { bSmokeGrens = 0; nMaxAmount = nMaxSecondaryAmmo [nWeaponIndex]; if (playerP->flags & PLAYER_FLAGS_AMMO_RACK) nMaxAmount *= 2; } if (playerP->secondaryAmmo [nWeaponIndex] >= nMaxAmount) { if (ISLOCALPLAYER (nPlayer)) HUDInitMessage("%s %i %ss!", TXT_ALREADY_HAVE, playerP->secondaryAmmo [nWeaponIndex], bSmokeGrens ? TXT_SMOKE_GRENADE : SECONDARY_WEAPON_NAMES (nWeaponIndex)); return 0; } playerP->secondaryWeaponFlags |= (1 << nWeaponIndex); playerP->secondaryAmmo [nWeaponIndex] += nAmount; nPickedUp = nAmount; if (playerP->secondaryAmmo [nWeaponIndex] > nMaxAmount) { nPickedUp = nAmount - (playerP->secondaryAmmo [nWeaponIndex] - nMaxAmount); playerP->secondaryAmmo [nWeaponIndex] = nMaxAmount; if ((nPickedUp < nAmount) && (nWeaponIndex != PROXMINE_INDEX) && (nWeaponIndex != SMARTMINE_INDEX)) { short nObject = OBJ_IDX (objP); gameData.multiplayer.leftoverPowerups [nObject].nCount = nAmount - nPickedUp; gameData.multiplayer.leftoverPowerups [nObject].nType = secondaryWeaponToPowerup [nWeaponIndex]; gameData.multiplayer.leftoverPowerups [nObject].spitterP = OBJECTS + playerP->nObject; } } if (ISLOCALPLAYER (nPlayer)) { nCutPoint = SOrderList (255); bEmpty = playerP->secondaryAmmo [gameData.weapons.nSecondary] == 0; if (gameOpts->gameplay.nAutoSelectWeapon) { if (gameOpts->gameplay.nAutoSelectWeapon == 1) { if (bEmpty) SelectWeapon (nWeaponIndex, 1, 0, 1); } else if ((SOrderList (nWeaponIndex) < nCutPoint) && (bEmpty || (SOrderList (nWeaponIndex) < SOrderList (gameData.weapons.nSecondary)))) SelectWeapon (nWeaponIndex,1, 0, 1); else { //if we don't auto-select this weapon, but it's a proxbomb or smart mine, //we want to do a mini-auto-selection that applies to the drop bomb key if ((nWeaponIndex == PROXMINE_INDEX || nWeaponIndex == SMARTMINE_INDEX) && !(gameData.weapons.nSecondary == PROXMINE_INDEX || gameData.weapons.nSecondary == SMARTMINE_INDEX)) { int cur = bLastSecondaryWasSuper [PROXMINE_INDEX] ? PROXMINE_INDEX : SMARTMINE_INDEX; if (SOrderList (nWeaponIndex) < SOrderList (cur)) bLastSecondaryWasSuper[PROXMINE_INDEX] = (nWeaponIndex == SMARTMINE_INDEX); } } } //note: flash for all but concussion was 7,14,21 if (nAmount>1) { PALETTE_FLASH_ADD (15,15,15); HUDInitMessage("%d %s%s", nPickedUp, bSmokeGrens ? TXT_SMOKE_GRENADES : SECONDARY_WEAPON_NAMES (nWeaponIndex), TXT_SX); } else { PALETTE_FLASH_ADD (10,10,10); HUDInitMessage("%s!", bSmokeGrens ? TXT_SMOKE_GRENADE : SECONDARY_WEAPON_NAMES (nWeaponIndex)); } } return 1; }
void DoPlayerSmoke (tObject *objP, int i) { int h, j, d, nParts, nType; float nScale; tCloud *pCloud; vmsVector fn, mn, vDir, *vDirP; tThrusterInfo ti; static int bForward = 1; if (i < 0) i = objP->info.nId; if ((gameData.multiplayer.players [i].flags & PLAYER_FLAGS_CLOAKED) || (gameStates.render.automap.bDisplay && IsMultiGame && !AM_SHOW_PLAYERS)) { KillObjectSmoke (i); return; } j = OBJ_IDX (objP); if (gameOpts->render.smoke.bDecreaseLag && (i == gameData.multiplayer.nLocalPlayer)) { fn = objP->info.position.mOrient[FVEC]; mn = objP->info.position.vPos - objP->info.vLastPos; vmsVector::Normalize(fn); vmsVector::Normalize(mn); d = vmsVector::Dot(fn, mn); if (d >= -F1_0 / 2) bForward = 1; else { if (bForward) { if ((h = gameData.smoke.objects [j]) >= 0) { KillObjectSmoke (j); DestroySmoke (h); } bForward = 0; nScale = 0; return; } } } #if 0 if (EGI_FLAG (bThrusterFlames, 1, 1, 0)) { if ((a <= F1_0 / 4) && (a || !gameStates.input.bControlsSkipFrame)) //no thruster flames if moving backward DropAfterburnerBlobs (objP, 2, I2X (1), -1, gameData.objs.consoleP, 1); //F1_0 / 4); } #endif if ((gameData.app.nGameMode & GM_NETWORK) && !gameData.multiplayer.players [i].connected) nParts = 0; else if (objP->info.nFlags & (OF_SHOULD_BE_DEAD | OF_DESTROYED)) nParts = 0; else if ((i == gameData.multiplayer.nLocalPlayer) && (gameStates.app.bPlayerIsDead || (gameData.multiplayer.players [i].shields < 0))) nParts = 0; else { h = X2IR (gameData.multiplayer.players [i].shields); nParts = 10 - h / 5; nScale = X2F (objP->info.xSize); if (h <= 25) nScale /= 1.5; else if (h <= 50) nScale /= 2; else nScale /= 3; if (nParts <= 0) { nType = 2; //nParts = (gameStates.entropy.nTimeLastMoved < 0) ? 250 : 125; } else { CreateDamageExplosion (nParts, j); nType = (h > 25); nParts *= 25; nParts += 75; } nParts = objP->mType.physInfo.thrust.IsZero() ? SHIP_MAX_PARTS : SHIP_MAX_PARTS / 2; if (SHOW_SMOKE && nParts && gameOpts->render.smoke.bPlayers) { if (gameOpts->render.smoke.bSyncSizes) { nParts = -MAX_PARTICLES (nParts, gameOpts->render.smoke.nDens [0]); nScale = PARTICLE_SIZE (gameOpts->render.smoke.nSize [0], nScale); } else { nParts = -MAX_PARTICLES (nParts, gameOpts->render.smoke.nDens [1]); nScale = PARTICLE_SIZE (gameOpts->render.smoke.nSize [1], nScale); } if (!objP->mType.physInfo.thrust.IsZero ()) vDirP = NULL; else { // if the ship is standing still, let the thruster smoke move away from it nParts /= 2; nScale /= 2; vDir = OBJPOS (objP)->mOrient [FVEC] * (F1_0 / 8); vDir = -vDir; vDirP = &vDir; } if (0 > (h = gameData.smoke.objects [j])) { //PrintLog ("creating tPlayer smoke\n"); h = SetSmokeObject (j, CreateSmoke (&objP->info.position.vPos, vDirP, NULL, objP->info.nSegment, 2, nParts, nScale, gameOpts->render.smoke.nSize [1], 2, PLR_PART_LIFE / (nType + 1) * (vDirP ? 2 : 1), PLR_PART_SPEED, SMOKE_PARTICLES, j, smokeColors + nType, 1, -1)); } else { if (vDirP) SetSmokeDir (h, vDirP); SetSmokeLife (h, PLR_PART_LIFE / (nType + 1) * (vDirP ? 2 : 1)); SetSmokeType (h, SMOKE_PARTICLES); SetSmokePartScale (h, -nScale); SetSmokeDensity (h, nParts, gameOpts->render.smoke.bSyncSizes ? -1 : gameOpts->render.smoke.nSize [1]); SetSmokeSpeed (gameData.smoke.objects [i], objP->mType.physInfo.thrust.IsZero () ? PLR_PART_SPEED * 2 : PLR_PART_SPEED); } CalcThrusterPos (objP, &ti, 0); for (j = 0; j < 2; j++) if ((pCloud = GetCloud (h, j))) SetCloudPos (pCloud, ti.vPos + j, NULL, objP->info.nSegment); DoGatlingSmoke (objP); return; } } KillObjectSmoke (i); KillGatlingSmoke (objP); }
//------------------------------------------------------------------------------ //switch a cockpit window to the next function int SelectNextWindowFunction(int nWindow) { Assert(nWindow==0 || nWindow==1); switch (gameStates.render.cockpit.n3DView [nWindow]) { case CV_NONE: gameStates.render.cockpit.n3DView [nWindow] = CV_REAR; break; case CV_REAR: if (!(gameStates.app.bNostalgia || COMPETITION) && EGI_FLAG (bRadarEnabled, 0, 1, 0) && (!(gameData.app.nGameMode & GM_MULTI) || (netGame.gameFlags & NETGAME_FLAG_SHOW_MAP))) { gameStates.render.cockpit.n3DView [nWindow] = CV_RADAR_TOPDOWN; break; } case CV_RADAR_TOPDOWN: if (!(gameStates.app.bNostalgia || COMPETITION) && EGI_FLAG (bRadarEnabled, 0, 1, 0) && (!(gameData.app.nGameMode & GM_MULTI) || (netGame.gameFlags & NETGAME_FLAG_SHOW_MAP))) { gameStates.render.cockpit.n3DView [nWindow] = CV_RADAR_HEADSUP; break; } case CV_RADAR_HEADSUP: if (FindEscort()) { gameStates.render.cockpit.n3DView [nWindow] = CV_ESCORT; break; } //if no ecort, fall through case CV_ESCORT: gameStates.render.cockpit.nCoopPlayerView [nWindow] = -1; //force first CPlayerData //fall through case CV_COOP: gameData.marker.viewers [nWindow] = -1; if ((gameData.app.nGameMode & GM_MULTI_COOP) || (gameData.app.nGameMode & GM_TEAM)) { gameStates.render.cockpit.n3DView [nWindow] = CV_COOP; while (1) { gameStates.render.cockpit.nCoopPlayerView [nWindow]++; if (gameStates.render.cockpit.nCoopPlayerView [nWindow] == gameData.multiplayer.nPlayers) { gameStates.render.cockpit.n3DView [nWindow] = CV_MARKER; goto case_marker; } if (gameStates.render.cockpit.nCoopPlayerView [nWindow]==gameData.multiplayer.nLocalPlayer) continue; if (gameData.app.nGameMode & GM_MULTI_COOP) break; else if (GetTeam(gameStates.render.cockpit.nCoopPlayerView [nWindow]) == GetTeam(gameData.multiplayer.nLocalPlayer)) break; } break; } //if not multi, fall through case CV_MARKER: case_marker:; if (!IsMultiGame || IsCoopGame || netGame.bAllowMarkerView) { //anarchy only gameStates.render.cockpit.n3DView [nWindow] = CV_MARKER; if (gameData.marker.viewers [nWindow] == -1) gameData.marker.viewers [nWindow] = gameData.multiplayer.nLocalPlayer * 3; else if (gameData.marker.viewers [nWindow] < gameData.multiplayer.nLocalPlayer * 3 + MaxDrop ()) gameData.marker.viewers [nWindow]++; else gameStates.render.cockpit.n3DView [nWindow] = CV_NONE; } else gameStates.render.cockpit.n3DView [nWindow] = CV_NONE; break; } SavePlayerProfile(); return 1; //bScreenChanged }
//called when a primary weapon is picked up //returns true if actually picked up int PickupPrimary (int nWeaponIndex, int nPlayer) { tPlayer *playerP = gameData.multiplayer.players + nPlayer; //ushort oldFlags = LOCALPLAYER.primaryWeaponFlags; ushort flag = 1 << nWeaponIndex; int nCutPoint; int nSupposedWeapon = gameData.weapons.nPrimary; int bTripleFusion = !gameData.multiplayer.weaponStates [nPlayer].bTripleFusion && (nWeaponIndex == FUSION_INDEX) && EGI_FLAG (bTripleFusion, 0, 0, 0); if ((nWeaponIndex != LASER_INDEX) && (playerP->primaryWeaponFlags & flag) && !bTripleFusion) { if (ISLOCALPLAYER (nPlayer)) HUDInitMessage ("%s %s!", TXT_ALREADY_HAVE_THE, PRIMARY_WEAPON_NAMES (nWeaponIndex)); return 0; } if (!(playerP->primaryWeaponFlags & flag)) playerP->primaryWeaponFlags |= flag; else if (bTripleFusion) { if (nPlayer == gameData.multiplayer.nLocalPlayer) gameData.weapons.bTripleFusion = 1; else gameData.multiplayer.weaponStates [nPlayer].bTripleFusion = 1; } if (ISLOCALPLAYER (nPlayer)) { nCutPoint = POrderList (255); if ((gameData.weapons.nPrimary == LASER_INDEX) && (playerP->laserLevel >= 4)) nSupposedWeapon = SUPER_LASER_INDEX; // allotment for stupid way of doing super laser if ((gameOpts->gameplay.nAutoSelectWeapon == 2) && (POrderList (nWeaponIndex) < nCutPoint) && (POrderList (nWeaponIndex) < POrderList (nSupposedWeapon))) SelectWeapon (nWeaponIndex, 0, 0, 1); PALETTE_FLASH_ADD (7,14,21); if (nWeaponIndex != LASER_INDEX) HUDInitMessage ("%s!", PRIMARY_WEAPON_NAMES (nWeaponIndex)); } return 1; }
void GameplayOptionsMenu (void) { static int choice = 0; CMenu m; int i; int optSmartWeaponSwitch = -1, optHeadlightBuiltIn = -1, optHeadlightPowerDrain = -1, optNoThief = -1; int optReorderPrim, optReorderSec; char szSlider [50]; pszAggressivities [0] = TXT_STANDARD; pszAggressivities [1] = TXT_MODERATE; pszAggressivities [2] = TXT_MEDIUM; pszAggressivities [3] = TXT_HIGH; pszAggressivities [4] = TXT_VERY_HIGH; pszAggressivities [5] = TXT_EXTREME; pszWeaponSwitch [0] = TXT_NEVER; pszWeaponSwitch [1] = TXT_WHEN_EMPTY; pszWeaponSwitch [2] = TXT_CHOSE_BEST; nAIAggressivity = (gameOpts->gameplay.nAIAggressivity && gameOpts->gameplay.nAIAwareness) ? 5 : gameOpts->gameplay.nAIAggressivity; do { m.Destroy (); m.Create (20); sprintf (szSlider + 1, TXT_DIFFICULTY2, MENU_DIFFICULTY_TEXT (gameStates.app.nDifficultyLevel)); *szSlider = *(TXT_DIFFICULTY2 - 1); gplayOpts.nDifficulty = m.AddSlider (szSlider + 1, gameStates.app.nDifficultyLevel, 0, 4, KEY_D, HTX_GPLAY_DIFFICULTY); sprintf (szSlider + 1, TXT_AI_AGGRESSIVITY, pszAggressivities [nAIAggressivity]); *szSlider = *(TXT_AI_AGGRESSIVITY - 1); gplayOpts.nAIAggressivity = m.AddSlider (szSlider + 1, nAIAggressivity, 0, 5, KEY_A, HTX_AI_AGGRESSIVITY); sprintf (szSlider + 1, TXT_WEAPON_SWITCH, pszWeaponSwitch [gameOpts->gameplay.nAutoSelectWeapon]); *szSlider = *(TXT_WEAPON_SWITCH - 1); gplayOpts.nWeaponSwitch = m.AddSlider (szSlider + 1, gameOpts->gameplay.nAutoSelectWeapon, 0, 2, KEY_W, HTX_WEAPON_SWITCH); m.AddText ("", 0); optSmartWeaponSwitch = m.AddCheck (TXT_SMART_WPNSWITCH, extraGameInfo [0].bSmartWeaponSwitch, KEY_S, HTX_GPLAY_SMARTSWITCH); optHeadlightBuiltIn = m.AddCheck (TXT_HEADLIGHT_BUILTIN, extraGameInfo [0].headlight.bBuiltIn, KEY_B, HTX_HEADLIGHT_BUILTIN); optHeadlightPowerDrain = m.AddCheck (TXT_HEADLIGHT_POWERDRAIN, extraGameInfo [0].headlight.bDrainPower, KEY_H, HTX_HEADLIGHT_POWERDRAIN); optNoThief = m.AddCheck (TXT_SUPPRESS_THIEF, gameOpts->gameplay.bNoThief, KEY_T, HTX_SUPPRESS_THIEF); m.AddText (""); optReorderPrim = m.AddMenu (TXT_PRIMARY_PRIO, KEY_P, HTX_OPTIONS_PRIMPRIO); optReorderSec = m.AddMenu (TXT_SECONDARY_PRIO, KEY_E, HTX_OPTIONS_SECPRIO); for (;;) { if (0 > (i = m.Menu (NULL, TXT_GAMEPLAY_OPTS, GameplayOptionsCallback, &choice))) break; if (choice == optReorderPrim) ReorderPrimary (); else if (choice == optReorderSec) ReorderSecondary (); }; } while (i == -2); if (nAIAggressivity == 5) { gameOpts->gameplay.nAIAwareness = 1; gameOpts->gameplay.nAIAggressivity = nAIAggressivity - 1; } else { gameOpts->gameplay.nAIAwareness = 0; gameOpts->gameplay.nAIAggressivity = nAIAggressivity; } extraGameInfo [0].headlight.bAvailable = m [gplayOpts.nHeadlightAvailable].m_value; extraGameInfo [0].bSmartWeaponSwitch = m [optSmartWeaponSwitch].m_value; GET_VAL (gameOpts->gameplay.bNoThief, optNoThief); GET_VAL (extraGameInfo [0].headlight.bDrainPower, optHeadlightPowerDrain); GET_VAL (extraGameInfo [0].headlight.bBuiltIn, optHeadlightBuiltIn); DefaultGameplaySettings (); if (IsMultiGame && !COMPETITION && EGI_FLAG (bSmokeGrenades, 0, 0, 0)) LOCALPLAYER.secondaryAmmo [PROXMINE_INDEX] = 4; if (IsMultiGame) NetworkSendExtraGameInfo (NULL); }
// returns true if powerup consumed int DoPowerup (tObject *objP, int nPlayer) { player *playerP; int bUsed = 0; int bSpecialUsed = 0; //for when hitting vulcan cannon gets vulcan ammo int bLocalPlayer; char szTemp [50]; int id = objP->id; if (nPlayer < 0) nPlayer = gameData.multi.nLocalPlayer; playerP = gameData.multi.players + nPlayer; bLocalPlayer = (nPlayer == gameData.multi.nLocalPlayer); if (bLocalPlayer && ((gameStates.app.bPlayerIsDead) || (gameData.objs.console->nType == OBJ_GHOST) || (playerP->shields < 0))) return 0; if (objP->cType.powerupInfo.creationTime > gameData.time.xGame) //gametime wrapped! objP->cType.powerupInfo.creationTime = 0; //allow player to pick up if ((objP->cType.powerupInfo.flags & PF_SPAT_BY_PLAYER) && (objP->cType.powerupInfo.creationTime > 0) && (gameData.time.xGame < objP->cType.powerupInfo.creationTime+i2f (2))) return 0; //not enough time elapsed gameData.hud.bPlayerMessage = 0; // Prevent messages from going to HUD if -PlayerMessages switch is set switch (objP->id) { case POW_EXTRA_LIFE: playerP->lives++; if (bLocalPlayer) PowerupBasic (15, 15, 15, 0, TXT_EXTRA_LIFE); bUsed = 1; break; case POW_ENERGY: bUsed = PickupEnergy (nPlayer); break; case POW_SHIELD_BOOST: bUsed = PickupShield (nPlayer); break; case POW_LASER: if (playerP->laserLevel >= MAX_LASER_LEVEL) { //playerP->laserLevel = MAX_LASER_LEVEL; if (bLocalPlayer) HUDInitMessage (TXT_MAXED_OUT, TXT_LASER); } else { if (gameData.demo.nState == ND_STATE_RECORDING) NDRecordLaserLevel ((sbyte) playerP->laserLevel, (sbyte) playerP->laserLevel + 1); playerP->laserLevel++; PowerupBasic (10, 0, 10, LASER_SCORE, "%s %s %d", TXT_LASER, TXT_BOOSTED_TO, playerP->laserLevel+1); UpdateLaserWeaponInfo (); PickupPrimary (LASER_INDEX, nPlayer); bUsed = 1; } if (!bUsed && !(gameData.app.nGameMode & GM_MULTI)) bUsed = PickupEnergy (nPlayer); break; case POW_MISSILE_1: bUsed = PickupSecondary (objP, CONCUSSION_INDEX, 1, nPlayer); break; case POW_MISSILE_4: bUsed = PickupSecondary (objP, CONCUSSION_INDEX, 4, nPlayer); break; case POW_KEY_BLUE: bUsed = PickupKey (objP, PLAYER_FLAGS_BLUE_KEY, TXT_BLUE, nPlayer); break; case POW_KEY_RED: bUsed = PickupKey (objP, PLAYER_FLAGS_RED_KEY, TXT_RED, nPlayer); break; case POW_KEY_GOLD: bUsed = PickupKey (objP, PLAYER_FLAGS_GOLD_KEY, TXT_YELLOW, nPlayer); break; case POW_QUAD_FIRE: if (!(playerP->flags & PLAYER_FLAGS_QUAD_LASERS)) { playerP->flags |= PLAYER_FLAGS_QUAD_LASERS; PowerupBasic (15, 15, 7, QUAD_FIRE_SCORE, "%s!", TXT_QUAD_LASERS); UpdateLaserWeaponInfo (); bUsed = 1; } else HUDInitMessage ("%s %s!", TXT_ALREADY_HAVE, TXT_QUAD_LASERS); if (!bUsed && !(gameData.app.nGameMode & GM_MULTI)) bUsed = PickupEnergy (nPlayer); break; case POW_VULCAN_WEAPON: case POW_GAUSS_WEAPON: { int ammo = objP->cType.powerupInfo.count; bUsed = PickupPrimary ((objP->id == POW_VULCAN_WEAPON) ? VULCAN_INDEX : GAUSS_INDEX, nPlayer); //didn't get the weapon (because we already have it), but //maybe snag some of the ammo. if single-player, grab all the ammo //and remove the powerup. If multi-player take ammo in excess of //the amount in a powerup, and leave the rest. if (!bUsed) if ((gameData.app.nGameMode & GM_MULTI)) ammo -= VULCAN_AMMO_AMOUNT; //don't let take all ammo if (ammo > 0) { int nAmmoUsed = PickupAmmo (CLASS_PRIMARY, VULCAN_INDEX, ammo, nPlayer); objP->cType.powerupInfo.count -= nAmmoUsed; if (LOCALPLAYER (nPlayer)) { if (!bUsed && nAmmoUsed) { PowerupBasic (7, 14, 21, VULCAN_AMMO_SCORE, "%s!", TXT_VULCAN_AMMO); bSpecialUsed = 1; id = POW_VULCAN_AMMO; //set new id for making sound at end of this function if (objP->cType.powerupInfo.count == 0) bUsed = 1; //say bUsed if all ammo taken } } } break; } case POW_SPREADFIRE_WEAPON: bUsed = PickupPrimary (SPREADFIRE_INDEX, nPlayer); if (!bUsed && !(gameData.app.nGameMode & GM_MULTI)) bUsed = PickupEnergy (nPlayer); break; case POW_PLASMA_WEAPON: bUsed = PickupPrimary (PLASMA_INDEX, nPlayer); if (!bUsed && !(gameData.app.nGameMode & GM_MULTI)) bUsed = PickupEnergy (nPlayer); break; case POW_FUSION_WEAPON: bUsed = PickupPrimary (FUSION_INDEX, nPlayer); if (!bUsed && !(gameData.app.nGameMode & GM_MULTI)) bUsed = PickupEnergy (nPlayer); break; case POW_HELIX_WEAPON: bUsed = PickupPrimary (HELIX_INDEX, nPlayer); if (!bUsed && !(gameData.app.nGameMode & GM_MULTI)) bUsed = PickupEnergy (nPlayer); break; case POW_PHOENIX_WEAPON: bUsed = PickupPrimary (PHOENIX_INDEX, nPlayer); if (!bUsed && !(gameData.app.nGameMode & GM_MULTI)) bUsed = PickupEnergy (nPlayer); break; case POW_OMEGA_WEAPON: bUsed = PickupPrimary (OMEGA_INDEX, nPlayer); if (bUsed) xOmegaCharge = objP->cType.powerupInfo.count; else if (!(gameData.app.nGameMode & GM_MULTI)) bUsed = PickupEnergy (nPlayer); break; case POW_PROXIMITY_WEAPON: bUsed = PickupSecondary (objP, PROXIMITY_INDEX, 4, nPlayer); break; case POW_SMARTBOMB_WEAPON: bUsed = PickupSecondary (objP, SMART_INDEX, 1, nPlayer); break; case POW_MEGA_WEAPON: bUsed = PickupSecondary (objP, MEGA_INDEX, 1, nPlayer); break; case POW_SMISSILE1_1: bUsed = PickupSecondary (objP, SMISSILE1_INDEX, 1, nPlayer); break; case POW_SMISSILE1_4: bUsed = PickupSecondary (objP, SMISSILE1_INDEX, 4, nPlayer); break; case POW_GUIDED_MISSILE_1: bUsed = PickupSecondary (objP, GUIDED_INDEX, 1, nPlayer); break; case POW_GUIDED_MISSILE_4: bUsed = PickupSecondary (objP, GUIDED_INDEX, 4, nPlayer); break; case POW_SMART_MINE: bUsed = PickupSecondary (objP, SMART_MINE_INDEX, 4, nPlayer); break; case POW_MERCURY_MISSILE_1: bUsed = PickupSecondary (objP, SMISSILE4_INDEX, 1, nPlayer); break; case POW_MERCURY_MISSILE_4: bUsed = PickupSecondary (objP, SMISSILE4_INDEX, 4, nPlayer); break; case POW_EARTHSHAKER_MISSILE: bUsed = PickupSecondary (objP, SMISSILE5_INDEX, 1, nPlayer); break; case POW_VULCAN_AMMO: bUsed = PickUpVulcanAmmo (nPlayer); break; case POW_HOMING_AMMO_1: bUsed = PickupSecondary (objP, HOMING_INDEX, 1, nPlayer); break; case POW_HOMING_AMMO_4: bUsed = PickupSecondary (objP, HOMING_INDEX, 4, nPlayer); break; case POW_CLOAK: if (gameOpts->gameplay.bInventory && !IsMultiGame) { if (playerP->nCloaks == 255) { if (LOCALPLAYER (nPlayer)) HUDInitMessage ("%s", TXT_INVENTORY_FULL); } else { playerP->nCloaks++; bUsed = 1; } } else { bUsed = -ApplyCloak (1, nPlayer); } break; case POW_INVULNERABILITY: if (gameOpts->gameplay.bInventory && !IsMultiGame) { if (playerP->nInvuls == 255) { if (LOCALPLAYER (nPlayer)) HUDInitMessage ("%s", TXT_INVENTORY_FULL); } else { playerP->nInvuls++; bUsed = 1; } } else { bUsed = -ApplyInvul (1, nPlayer); } break; #ifndef RELEASE case POW_MEGAWOW: DoMegaWowPowerup (50); bUsed = 1; break; #endif case POW_FULL_MAP: bUsed = PickupEquipment (objP, PLAYER_FLAGS_MAP_ALL, TXT_THE_FULLMAP, TXT_GOT_FULLMAP, nPlayer) ? 1 : 0; break; case POW_CONVERTER: sprintf (szTemp, TXT_GOT_CONVERTER, KeyToASCII (GetKeyValue (54))); bUsed = PickupEquipment (objP, PLAYER_FLAGS_CONVERTER, TXT_THE_CONVERTER, szTemp, nPlayer) ? 1 : 0; break; case POW_SUPER_LASER: if (playerP->laserLevel >= MAX_SUPER_LASER_LEVEL) { playerP->laserLevel = MAX_SUPER_LASER_LEVEL; HUDInitMessage (TXT_LASER_MAXEDOUT); } else { ubyte nOldLevel = playerP->laserLevel; if (playerP->laserLevel <= MAX_LASER_LEVEL) playerP->laserLevel = MAX_LASER_LEVEL; playerP->laserLevel++; if (LOCALPLAYER (nPlayer)) { if (gameData.demo.nState == ND_STATE_RECORDING) NDRecordLaserLevel (nOldLevel, playerP->laserLevel); PowerupBasic (10, 0, 10, LASER_SCORE, TXT_SUPERBOOST, playerP->laserLevel + 1, nPlayer); UpdateLaserWeaponInfo (); if (gameData.weapons.nPrimary != LASER_INDEX) CheckToUsePrimary (SUPER_LASER_INDEX); } bUsed = 1; } if (!bUsed && !(gameData.app.nGameMode & GM_MULTI)) bUsed = PickupEnergy (nPlayer); break; case POW_AMMO_RACK: bUsed = PickupEquipment (objP, PLAYER_FLAGS_AMMO_RACK, TXT_THE_AMMORACK, TXT_GOT_AMMORACK, nPlayer) ? 1 : 0; break; case POW_AFTERBURNER: bUsed = PickupEquipment (objP, PLAYER_FLAGS_AFTERBURNER, TXT_THE_BURNER, TXT_GOT_BURNER, nPlayer); if (bUsed < 0) { xAfterburnerCharge = f1_0; bUsed = 1; } break; case POW_HEADLIGHT: sprintf (szTemp, TXT_GOT_HEADLIGHT, gameOpts->gameplay.bHeadlightOn ? TXT_ON : TXT_OFF); bUsed = PickupEquipment (objP, PLAYER_FLAGS_HEADLIGHT, TXT_THE_HEADLIGHT, szTemp, nPlayer); if (bUsed < 0) { if (LOCALPLAYER (nPlayer)) { if (gameOpts->gameplay.bHeadlightOn && (!EGI_FLAG (bDarkness, 0, 0) || EGI_FLAG (bHeadLights, 0, 0))) playerP->flags |= PLAYER_FLAGS_HEADLIGHT_ON; #ifdef NETWORK if (gameData.app.nGameMode & GM_MULTI) MultiSendFlags ((char) gameData.multi.nLocalPlayer); #endif } bUsed = 1; } break; case POW_FLAG_BLUE: bUsed = PickupFlag (objP, TEAM_BLUE, TEAM_RED, "BLUE FLAG!", nPlayer); break; case POW_FLAG_RED: bUsed = PickupFlag (objP, TEAM_RED, TEAM_BLUE, "RED FLAG!", nPlayer); break; case POW_HOARD_ORB: if (gameData.app.nGameMode & GM_HOARD) { if (playerP->secondaryAmmo [PROXIMITY_INDEX] < 12) { if (LOCALPLAYER (nPlayer)) { MultiSendGotOrb ((char) gameData.multi.nLocalPlayer); PowerupBasic (15, 0, 15, 0, "Orb!!!", nPlayer); } playerP->secondaryAmmo [PROXIMITY_INDEX]++; playerP->flags |= PLAYER_FLAGS_FLAG; bUsed = 1; } } else if (gameData.app.nGameMode & GM_ENTROPY) { if (objP->matCenCreator != GetTeam ((char) gameData.multi.nLocalPlayer) + 1) { if ((extraGameInfo [1].entropy.nVirusStability < 2) || ((extraGameInfo [1].entropy.nVirusStability < 3) && ((gameData.segs.xSegments [objP->nSegment].owner != objP->matCenCreator) || (gameData.segs.segment2s [objP->nSegment].special != SEGMENT_IS_ROBOTMAKER)))) objP->lifeleft = -1; //make orb disappear if touched by opposing team player } else if (playerP->secondaryAmmo [PROXIMITY_INDEX] < playerP->secondaryAmmo [SMART_MINE_INDEX]) { if (LOCALPLAYER (nPlayer)) { MultiSendGotOrb ((char) gameData.multi.nLocalPlayer); PowerupBasic (15, 0, 15, 0, "Virus!!!", nPlayer); } playerP->secondaryAmmo [PROXIMITY_INDEX]++; playerP->flags |= PLAYER_FLAGS_FLAG; bUsed = 1; } } break; default: break; } //always say bUsed, until physics problem (getting stuck on unused powerup) //is solved. Note also the break statements above that are commented out //!! bUsed = 1; if (bUsed || bSpecialUsed) UsePowerup (id * (bUsed ? bUsed : bSpecialUsed)); gameData.hud.bPlayerMessage = 1; return bUsed; }
fix SetVertexLight (int nSegment, int nSide, int nVertex, tFaceColor *colorP, fix light) { tRgbColorf *pdc; fix dynLight; float fl, dl, hl; //the tUVL struct has static light already in it //scale static light for destruction effect if (EGI_FLAG (bDarkness, 0, 0, 0)) light = 0; else { #if LMAP_LIGHTADJUST if (USE_LIGHTMAPS) { else { light = I2X (1) / 2 + gameData.render.lights.segDeltas [nSegment * 6 + nSide]; if (light < 0) light = 0; } } #endif if (gameData.reactor.bDestroyed || gameStates.gameplay.seismic.nMagnitude) //make lights flash light = FixMul (gameStates.render.nFlashScale, light); } //add in dynamic light (from explosions, etc.) dynLight = gameData.render.lights.dynamicLight [nVertex]; fl = X2F (light); dl = X2F (dynLight); light += dynLight; #if DBG if (nVertex == nDbgVertex) nVertex = nVertex; #endif if (gameStates.app.bHaveExtraGameInfo [IsMultiGame]) { if (gameData.render.lights.bGotDynColor [nVertex]) { pdc = gameData.render.lights.dynamicColor + nVertex; if (gameOpts->render.color.bMix) { if (gameOpts->render.color.bGunLight) { if (gameStates.render.bAmbientColor) { if ((fl != 0) && gameData.render.color.vertBright [nVertex]) { hl = fl / gameData.render.color.vertBright [nVertex]; colorP->color.red = colorP->color.red * hl + pdc->red * dl; colorP->color.green = colorP->color.green * hl + pdc->green * dl; colorP->color.blue = colorP->color.blue * hl + pdc->blue * dl; ScaleColor (colorP, fl + dl); } else { colorP->color.red = pdc->red * dl; colorP->color.green = pdc->green * dl; colorP->color.blue = pdc->blue * dl; ScaleColor (colorP, dl); } } else { colorP->color.red = fl + pdc->red * dl; colorP->color.green = fl + pdc->green * dl; colorP->color.blue = fl + pdc->blue * dl; ScaleColor (colorP, fl + dl); } } else { colorP->color.red = colorP->color.green = colorP->color.blue = fl + dl; } if (gameOpts->render.color.bCap) { if (colorP->color.red > 1.0) colorP->color.red = 1.0; if (colorP->color.green > 1.0) colorP->color.green = 1.0; if (colorP->color.blue > 1.0) colorP->color.blue = 1.0; } } else { float dl = X2F (light); dl = (float) pow (dl, 1.0f / 3.0f); colorP->color.red = pdc->red * dl; colorP->color.green = pdc->green * dl; colorP->color.blue = pdc->blue * dl; } } else { ScaleColor (colorP, fl + dl); } } else { ScaleColor (colorP, fl + dl); } //saturate at max value if (light > MAX_LIGHT) light = MAX_LIGHT; return light; }
void RenderFace (tFaceProps *propsP) { tFaceProps props = *propsP; CBitmap *bmBot = NULL; CBitmap *bmTop = NULL; int i, bIsMonitor, bIsTeleCam, bHaveMonitorBg, nCamNum, bCamBufAvail; g3sPoint *pointList [8], **pp; CSegment *segP = SEGMENTS + props.segNum; CSide *sideP = segP->m_sides + props.sideNum; CCamera *cameraP = NULL; if (props.nBaseTex < 0) return; if (gameStates.render.nShadowPass == 2) { #if DBG_SHADOWS if (!bWallShadows) return; #endif G3SetCullAndStencil (0, 0); RenderFaceShadow (propsP); G3SetCullAndStencil (1, 0); RenderFaceShadow (propsP); return; } #if DBG //convenient place for a debug breakpoint if (props.segNum == nDbgSeg && ((nDbgSide < 0) || (props.sideNum == nDbgSide))) props.segNum = props.segNum; if (props.nBaseTex == nDbgBaseTex) props.segNum = props.segNum; if (props.nOvlTex == nDbgOvlTex) props.segNum = props.segNum; # if 0 else return; # endif #endif gameData.render.vertexList = gameData.segs.fVertices.Buffer (); Assert(props.nVertices <= 4); for (i = 0, pp = pointList; i < props.nVertices; i++, pp++) *pp = gameData.segs.points + props.vp [i]; if (!(gameOpts->render.debug.bTextures || IsMultiGame)) goto drawWireFrame; #if 1 if (gameStates.render.nShadowBlurPass == 1) { G3DrawWhitePoly (props.nVertices, pointList); gameData.render.vertexList = NULL; return; } #endif SetVertexColors (&props); if (gameStates.render.nType == 2) { #if DBG //convenient place for a debug breakpoint if (props.segNum == nDbgSeg && ((nDbgSide < 0) || (props.sideNum == nDbgSide))) props.segNum = props.segNum; #endif RenderColoredSegFace (props.segNum, props.sideNum, props.nVertices, pointList); gameData.render.vertexList = NULL; return; } nCamNum = IsMonitorFace (props.segNum, props.sideNum, 0); if ((bIsMonitor = gameStates.render.bUseCameras && (nCamNum >= 0))) { cameraP = cameraManager.Camera (nCamNum); cameraP->SetVisible (1); bIsTeleCam = cameraP->GetTeleport (); #if RENDER2TEXTURE bCamBufAvail = cameraP->HaveBuffer (1) == 1; #else bCamBufAvail = 0; #endif bHaveMonitorBg = cameraP->Valid () && /*!cameraP->bShadowMap &&*/ (cameraP->HaveTexture () || bCamBufAvail) && (!bIsTeleCam || EGI_FLAG (bTeleporterCams, 0, 1, 0)); } else bIsTeleCam = bHaveMonitorBg = bCamBufAvail = 0; if (RenderWall (&props, pointList, bIsMonitor)) { //handle semi-transparent walls gameData.render.vertexList = NULL; return; } if (props.widFlags & WID_RENDER_FLAG) { if (props.nBaseTex >= gameData.pig.tex.nTextures [gameStates.app.bD1Data]) { sideP->m_nBaseTex = 0; } if (!(bHaveMonitorBg && gameOpts->render.cameras.bFitToWall)) { if (gameStates.render.nType == 3) { bmBot = bmpCorona; bmTop = NULL; props.uvls [0].u = props.uvls [0].v = props.uvls [1].v = props.uvls [3].u = I2X (1) / 4; props.uvls [1].u = props.uvls [2].u = props.uvls [2].v = props.uvls [3].v = I2X (3) / 4; } else if (gameOpts->ogl.bGlTexMerge) { bmBot = LoadFaceBitmap (props.nBaseTex, sideP->m_nFrame); if (props.nOvlTex) bmTop = LoadFaceBitmap ((short) (props.nOvlTex), sideP->m_nFrame); } else { if (props.nOvlTex != 0) { bmBot = TexMergeGetCachedBitmap (props.nBaseTex, props.nOvlTex, props.nOvlOrient); #if DBG if (!bmBot) bmBot = TexMergeGetCachedBitmap (props.nBaseTex, props.nOvlTex, props.nOvlOrient); #endif } else { bmBot = gameData.pig.tex.bitmapP + gameData.pig.tex.bmIndexP [props.nBaseTex].index; LoadBitmap (gameData.pig.tex.bmIndexP [props.nBaseTex].index, gameStates.app.bD1Mission); } } } if (bHaveMonitorBg) { cameraP->GetUVL (NULL, props.uvls, NULL, NULL); if (bIsTeleCam) { #if DBG bmBot = &cameraP->Texture (); gameStates.render.grAlpha = 1.0f; #else bmTop = &cameraP->Texture (); gameStates.render.grAlpha = 0.7f; #endif } else if (gameOpts->render.cameras.bFitToWall || (props.nOvlTex > 0)) bmBot = &cameraP->Texture (); else bmTop = &cameraP->Texture (); } SetFaceLight (&props); #if DBG //convenient place for a debug breakpoint if (props.segNum == nDbgSeg && props.sideNum == nDbgSide) props.segNum = props.segNum; #endif #if DBG if (bmTop) fpDrawTexPolyMulti ( props.nVertices, pointList, props.uvls, # if LIGHTMAPS props.uvl_lMaps, # endif bmBot, bmTop, # if LIGHTMAPS NULL, //lightmaps + props.segNum * 6 + props.sideNum, # endif &props.vNormal, props.nOvlOrient, !bIsMonitor || bIsTeleCam, props.segNum); else # if LIGHTMAPS == 0 G3DrawTexPoly (props.nVertices, pointList, props.uvls, bmBot, &props.vNormal, !bIsMonitor || bIsTeleCam, props.segNum); # else fpDrawTexPolyMulti ( props.nVertices, pointList, props.uvls, props.uvl_lMaps, bmBot, NULL, NULL, //lightmaps + props.segNum * 6 + props.sideNum, &props.vNormal, 0, !bIsMonitor || bIsTeleCam, props.segNum); # endif #else fpDrawTexPolyMulti ( props.nVertices, pointList, props.uvls, # if LIGHTMAPS props.uvl_lMaps, # endif bmBot, bmTop, # if LIGHTMAPS NULL, //lightmaps + props.segNum * 6 + props.sideNum, # endif &props.vNormal, props.nOvlOrient, !bIsMonitor || bIsTeleCam, props.segNum); #endif } gameStates.render.grAlpha = 1.0f; gameStates.ogl.fAlpha = 1; // render the CSegment the CPlayerData is in with a transparent color if it is a water or lava CSegment //if (nSegment == OBJECTS->nSegment) #if DBG if (bOutLineMode) DrawOutline (props.nVertices, pointList); #endif drawWireFrame: if (gameOpts->render.debug.bWireFrame && !IsMultiGame) DrawOutline (props.nVertices, pointList); }
void RenderLightTrail (CObject *objP) { tRgbaColorf color, *colorP; int nTrailItem = -1, /*nCoronaItem = -1,*/ bGatling = 0; if (!SHOW_OBJ_FX) return; if (!gameData.objs.bIsWeapon [objP->info.nId]) return; if (SHOW_SHADOWS && (gameStates.render.nShadowPass != 1)) return; bGatling = (objP->info.nId == VULCAN_ID) || (objP->info.nId == GAUSS_ID); if (objP->info.renderType == RT_POLYOBJ) colorP = gameData.weapons.color + objP->info.nId; else { tRgbColorb *pcb = VClipColor (objP); color.red = pcb->red / 255.0f; color.green = pcb->green / 255.0f; color.blue = pcb->blue / 255.0f; colorP = &color; } if (!gameData.objs.bIsSlowWeapon [objP->info.nId] && gameStates.app.bHaveExtraGameInfo [IsMultiGame] && EGI_FLAG (bLightTrails, 0, 0, 0)) { if (gameOpts->render.particles.bPlasmaTrails) ;//DoObjectSmoke (objP); else if (EGI_FLAG (bLightTrails, 1, 1, 0) && (objP->info.nType == OBJ_WEAPON) && !gameData.objs.bIsSlowWeapon [objP->info.nId] && (!objP->mType.physInfo.velocity.IsZero ()) && LoadGlare ()) { CFloatVector vNorm, vCenter, vOffs, vTrailVerts [8]; float h, l, r, dx, dy; static CFloatVector vEye = CFloatVector::ZERO; static tRgbaColorf trailColor = {0,0,0,0.33f}; static tTexCoord2f tTexCoordTrail [8] = { //{{0.1f,0.1f}},{{0.9f,0.1f}},{{0.9f,0.9f}},{{0.1f,0.9f}} {{0.0f,0.0f}},{{1.0f,0.0f}},{{1.0f,0.5f}},{{0.0f,0.5f}}, {{0.0f,0.5f}},{{1.0f,0.5f}},{{1.0f,1.0f}},{{0.0f,1.0f}} }; vCenter.Assign (objP->info.position.vPos); vOffs.Assign (objP->info.position.mOrient.FVec ()); if (objP->info.renderType == RT_POLYOBJ) { tHitbox* phb = &gameData.models.hitboxes [objP->rType.polyObjInfo.nModel].hitboxes [0]; l = X2F (phb->vMax [Z] - phb->vMin [Z]); dx = X2F (phb->vMax [X] - phb->vMin [X]); dy = X2F (phb->vMax [Y] - phb->vMin [Y]); r = float (sqrt (dx * dx + dy * dy)) * ((objP->info.nId == FUSION_ID) ? 1.5f : 3.0f); vCenter += vOffs * (l / 2.0f); } else { r = WeaponBlobSize (objP->info.nId); l = r * 1.5f; r *= 2; } memcpy (&trailColor, colorP, 3 * sizeof (float)); float fScale = coronaIntensities [gameOpts->render.coronas.nObjIntensity] / 2; trailColor.red *= fScale; trailColor.green *= fScale; trailColor.blue *= fScale; vTrailVerts [0] = vCenter + vOffs * l; h = X2F (CFixVector::Dist (objP->info.position.vPos, objP->Origin ())); if (h > 50.0f) h = 50.0f; else if (h < 1.0f) h = 1.0f; vTrailVerts [7] = vTrailVerts [0] - vOffs * (h + l); transformation.Transform (vCenter, vCenter, 0); transformation.Transform (vTrailVerts [0], vTrailVerts [0], 0); transformation.Transform (vTrailVerts [7], vTrailVerts [7], 0); vNorm = CFloatVector::Normal (vTrailVerts [0], vTrailVerts [7], vEye); vNorm *= r; vTrailVerts [2] = vTrailVerts [5] = vCenter + vNorm; vTrailVerts [3] = vTrailVerts [4] = vCenter - vNorm; //vNorm /= 4; vTrailVerts [6] = vTrailVerts [7] + vNorm; vTrailVerts [7] -= vNorm; vNorm = CFloatVector::Normal (vTrailVerts [2], vTrailVerts [3], vEye); vNorm *= r; vTrailVerts [0] = vTrailVerts [3] - vNorm; vTrailVerts [1] = vTrailVerts [2] - vNorm; transparencyRenderer.AddPoly (NULL, NULL, bmpGlare, vTrailVerts, 8, tTexCoordTrail, &trailColor, NULL, 1, 0, GL_QUADS, GL_CLAMP, LIGHTTRAIL_BLENDMODE, -1); } } if ((objP->info.renderType != RT_POLYOBJ) || (objP->info.nId == FUSION_ID)) RenderWeaponCorona (objP, colorP, 0.5f, 0, 2.0f + X2F (d_rand() % (I2X (1) / 8)), 1, 0, 1); else RenderWeaponCorona (objP, colorP, 0.75f, 0, bGatling ? 1.0f : 2.0f, 0, 0, 0); }
void DoRenderObject (int nObject, int nWindow) { CObject* objP = OBJECTS + nObject; int count = 0; if (!(IsMultiGame || gameOpts->render.debug.bObjects)) return; Assert(nObject < LEVEL_OBJECTS); #if 0 if (!(nWindow || gameStates.render.cameras.bActive) && (gameStates.render.nShadowPass < 2) && (gameData.render.mine.bObjectRendered [nObject] == gameStates.render.nFrameFlipFlop)) //already rendered this... return; #endif if (gameData.demo.nState == ND_STATE_PLAYBACK) { if ((nDemoDoingLeft == 6 || nDemoDoingRight == 6) && objP->info.nType == OBJ_PLAYER) { return; } } if ((count++ > LEVEL_OBJECTS) || (objP->info.nNextInSeg == nObject)) { Int3(); // infinite loop detected objP->info.nNextInSeg = -1; // won't this clean things up? return; // get out of this infinite loop! } if (RenderObject (objP, nWindow, 0)) { gameData.render.mine.bObjectRendered [nObject] = gameStates.render.nFrameFlipFlop; if (!gameStates.render.cameras.bActive) { tWindowRenderedData* wrd = windowRenderedData + nWindow; int nType = objP->info.nType; if ((nType == OBJ_ROBOT) || (nType == OBJ_PLAYER) || ((nType == OBJ_WEAPON) && (WeaponIsPlayerMine (objP->info.nId) || (gameData.objs.bIsMissile [objP->info.nId] && EGI_FLAG (bKillMissiles, 0, 0, 0))))) { if (wrd->nObjects >= MAX_RENDERED_OBJECTS) { Int3(); wrd->nObjects /= 2; } wrd->renderedObjects [wrd->nObjects++] = nObject; } } } for (int i = objP->info.nAttachedObj; i != -1; i = objP->cType.explInfo.attached.nNext) { objP = OBJECTS + i; Assert (objP->info.nType == OBJ_FIREBALL); Assert (objP->info.controlType == CT_EXPLOSION); Assert (objP->info.nFlags & OF_ATTACHED); RenderObject (objP, nWindow, 1); } }
// ----------------------------------------------------------------------------- // This must be called at the start of each level. // If this level contains a boss and mode != multiplayer, don't do control center stuff. (Ghost out control center CObject.) // If this level contains a boss and mode == multiplayer, do control center stuff. void InitReactorForLevel (int bRestore) { int i, j = 0, nGuns, bNew; CObject *objP; short nBossObj = -1; tReactorStates* rStatP = &gameData.reactor.states [0]; gameStates.gameplay.bMultiBosses = gameStates.app.bD2XLevel && EGI_FLAG (bMultiBosses, 0, 0, 0); extraGameInfo [0].nBossCount = 0; gameStates.gameplay.nReactorCount [0] = gameStates.gameplay.nReactorCount [1] = 0; gameData.reactor.bPresent = 0; if (bRestore) { for (i = 0; i < MAX_BOSS_COUNT; i++) if (gameData.reactor.states [i].nObject <= 0) { gameStates.gameplay.nLastReactor = i - 1; break; } } else { gameStates.gameplay.nLastReactor = -1; gameData.reactor.states.Clear (char (0xff)); } FORALL_ACTOR_OBJS (objP, i) { if (objP->info.nType == OBJ_REACTOR) { if (gameStates.gameplay.nReactorCount [0] && !(gameStates.app.bD2XLevel && gameStates.gameplay.bMultiBosses)) { #if TRACE console.printf (1, "Warning: Two or more control centers including %i and %i\n", gameData.reactor.states [0].nObject, objP->Index ()); #endif } //else { // Compute all gun positions. if ((bNew = (!bRestore || (0 > (j = FindReactor (objP)))))) j = gameStates.gameplay.nReactorCount [0]; rStatP = gameData.reactor.states + j; if (gameStates.gameplay.nLastReactor < j) gameStates.gameplay.nLastReactor = j; if (bNew) rStatP->nDeadObj = -1; rStatP->xLastVisCheckTime = 0; if (rStatP->nDeadObj < 0) { nGuns = gameData.reactor.props [objP->info.nId].nGuns; for (j = 0; j < nGuns; j++) CalcReactorGunPoint (rStatP->vGunPos + j, rStatP->vGunDir + j, objP, j); gameData.reactor.bPresent = 1; rStatP->nObject = objP->Index (); if (bNew) { objP->info.xShields = ReactorStrength (); // Say the control center has not yet been hit. rStatP->bHit = 0; rStatP->bSeenPlayer = 0; rStatP->nNextFireTime = 0; } extraGameInfo [0].nBossCount++; gameStates.gameplay.nLastReactor = gameStates.gameplay.nReactorCount [0]; gameStates.gameplay.nReactorCount [0]++; } } } if (IS_BOSS (objP)) { if ((BOSS_COUNT < int (gameData.bosses.ToS ())) || gameData.bosses.Grow ()) { gameData.bosses [BOSS_COUNT].m_nObject = objP->Index (); extraGameInfo [0].nBossCount++; if (BOSS_COUNT < 2) nBossObj = objP->Index (); #if TRACE else console.printf (1, "Warning: Two or more bosses including %i and %i\n", objP->Index (), nBossObj); #endif } } } #if DBG if ((BOSS_COUNT <= 0) && !gameStates.gameplay.nReactorCount [0]) { #if TRACE console.printf (1, "Warning: No control center.\n"); #endif return; } #endif if (gameStates.app.bD2XLevel && gameStates.gameplay.bMultiBosses) gameData.reactor.bDisabled = 0; else if (BOSS_COUNT > 0) { for (j = 0; j < gameStates.gameplay.nReactorCount [0]; j++) { OBJECTS [gameData.reactor.states [j].nObject].BashToShield (true); extraGameInfo [0].nBossCount--; if (j < --gameStates.gameplay.nReactorCount [0]) gameData.reactor.states [j] = gameData.reactor.states [gameStates.gameplay.nReactorCount [0]]; } gameData.reactor.bPresent = 0; gameData.reactor.bDisabled = 1; //extraGameInfo [0].nBossCount = 1; } gameStates.gameplay.nReactorCount [1] = gameStates.gameplay.nReactorCount [0]; }
// ----------------------------------------------------------------------------- // This must be called at the start of each level. // If this level contains a boss and mode != multiplayer, don't do control center stuff. (Ghost out control center tObject.) // If this level contains a boss and mode == multiplayer, do control center stuff. void InitReactorForLevel (int bRestore) { int i, j, nGuns, bNew; tObject *objP; short nBossObj = -1; tReactorStates *rStatP = gameData.reactor.states; gameStates.gameplay.bMultiBosses = gameStates.app.bD2XLevel && EGI_FLAG (bMultiBosses, 0, 0, 0); extraGameInfo [0].nBossCount = 0; gameStates.gameplay.nReactorCount = 0; gameData.reactor.bPresent = 0; if (bRestore) { for (i = 0; i < MAX_BOSS_COUNT; i++) if (gameData.reactor.states [i].nObject <= 0) { gameStates.gameplay.nLastReactor = i - 1; break; } } else { gameStates.gameplay.nLastReactor = -1; memset (gameData.reactor.states, 0xff, sizeof (gameData.reactor.states)); } for (i = 0, objP = gameData.objs.objects; i <= gameData.objs.nLastObject; i++, objP++) { if (objP->nType == OBJ_CNTRLCEN) { if (gameStates.gameplay.nReactorCount && !(gameStates.app.bD2XLevel && gameStates.gameplay.bMultiBosses)) { #if TRACE con_printf (1, "Warning: Two or more control centers including %i and %i\n", gameData.reactor.states [0].nObject, i); #endif } //else { // Compute all gun positions. objP = gameData.objs.objects + i; if ((bNew = (!bRestore || (0 > (j = FindReactor (objP)))))) j = gameStates.gameplay.nReactorCount; rStatP = gameData.reactor.states + j; if (gameStates.gameplay.nLastReactor < j) gameStates.gameplay.nLastReactor = j; if (bNew) rStatP->nDeadObj = -1; rStatP->xLastVisCheckTime = 0; if (rStatP->nDeadObj < 0) { nGuns = gameData.reactor.props [objP->id].nGuns; for (j = 0; j < nGuns; j++) CalcReactorGunPoint (rStatP->vGunPos + j, rStatP->vGunDir + j, objP, j); gameData.reactor.bPresent = 1; rStatP->nObject = i; if (bNew) { objP->shields = ReactorStrength (); // Say the control center has not yet been hit. rStatP->bHit = 0; rStatP->bSeenPlayer = 0; rStatP->nNextFireTime = 0; } extraGameInfo [0].nBossCount++; gameStates.gameplay.nLastReactor = gameStates.gameplay.nReactorCount; gameStates.gameplay.nReactorCount++; } } } if (IS_BOSS (objP)) { extraGameInfo [0].nBossCount++; //InitBossData (extraGameInfo [0].nBossCount - 1, OBJ_IDX (objP)); if (BOSS_COUNT > 1) { #if TRACE con_printf (1, "Warning: Two or more bosses including %i and %i\n", i, nBossObj); #endif } else nBossObj = i; } } #ifdef _DEBUG if (!(BOSS_COUNT || gameStates.gameplay.nReactorCount)) { #if TRACE con_printf (1, "Warning: No control center.\n"); #endif return; } #endif if (gameStates.app.bD2XLevel && gameStates.gameplay.bMultiBosses) gameData.reactor.bDisabled = 0; else if (BOSS_COUNT) { for (j = 0; j < gameStates.gameplay.nReactorCount; j++) { BashToShield (gameData.reactor.states [j].nObject, "reactor"); gameData.reactor.states [j].nObject = -1; } gameData.reactor.bPresent = 0; gameData.reactor.bDisabled = 1; gameStates.gameplay.nReactorCount = 0; extraGameInfo [0].nBossCount = 1; } }
void DoPlayerSmoke (CObject *objP, int nPlayer) { int nObject, nSmoke, d, nParts, nType; float nScale; CParticleEmitter *emitterP; CFixVector fn, mn, vDir, *vDirP; tThrusterInfo ti; static int bForward = 1; if (nPlayer < 0) nPlayer = objP->info.nId; if ((gameData.multiplayer.players [nPlayer].flags & PLAYER_FLAGS_CLOAKED) || (automap.m_bDisplay && IsMultiGame && !AM_SHOW_PLAYERS)) { KillObjectSmoke (nPlayer); return; } nObject = objP->Index (); if (gameOpts->render.particles.bDecreaseLag && (nPlayer == gameData.multiplayer.nLocalPlayer)) { fn = objP->info.position.mOrient.FVec (); mn = objP->info.position.vPos - objP->info.vLastPos; CFixVector::Normalize (fn); CFixVector::Normalize (mn); d = CFixVector::Dot (fn, mn); if (d >= -I2X (1) / 2) bForward = 1; else { if (bForward) { if ((nSmoke = particleManager.GetObjectSystem (nObject)) >= 0) { KillObjectSmoke (nObject); particleManager.Destroy (nSmoke); } bForward = 0; nScale = 0; return; } } } #if 0 if (EGI_FLAG (bThrusterFlames, 1, 1, 0)) { if ((a <= I2X (1) / 4) && (a || !gameStates.input.bControlsSkipFrame)) //no thruster flames if moving backward DropAfterburnerBlobs (objP, 2, I2X (1), -1, gameData.objs.consoleP, 1); //I2X (1) / 4); } #endif if ((gameData.app.nGameMode & GM_NETWORK) && !gameData.multiplayer.players [nPlayer].connected) nParts = 0; else if (objP->info.nFlags & (OF_SHOULD_BE_DEAD | OF_DESTROYED)) nParts = 0; else if ((nPlayer == gameData.multiplayer.nLocalPlayer) && (gameStates.app.bPlayerIsDead || (gameData.multiplayer.players [nPlayer].shields < 0))) nParts = 0; else { nSmoke = X2IR (gameData.multiplayer.players [nPlayer].shields); nParts = 10 - nSmoke / 5; nScale = X2F (objP->info.xSize); if (nSmoke <= 25) nScale /= 1.5; else if (nSmoke <= 50) nScale /= 2; else nScale /= 3; if (nParts <= 0) { nType = 2; //nParts = (gameStates.entropy.nTimeLastMoved < 0) ? 250 : 125; } else { CreateDamageExplosion (nParts, nObject); nType = (nSmoke > 25); nParts *= 25; nParts += 75; } nParts = objP->mType.physInfo.thrust.IsZero () ? SHIP_MAX_PARTS : SHIP_MAX_PARTS / 2; if (SHOW_SMOKE && nParts && gameOpts->render.particles.bPlayers) { if (gameOpts->render.particles.bSyncSizes) { nParts = -MAX_PARTICLES (nParts, gameOpts->render.particles.nDens [0]); nScale = PARTICLE_SIZE (gameOpts->render.particles.nSize [0], nScale); } else { nParts = -MAX_PARTICLES (nParts, gameOpts->render.particles.nDens [1]); nScale = PARTICLE_SIZE (gameOpts->render.particles.nSize [1], nScale); } if (!objP->mType.physInfo.thrust.IsZero ()) vDirP = NULL; else { // if the ship is standing still, let the thruster smoke move away from it nParts /= 2; nScale /= 2; vDir = OBJPOS (objP)->mOrient.FVec () * (I2X (1) / 8); vDir = -vDir; vDirP = &vDir; } if (0 > (nSmoke = particleManager.GetObjectSystem (nObject))) { //PrintLog ("creating CPlayerData smoke\n"); nSmoke = particleManager.Create (&objP->info.position.vPos, vDirP, NULL, objP->info.nSegment, 2, nParts, nScale, gameOpts->render.particles.nSize [1], 2, PLR_PART_LIFE / (nType + 1) * (vDirP ? 2 : 1), PLR_PART_SPEED, SMOKE_PARTICLES, nObject, smokeColors + nType, 1, -1); if (nSmoke < 0) return; particleManager.SetObjectSystem (nObject, nSmoke); } else { if (vDirP) particleManager.SetDir (nSmoke, vDirP); particleManager.SetLife (nSmoke, PLR_PART_LIFE / (nType + 1) * (vDirP ? 2 : 1)); particleManager.SetType (nSmoke, SMOKE_PARTICLES); particleManager.SetScale (nSmoke, -nScale); particleManager.SetDensity (nSmoke, nParts, gameOpts->render.particles.bSyncSizes ? -1 : gameOpts->render.particles.nSize [1]); particleManager.SetSpeed (particleManager.GetObjectSystem (nObject), objP->mType.physInfo.thrust.IsZero () ? PLR_PART_SPEED * 2 : PLR_PART_SPEED); } CalcThrusterPos (objP, &ti, 0); for (int i = 0; i < 2; i++) if ((emitterP = particleManager.GetEmitter (nSmoke, i))) emitterP->SetPos (ti.vPos + i, NULL, objP->info.nSegment); DoGatlingSmoke (objP); return; } } KillObjectSmoke (nObject); KillGatlingSmoke (objP); }
void SetRenderView (fix nEyeOffset, short *pnStartSeg, int bOglScale) { short nStartSeg; gameData.render.mine.viewerEye = gameData.objs.viewerP->info.position.vPos; if (nEyeOffset) { gameData.render.mine.viewerEye += gameData.objs.viewerP->info.position.mOrient.RVec () * nEyeOffset; } externalView.SetPos (NULL); if (gameStates.render.cameras.bActive) { nStartSeg = gameData.objs.viewerP->info.nSegment; G3SetViewMatrix (gameData.render.mine.viewerEye, gameData.objs.viewerP->info.position.mOrient, gameStates.render.xZoom, bOglScale); } else { if (!pnStartSeg) nStartSeg = gameStates.render.nStartSeg; else { nStartSeg = FindSegByPos (gameData.render.mine.viewerEye, gameData.objs.viewerP->info.nSegment, 1, 0); if (!gameStates.render.nWindow && (gameData.objs.viewerP == gameData.objs.consoleP)) { externalView.SetPoint (gameData.objs.viewerP); if (nStartSeg == -1) nStartSeg = gameData.objs.viewerP->info.nSegment; } } if ((gameData.objs.viewerP == gameData.objs.consoleP) && transformation.m_info.bUsePlayerHeadAngles) { CFixMatrix mHead, mView; mHead = CFixMatrix::Create(transformation.m_info.playerHeadAngles); mView = gameData.objs.viewerP->info.position.mOrient * mHead; G3SetViewMatrix (gameData.render.mine.viewerEye, mView, gameStates.render.xZoom, bOglScale); } else if (gameStates.render.bRearView && (gameData.objs.viewerP == gameData.objs.consoleP)) { #if 1 CFixMatrix mView; mView = gameData.objs.viewerP->info.position.mOrient; mView.FVec ().Neg (); mView.RVec ().Neg (); #else CFixMatrix mHead, mView; transformation.m_info.playerHeadAngles [PA] = 0; transformation.m_info.playerHeadAngles [BA] = 0x7fff; transformation.m_info.playerHeadAngles [HA] = 0x7fff; VmAngles2Matrix (&mHead, &transformation.m_info.playerHeadAngles); VmMatMul (&mView, &gameData.objs.viewerP->info.position.mOrient, &mHead); #endif G3SetViewMatrix (gameData.render.mine.viewerEye, mView, //gameStates.render.xZoom, bOglScale); FixDiv (gameStates.render.xZoom, gameStates.zoom.nFactor), bOglScale); } else if ((gameData.objs.viewerP == gameData.objs.consoleP) && (!IsMultiGame || gameStates.app.bHaveExtraGameInfo [1])) { gameStates.zoom.nMinFactor = I2X (gameStates.render.glAspect); gameStates.zoom.nMaxFactor = gameStates.zoom.nMinFactor * 5; HandleZoom (); if ((gameData.objs.viewerP == gameData.objs.consoleP) && #if DBG gameStates.render.bChaseCam) { #else gameStates.render.bChaseCam && (!IsMultiGame || IsCoopGame || EGI_FLAG (bEnableCheats, 0, 0, 0))) { #endif externalView.GetViewPoint (); G3SetViewMatrix (gameData.render.mine.viewerEye, externalView.GetPos () ? externalView.GetPos ()->mOrient : gameData.objs.viewerP->info.position.mOrient, gameStates.render.xZoom, bOglScale); } else G3SetViewMatrix (gameData.render.mine.viewerEye, gameData.objs.viewerP->info.position.mOrient, FixDiv (gameStates.render.xZoom, gameStates.zoom.nFactor), bOglScale); }
void UpdatePlayerWeaponInfo (void) { int i, bUpdate = 0; tWeaponState *wsP = gameData.multiplayer.weaponStates + gameData.multiplayer.nLocalPlayer; tFiringData *fP; if (gameStates.app.bPlayerIsDead) gameData.weapons.firing [0].nStart = gameData.weapons.firing [0].nDuration = gameData.weapons.firing [0].nStop = gameData.weapons.firing [1].nStart = gameData.weapons.firing [1].nDuration = gameData.weapons.firing [1].nStop = 0; else UpdateFiringState (); if (wsP->nPrimary != gameData.weapons.nPrimary) { wsP->nPrimary = gameData.weapons.nPrimary; bUpdate = 1; } if (wsP->nSecondary != gameData.weapons.nSecondary) { wsP->nSecondary = gameData.weapons.nSecondary; bUpdate = 1; } if (wsP->bQuadLasers != ((LOCALPLAYER.flags & PLAYER_FLAGS_QUAD_LASERS) != 0)) { wsP->bQuadLasers = ((LOCALPLAYER.flags & PLAYER_FLAGS_QUAD_LASERS) != 0); bUpdate = 1; } for (i = 0, fP = wsP->firing; i < 2; i++, fP++) { if (fP->nStart != gameData.weapons.firing [i].nStart) { fP->nStart = gameData.weapons.firing [i].nStart; bUpdate = 1; } if (fP->nDuration != gameData.weapons.firing [i].nDuration) { fP->nDuration = gameData.weapons.firing [i].nDuration; bUpdate = 1; } if (fP->nStop != gameData.weapons.firing [i].nStop) { fP->nStop = gameData.weapons.firing [i].nStop; bUpdate = 1; } if (gameData.weapons.firing [i].bSound == 1) { fP->bSound = 1; gameData.weapons.firing [i].bSound = 0; } if (fP->bSpeedUp != EGI_FLAG (bGatlingSpeedUp, 1, 0, 0)) { fP->bSpeedUp = EGI_FLAG (bGatlingSpeedUp, 1, 0, 0); bUpdate = 1; } } if (wsP->nMissiles != LOCALPLAYER.secondaryAmmo [gameData.weapons.nSecondary]) { wsP->nMissiles = (char) LOCALPLAYER.secondaryAmmo [gameData.weapons.nSecondary]; bUpdate = 1; } if (wsP->nLaserLevel != LOCALPLAYER.laserLevel) { wsP->nLaserLevel = LOCALPLAYER.laserLevel; bUpdate = 1; } if (wsP->bTripleFusion != gameData.weapons.bTripleFusion) { wsP->bTripleFusion = gameData.weapons.bTripleFusion; bUpdate = 1; } if (wsP->nMslLaunchPos != (gameData.laser.nMissileGun & 3)) { wsP->nMslLaunchPos = gameData.laser.nMissileGun & 3; bUpdate = 1; } if (wsP->xMslFireTime != gameData.missiles.xNextFireTime) { wsP->xMslFireTime = gameData.missiles.xNextFireTime; bUpdate = 1; } if (bUpdate) MultiSendPlayerWeapons (gameData.multiplayer.nLocalPlayer); UpdateFiringSounds (); }