void Rail_Initialize() { for (int lane=0; lane<mRailLanes.size(); lane++) { mRailLanes[lane].Initialize(); } for (int mover=0; mover<mRailMovers.size(); mover++) { mRailMovers[mover].Initialize(); } // Precache All The Woosh Sounds //------------------------------- if (!mRailMovers.empty()) { mWooshMed.push_back(G_SoundIndex("sound/effects/woosh1")); mWooshSml.push_back(G_SoundIndex("sound/effects/woosh2")); mWooshMed.push_back(G_SoundIndex("sound/effects/woosh3")); mWooshSml.push_back(G_SoundIndex("sound/effects/woosh4")); mWooshLar.push_back(G_SoundIndex("sound/effects/woosh5")); mWooshSml.push_back(G_SoundIndex("sound/effects/woosh6")); mWooshSup.push_back(G_SoundIndex("sound/effects/woosh7")); mWooshSup.push_back(G_SoundIndex("sound/effects/woosh8")); mWooshSup.push_back(G_SoundIndex("sound/effects/woosh9")); mWooshLar.push_back(G_SoundIndex("sound/effects/woosh10")); mWooshLar.push_back(G_SoundIndex("sound/effects/woosh11")); mWooshLar.push_back(G_SoundIndex("sound/effects/woosh12")); mWooshSml.push_back(G_SoundIndex("sound/effects/woosh13")); mWooshMed.push_back(G_SoundIndex("sound/effects/woosh14")); mWooshMed.push_back(G_SoundIndex("sound/effects/woosh15")); mWooshMed.push_back(G_SoundIndex("sound/effects/woosh16")); mWooshSml.push_back(G_SoundIndex("sound/effects/woosh17")); mWooshMed.push_back(G_SoundIndex("sound/effects/woosh18")); mWooshMed.push_back(G_SoundIndex("sound/effects/woosh19")); mWooshMed.push_back(G_SoundIndex("sound/effects/woosh20")); mWooshMed.push_back(G_SoundIndex("sound/effects/woosh21")); mWooshLar.push_back(G_SoundIndex("sound/effects/woosh22")); mWooshLar.push_back(G_SoundIndex("sound/effects/woosh23")); mWooshSup.push_back(G_SoundIndex("sound/effects/woosh24")); mWooshSup.push_back(G_SoundIndex("sound/effects/woosh25")); mWooshMed.push_back(G_SoundIndex("sound/effects/woosh26")); mWooshMed.push_back(G_SoundIndex("sound/effects/woosh27")); mWooshMed.push_back(G_SoundIndex("sound/effects/woosh28")); mWooshLar.push_back(G_SoundIndex("sound/effects/woosh29")); mWooshTun.push_back(G_SoundIndex("sound/effects/whoosh_tunnel")); } }
bool Pilot_AnyVehiclesRegistered() { return (!mRegistered.empty()); }
void CRailTrack::Update() { mNextUpdateTime = level.time + mNextUpdateDelay; // Now, Attempt To Add A Number Of Movers To The Track //----------------------------------------------------- int attempt; int startCol; int stopCol; int atCol; int testColIndex; for (attempt=0; attempt<mNumMoversPerRow; attempt++) { // Randomly Select A Mover And Test To See If It Is Active //--------------------------------------------------------- CRailMover* mover = mMovers[Q_irand(0, mMovers.size()-1)]; if (mover->Active()) { continue; } // Don't Spawn Until Start Time Has Expired //------------------------------------------ if (level.time < ((mover->mLane)?(mover->mLane->mStartTime):(mStartTime))) { continue; } // If Center Locked, Stop Spawning Center Track Movers //----------------------------------------------------- if (mover->mCenter && mCenterLocked) { continue; } // Restrict It To A Lane //----------------------- if (mover->mLane) { startCol = mover->mLane->mMinCol; stopCol = mover->mLane->mMaxCol+1; } // Or Let It Go Anywhere On The Track //------------------------------------ else { startCol = 0; stopCol = mCols; } stopCol -= (mover->mCols-1); // If The Mover Is Too Big To Fit In The Lane, Go On To Next Attempt //------------------------------------------------------------------- if (stopCol<=startCol) { assert(0); // Should Not Happen continue; } // Force It To Center //-------------------- if (mover->mCenter && stopCol!=(startCol+1)) { startCol = ((mCols/2) - (mover->mCols/2)); stopCol = startCol+1; } // Construct A List Of Columns To Test For Insertion //--------------------------------------------------- mTestCols.clear(); for (int i=startCol; i<stopCol; i++) { mTestCols.push_back(i); } // Now Try All The Cols To See If The Building Can Fit //----------------------------------------------------- while (!mTestCols.empty()) { // Randomly Pick A Column, Then Remove It From The Vector //-------------------------------------------------------- testColIndex = Q_irand(0, mTestCols.size()-1); atCol = mTestCols[testColIndex]; mTestCols.erase_swap(testColIndex); if (TestMoverInCells(mover, atCol)) { // Ok, We've Found A Safe Column To Insert This Mover //---------------------------------------------------- InsertMoverInCells(mover, atCol); // Now Transport The Actual Mover Entity Into Position, Link It & Send It Off //---------------------------------------------------------------------------- CVec3 StartPos(mGridBottomLeftCorner); StartPos[mWAxis] += ((atCol * mGridCellSize) + ((mover->mCols/2.0f) * mGridCellSize)); StartPos[mHAxis] += (((mover->mRows/2.0f) * mGridCellSize) * ((mNegative)?(1):(-1))); StartPos[2] = 0; // If Centered, Actually Put It At EXACTLY The Right Position On The Width Axis //------------------------------------------------------------------------------ if (mover->mCenter) { StartPos[mWAxis] = mGridCenter[mWAxis]; float deltaOffset = mGridCenter[mWAxis] - mover->mOriginOffset[mWAxis]; if (deltaOffset<(mGridCellSize*0.5f) ) { StartPos[mWAxis] -= deltaOffset; } } StartPos -= mover->mOriginOffset; G_SetOrigin(mover->mEnt, StartPos.v); // Start It Moving //----------------- VectorCopy(StartPos.v, mover->mEnt->s.pos.trBase); VectorCopy(mVelocity.v, mover->mEnt->s.pos.trDelta); mover->mEnt->s.pos.trTime = level.time; mover->mEnt->s.pos.trDuration = mTravelTimeMilliseconds + (mNextUpdateDelay*mover->mRows); mover->mEnt->s.pos.trType = TR_LINEAR_STOP; mover->mEnt->s.eFlags &= ~EF_NODRAW; mover->mSoundPlayed = false; // Successfully Inserted This Mover. Now Move On To The Next Mover //------------------------------------------------------------------ break; } } } // Incriment The Current Row //--------------------------- mRow++; if (mRow>=mRows) { mRow = 0; } // Erase The Erase Row //--------------------- int EraseRow = mRow - MAX_ROW_HISTORY; if (EraseRow<0) { EraseRow += mRows; } for (int col=0; col<mCols; col++) { mCells.get(col, EraseRow) = 0; } }