/*
===========================================================================

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.

===========================================================================
*/

// NOTE: even though this file is part of the Doom3 GPL source (but not the original SDK in game/),
//       it has never been part of the build (=> not compiled into base.dll)

#include "sys/platform.h"

#include "EndLevel.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;
}
