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 (); } } }
void do_countdown_frame() { fix old_time; int fc, div_scale; if (!Control_center_destroyed) return; #if !defined(D2_OEM) && !defined(SHAREWARE) // get countdown in OEM and SHAREWARE only // On last level, we don't want a countdown. if ((Current_mission_num == 0) && (Current_level_num == Last_level)) { if (!(Game_mode & GM_MULTI)) return; if (Game_mode & GM_MULTI_ROBOTS) return; } #endif // Control center destroyed, rock the player's ship. fc = Countdown_seconds_left; if (fc > 16) fc = 16; // At Trainee, decrease rocking of ship by 4x. div_scale = 1; if (Difficulty_level == 0) div_scale = 4; ConsoleObject->mtype.phys_info.rotvel.x += (fixmul(rand() - 16384, 3*F1_0/16 + (F1_0*(16-fc))/32))/div_scale; ConsoleObject->mtype.phys_info.rotvel.z += (fixmul(rand() - 16384, 3*F1_0/16 + (F1_0*(16-fc))/32))/div_scale; // Hook in the rumble sound effect here. old_time = Countdown_timer; Countdown_timer -= RealFrameTime; Countdown_seconds_left = f2i(Countdown_timer + F1_0*7/8); if ( (old_time > COUNTDOWN_VOICE_TIME ) && (Countdown_timer <= COUNTDOWN_VOICE_TIME) ) { digi_play_sample( SOUND_COUNTDOWN_13_SECS, F3_0 ); } if ( f2i(old_time + F1_0*7/8) != Countdown_seconds_left ) { if ( (Countdown_seconds_left>=0) && (Countdown_seconds_left<10) ) digi_play_sample( SOUND_COUNTDOWN_0_SECS+Countdown_seconds_left, F3_0 ); if ( Countdown_seconds_left==Total_countdown_time-1) digi_play_sample( SOUND_COUNTDOWN_29_SECS, F3_0 ); } if (Countdown_timer > 0) { fix size,old_size; size = (i2f(Total_countdown_time)-Countdown_timer) / fl2f(0.65); old_size = (i2f(Total_countdown_time)-old_time) / fl2f(0.65); if (size != old_size && (Countdown_seconds_left < (Total_countdown_time-5) )) { // Every 2 seconds! //@@if (Dead_controlcen_object_num != -1) { //@@ vms_vector vp; //,v,c; //@@ compute_segment_center(&vp, &Segments[Objects[Dead_controlcen_object_num].segnum]); //@@ object_create_explosion( Objects[Dead_controlcen_object_num].segnum, &vp, size*10, VCLIP_SMALL_EXPLOSION); //@@} digi_play_sample( SOUND_CONTROL_CENTER_WARNING_SIREN, F3_0 ); } } else { int flash_value; if (old_time > 0) digi_play_sample( SOUND_MINE_BLEW_UP, F1_0 ); flash_value = f2i(-Countdown_timer * (64 / 4)); // 4 seconds to total whiteness PALETTE_FLASH_SET(flash_value,flash_value,flash_value); if (PaletteBlueAdd > 64 ) { WINDOS( dd_gr_set_current_canvas(NULL), gr_set_current_canvas( NULL ) ); WINDOS( dd_gr_clear_canvas(BM_XRGB(31,31,31)), gr_clear_canvas(BM_XRGB(31,31,31)) ); //make screen all white to match palette effect reset_cockpit(); //force cockpit redraw next time reset_palette_add(); //restore palette for death message //controlcen->MaxCapacity = Fuelcen_max_amount; //gauge_message( "Control Center Reset" ); DoPlayerDead(); //kill_player(); } } }