186 lines
4.5 KiB
C++
186 lines
4.5 KiB
C++
|
/*
|
||
|
===========================================================================
|
||
|
|
||
|
Doom 3 GPL Source Code
|
||
|
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
|
||
|
|
||
|
This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).
|
||
|
|
||
|
Doom 3 Source Code is free software: you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation, either version 3 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
Doom 3 Source Code is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
|
||
|
|
||
|
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
|
||
|
|
||
|
===========================================================================
|
||
|
*/
|
||
|
|
||
|
#include "../idlib/precompiled.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "Game_local.h"
|
||
|
|
||
|
/*
|
||
|
|
||
|
game_endlevel.cpp
|
||
|
|
||
|
This entity is targeted to complete a level, and it also handles
|
||
|
running the stats and moving the camera.
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
CLASS_DECLARATION( idEntity, idTarget_EndLevel )
|
||
|
EVENT( EV_Activate, idTarget_EndLevel::Event_Trigger )
|
||
|
END_CLASS
|
||
|
|
||
|
/*
|
||
|
================
|
||
|
idTarget_EndLevel::Spawn
|
||
|
================
|
||
|
*/
|
||
|
void idTarget_EndLevel::Spawn( void ) {
|
||
|
idStr guiName;
|
||
|
|
||
|
gui = NULL;
|
||
|
noGui = spawnArgs.GetBool("noGui");
|
||
|
if (!noGui) {
|
||
|
spawnArgs.GetString( "guiName", "guis/EndLevel.gui", guiName );
|
||
|
|
||
|
if (guiName.Length()) {
|
||
|
gui = idUserInterface::FindGui( guiName, true, false, true );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
buttonsReleased = false;
|
||
|
readyToExit = false;
|
||
|
|
||
|
exitCommand = "";
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
================
|
||
|
idTarget_EndLevel::~idTarget_EndLevel()
|
||
|
================
|
||
|
*/
|
||
|
idTarget_EndLevel::~idTarget_EndLevel() {
|
||
|
//FIXME: need to go to smart ptrs for gui allocs or the unique method
|
||
|
//delete gui;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
================
|
||
|
idTarget_EndLevel::Event_Trigger
|
||
|
================
|
||
|
*/
|
||
|
void idTarget_EndLevel::Event_Trigger( idEntity *activator ) {
|
||
|
if ( gameLocal.endLevel ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// mark the endLevel, which will modify some game actions
|
||
|
// and pass control to us for drawing the stats and camera position
|
||
|
gameLocal.endLevel = this;
|
||
|
|
||
|
// grab the activating player view position
|
||
|
idPlayer *player = (idPlayer *)(activator);
|
||
|
|
||
|
initialViewOrg = player->GetEyePosition();
|
||
|
initialViewAngles = idVec3( player->viewAngles[0], player->viewAngles[1], player->viewAngles[2] );
|
||
|
|
||
|
// kill all the sounds
|
||
|
gameSoundWorld->StopAllSounds();
|
||
|
|
||
|
if ( noGui ) {
|
||
|
readyToExit = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
================
|
||
|
idTarget_EndLevel::Draw
|
||
|
================
|
||
|
*/
|
||
|
void idTarget_EndLevel::Draw() {
|
||
|
|
||
|
if (noGui) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
renderView_t renderView;
|
||
|
|
||
|
memset( &renderView, 0, sizeof( renderView ) );
|
||
|
|
||
|
renderView.width = SCREEN_WIDTH;
|
||
|
renderView.height = SCREEN_HEIGHT;
|
||
|
renderView.x = 0;
|
||
|
renderView.y = 0;
|
||
|
|
||
|
renderView.fov_x = 90;
|
||
|
renderView.fov_y = gameLocal.CalcFovY( renderView.fov_x );
|
||
|
renderView.time = gameLocal.time;
|
||
|
|
||
|
#if 0
|
||
|
renderView.vieworg = initialViewOrg;
|
||
|
renderView.viewaxis = idAngles(initialViewAngles).toMat3();
|
||
|
#else
|
||
|
renderView.vieworg = renderEntity.origin;
|
||
|
renderView.viewaxis = renderEntity.axis;
|
||
|
#endif
|
||
|
|
||
|
gameRenderWorld->RenderScene( &renderView );
|
||
|
|
||
|
// draw the gui on top of the 3D view
|
||
|
gui->Redraw(gameLocal.time);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
================
|
||
|
idTarget_EndLevel::PlayerCommand
|
||
|
================
|
||
|
*/
|
||
|
void idTarget_EndLevel::PlayerCommand( int buttons ) {
|
||
|
if ( !( buttons & BUTTON_ATTACK ) ) {
|
||
|
buttonsReleased = true;
|
||
|
return;
|
||
|
}
|
||
|
if ( !buttonsReleased ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// we will exit at the end of the next game frame
|
||
|
readyToExit = true;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
================
|
||
|
idTarget_EndLevel::ExitCommand
|
||
|
================
|
||
|
*/
|
||
|
const char *idTarget_EndLevel::ExitCommand() {
|
||
|
if ( !readyToExit ) {
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
idStr nextMap;
|
||
|
|
||
|
if (spawnArgs.GetString( "nextMap", "", nextMap )) {
|
||
|
sprintf( exitCommand, "map %s", nextMap.c_str() );
|
||
|
} else {
|
||
|
exitCommand = "";
|
||
|
}
|
||
|
|
||
|
return exitCommand;
|
||
|
}
|