/*
**	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/>.
*/

/***********************************************************************************************
 ***              C O N F I D E N T I A L  ---  W E S T W O O D  S T U D I O S               ***
 ***********************************************************************************************
 *                                                                                             *
 *                 Project Name : Combat                                                       *
 *                                                                                             *
 *                     $Archive:: /Commando/Code/Combat/buildingaggregate.h                   $*
 *                                                                                             *
 *              Original Author:: Greg Hjelstrom                                               *
 *                                                                                             *
 *                      $Author:: Byon_g                                                      $*
 *                                                                                             *
 *                     $Modtime:: 11/21/01 2:47p                                              $*
 *                                                                                             *
 *                    $Revision:: 8                                                           $*
 *                                                                                             *
 *---------------------------------------------------------------------------------------------*
 * Functions:                                                                                  *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */


#if defined(_MSC_VER)
#pragma once
#endif

#ifndef BUILDINGAGGREGATE_H
#define BUILDINGAGGREGATE_H

#include "always.h"
#include "staticanimphys.h"
#include "buildingstate.h"


class BuildingAggregateDefClass;


/**
** BuildingAggregateClass (BAG)
** This class implements the behavior of a "building aggregate".  Building aggregates are animated 
** static objects which display segments of their animation depending on the state of the building.  
*/
class	BuildingAggregateClass : public StaticAnimPhysClass 
{
public:

	//	Constructor and Destructor
	BuildingAggregateClass( void );
	virtual ~BuildingAggregateClass( void );

	// Definitions
	void	Init( const BuildingAggregateDefClass & definition );
	const BuildingAggregateDefClass * Get_BuildingAggregateDef( void ) const { WWASSERT( Definition ); return (BuildingAggregateDefClass *)Definition; }

	// State changing
	int				Get_Current_State(void);
	void				Set_Current_State(int new_state,bool force_update = false);
	bool				Is_MCT(void);

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

	virtual	void	Save_State( ChunkSaveClass & csave );
	virtual	void	Load_State( ChunkLoadClass & cload );

	virtual	void	On_Post_Load( void );
	virtual	const	PersistFactoryClass & Get_Factory( void ) const;

protected:
	
	bool				Is_Power_On(int state);

	int				CurrentState;

};



/**
** BuildingAggregateDefClass (BAGDef!)
** The data contained in this class defines the behavior of a "building aggregate".  Building
** aggregates are animated static objects which display segments of their animation depending
** on the state of the building.  
** Obviously, this is a very special case object; designed specifically to provide a set of
** features needed by the building logic in Renegade.
*/
class BuildingAggregateDefClass : public StaticAnimPhysDefClass 
{
public:
	BuildingAggregateDefClass(void);
	
	virtual uint32								Get_Class_ID( void ) const;
	virtual const char *						Get_Type_Name(void)				{ return "BuildingAggregateDef"; }
	virtual bool								Is_Type(const char *);
	virtual PersistClass *					Create( void ) const ;
	virtual bool								Save( ChunkSaveClass &csave );
	virtual bool								Load( ChunkLoadClass &cload );
	virtual const PersistFactoryClass &	Get_Factory( void ) const;

	DECLARE_EDITABLE( BuildingAggregateDefClass, StaticAnimPhysDefClass );

protected:

	bool											Save_State_Animation_Data(ChunkSaveClass & csave,int state_index);
	bool											Load_State_Animation_Data(ChunkLoadClass & cload,int state_index);

	/*
	** Animation Logic Setting
	** ANIM_LOGIC_LINEAR - Frame0 is used for each state, if the damage state changes, the animation
	**		is played to the new state's Frame0.  If the power state changes, we pop to the same relative
	**    position in the alternate power state.
	** ANIM_LOGIC_LOOP - In this mode, each state has a pair of frames which it loops between.  Whenever
	**		the state changes, we pop to the same relative position in the new loop.  In addition, certain
	**		states can have animation disabled; this will cause the object to freeze on the appropriate frame
	**		right after the state change.  
	*/
	enum 
	{
		ANIM_LOGIC_LINEAR						= 0,
		ANIM_LOGIC_LOOP,
		ANIM_LOGIC_SEQUENCE,
	};

	int											AnimLogicMode;
	bool											IsMCT;
	
	/*
	** Animation controls for each state.  In LOOP mode, we use Frame0 and Frame1 to define a loop.  In
	** Linear mode, only Frame0 is used.
	*/
	int											Frame0[BuildingStateClass::STATE_COUNT];
	int											Frame1[BuildingStateClass::STATE_COUNT];
	bool											AnimationEnabled[BuildingStateClass::STATE_COUNT];

	friend class BuildingAggregateClass;
};



#endif //BUILDINGAGGREGATE_H

