//
// Copyright 2020 Electronic Arts Inc.
//
// TiberianDawn.DLL and RedAlert.dll and corresponding 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.

// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed 
// in the hope that it will be useful, but with permitted additional restrictions 
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT 
// distributed with this program. You should have received a copy of the 
// GNU General Public License along with permitted additional restrictions 
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection

/***********************************************************************************************
 ***              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 : Command & Conquer - Red Alert                                *
 *                                                                                             *
 *                    File Name : VORTEX.H                                                     *
 *                                                                                             *
 *                   Programmer : Steve Tall                                                   *
 *                                                                                             *
 *                   Start Date : 8/12/96                                                      *
 *                                                                                             *
 *                  Last Update : August 29th, 1996 [ST]                                       *
 *                                                                                             *
 *---------------------------------------------------------------------------------------------*
 *  Overview:                                                                                  *
 *    Definition of ChronalVortexClass. The Chronal vortex sometimes appears when the          *
 *  chronosphere is used.                                                                      *
 *                                                                                             *
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

#ifndef VORTEX_H
#define VORTEX_H


#define MAX_REMAP_SHADES 16		//Number of lookup tables required for vortex shading.
#define VORTEX_FRAMES		16		//Number of frames in one complete rotation of the vortex.



class ChronalVortexClass {

	public:

		/*
		** Constructor and destructor.
		*/
		ChronalVortexClass(void);
		~ChronalVortexClass(void);

		void Detach(TARGET target);

		/*
		** Makes the vortex appear at the specified coordinate.
		*/
		void Appear (COORDINATE coordinate);

		/*
		** Makes the vortex go away.
		*/
		void Disappear (void);

		/*
		** Call this every frame.
		*/
		void AI (void);

		/*
		** Render the vortex
		*/
		void Render (void);

		/*
		** Flags cells under the vortex to be redrawn
		*/
		void Set_Redraw (void);

		/*
		** Call whenever the theater changes to recalculate the shading lookup tables
		*/
		void Setup_Remap_Tables (TheaterType theater);

		/*
		** Functions to load and save the vortex.
		*/
		void Load(Straw &file);
		void Save(Pipe  &file);

		/*
		** Returns true of vortex is currently active.
		*/
		bool Is_Active(void) {return (Active);};

		/*
		** Makes the vortex attack the specified target. Target must be in range of the vortex.
		*/
		void Set_Target (ObjectClass *target);

		/*
		** Disables the vortex.
		*/
		void Stop(void);

		/*
		** Members to allow read access to private data
		*/
		COORDINATE Get_Position  (void) {return (Position);};
		int Get_Range  (void) {return (Range);};
		int Get_Speed  (void) {return (Speed);};
		int Get_Damage (void) {return (Damage);};

		/*
		** Members to allow write access to private data.
		*/
		void Set_Range  (int range) {Range = range;};
		void Set_Speed  (int speed) {Speed = speed;};
		void Set_Damage (int damage) {Damage = damage;};

		/*
		** Possible states the vortex can be in.
		*/
		typedef enum AnimStateType : unsigned char {
			STATE_GROW,			//Vortex has just appeared and is growing larger
			STATE_ROTATE,		//Vortex is rotating
			STATE_SHRINK		//Vortex is shrinking and about to disappear
		}AnimStateType;

	private:

		/*
		** Members for setting up the lookup tables.
		*/
		void Build_Fading_Table (PaletteClass const & palette, void * dest, int color, int frac);
		void Coordinate_Remap ( GraphicViewPortClass *inbuffer, int x, int y, int width, int height, unsigned char *remap_table);

		/*
		** Misc internal functions
		*/
		void Attack(void);
		void Zap_Target(void);
		void Movement(void);
		void Hide(void);
		void Show(void);

		/*
		** Position of the top left of the vortex
		*/
		COORDINATE		Position;

		/*
		** Direction of rotation
		*/
		int         	AnimateDir;

		/*
		** Current frame of animation
		*/
		int				AnimateFrame;

		/*
		** Animation flag. When 0 vortex will animate 1 frame.
		*/
		int				Animate;

		/*
		** State of vortex. See ENUM for info.
		*/
		AnimStateType	State;

		/*
		** Color lookup tables for shading on vortex.
		*/
		unsigned char 	VortexRemapTables [MAX_REMAP_SHADES][256];

		/*
		** Color lookup table to make the blue lightning orange.
		*/
		unsigned char	LightningRemap[256];

		/*
		** Is vortex currently active?
		*/
		int				Active 			: 1;

		/*
		** Is the vortex winding down?
		*/
		int				StartShutdown 	: 1;

		/*
		** Is the vortex about to hide from view?
		*/
		int				StartHiding		: 1;

		/*
		** Is the vortex active but hidden?
		*/
		int				Hidden			: 1;

		/*
		** Theater that lookup table is good for.
		*/
		TheaterType		Theater;

		/*
		** Last frame that vortex attacked on
		*/
		int				LastAttackFrame;

		/*
		** How many times lightning has zapped on this attack
		*/
		int				ZapFrame;

		/*
		** Ptr to object that the vortex is zapping
		*/
		TARGET	TargetObject;
//		ObjectClass		*TargetObject;

		/*
		** Distance to the target object
		*/
		int				TargetDistance;

		/*
		** Game frame that vortex hid on.
		*/
		int				HiddenFrame;

		/*
		** Direction vortex is going in.
		*/
		int				XDir;
		int				YDir;

		/*
		** Direction vortex should be going in
		*/
		int				DesiredXDir;
		int				DesiredYDir;

		/*
		** Range in cells of the vortex lightning
		*/
		int				Range;

		/*
		** Max speed in leptons per frame of the vortex.
		*/
		int				Speed;

		/*
		** Damge of vortex lightning zap.
		*/
		int				Damage;

		/*
		** Offscreen buffer to render vortex into. This is needed so we can handle clipping.
		*/
		GraphicBufferClass *RenderBuffer;
};


#endif