/*
**	Command & Conquer Renegade(tm)
**	Copyright 2025 Electronic Arts Inc.
**
**	This program 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.
**
**	This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/*********************************************************************************************** 
 ***                            Confidential - Westwood Studios                              *** 
 *********************************************************************************************** 
 *                                                                                             * 
 *                 Project Name : Commando                                                     * 
 *                                                                                             * 
 *                     $Archive:: /Commando/Code/Combat/transition.h                          $* 
 *                                                                                             * 
 *                      $Author:: Patrick                                                     $* 
 *                                                                                             * 
 *                     $Modtime:: 11/16/01 3:18p                                              $* 
 *                                                                                             * 
 *                    $Revision:: 22                                                          $* 
 *                                                                                             * 
 *---------------------------------------------------------------------------------------------* 
 * Functions:                                                                                  * 
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

#if defined(_MSC_VER)
#pragma once
#endif

#ifndef	TRANSITION_H
#define	TRANSITION_H

#include "always.h"
#include "matrix3d.h"
#include "aabox.h"
#include "gameobjref.h"
#include "vector.h"
#include "obbox.h"
#include "wwstring.h"

class	SoldierGameObj;
class	VehicleGameObj;

/*
** TransitionDataClass
*/
class TransitionDataClass {

public:
	TransitionDataClass( void );
	~TransitionDataClass( void )	{ }

	bool	Save( ChunkSaveClass & csave );
	bool	Load( ChunkLoadClass & cload );

	typedef enum {
		DISABLED							= -1,
		LADDER_EXIT_TOP				= 0,
		LADDER_EXIT_BOTTOM,
		LADDER_ENTER_TOP,
		LADDER_ENTER_BOTTOM,
		LEGACY_VEHICLE_ENTER_0,
		LEGACY_VEHICLE_ENTER_1,
		LEGACY_VEHICLE_EXIT_0,
		LEGACY_VEHICLE_EXIT_1,
		VEHICLE_ENTER,
		VEHICLE_EXIT,
		NUM_TRANSITION_TYPE
	} StyleType;

	static int	Get_Num_Types( void )	{ return NUM_TRANSITION_TYPE; }
	static const char * Get_Type_Name( StyleType type );

	StyleType	Get_Type( void ) const	{ return Type; }
	void	Set_Type( StyleType type )		{ Type = type;	}

	const OBBoxClass & Get_Zone( void ) const { return Zone; }
	void	Set_Zone( const OBBoxClass & zone )	{ Zone = zone; }

	const char * Get_Animation_Name( void ) const 	{ return AnimationName; }
	void	Set_Animation_Name( const char * name )	{ AnimationName = name; }

	const Matrix3D & Get_Ending_TM( void ) const { return EndingTM; }
	void	Set_Ending_TM( const Matrix3D & tm )	{ EndingTM = tm; }

private:
	StyleType		Type;
	OBBoxClass		Zone;
	StringClass		AnimationName;
	Matrix3D			EndingTM;
};

typedef DynamicVectorClass<TransitionDataClass *> TRANSITION_DATA_LIST;


/*
** TransitionCompletionDataClass
*/
struct	TransitionCompletionDataStruct {

public:
	bool	Save( ChunkSaveClass & csave );
	bool	Load( ChunkLoadClass & cload );

	TransitionDataClass::StyleType	Type;
	GameObjReference			Vehicle;

};

/*
** TransitionInstanceClass
*/
class	TransitionInstanceClass {

public:
	TransitionInstanceClass( const TransitionDataClass & data );
	~TransitionInstanceClass( void );

	// Check for Triggering
	bool				Check( SoldierGameObj *obj, bool action_trigger );
	void				Start( SoldierGameObj *obj );
	static	void	End( SoldierGameObj *obj, TransitionCompletionDataStruct * data );

	TransitionDataClass::StyleType	Get_Type( void ) const 	{ return Data.Get_Type(); }

	void		Set_Parent_Transform( const Matrix3D & tm );

	VehicleGameObj * Get_Vehicle( void )	{ return (VehicleGameObj*)Vehicle.Get_Ptr(); }
	void		Set_Vehicle( VehicleGameObj * vehicle )	{ Vehicle = (GameObjRefPtr)vehicle; }

	// Accessors
	const OBBoxClass &	Get_Zone( void ) const			{ return Zone; }
	const Matrix3D &		Get_Ending_TM( void ) const	{ return EndingTM; }

	int		Get_Ladder_Index( void )					{ return LadderIndex; }
	void		Set_Ladder_Index( int ladder_index )	{ LadderIndex = ladder_index; }

protected:
	Matrix3D							EndingTM;
	OBBoxClass						Zone;
	GameObjReference				Vehicle;
	const	TransitionDataClass & Data;
	int								LadderIndex;
};

/*
**
*/
class	TransitionManager {

public:
	static	void					Reset( void );
	static	void					Add( TransitionInstanceClass * transition );
	static	void					Destroy( TransitionInstanceClass * transition );
	static	void					Destroy_Pending( void );

	static	bool					Check( SoldierGameObj *obj, bool action_trigger );

	static void						Build_Ladder_List (DynamicVectorClass<TransitionInstanceClass *> &list);
};

#endif	//	TRANSITION_H