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

/* $Header:   F:\projects\c&c\vcs\code\sidebar.cpv   2.13   02 Aug 1995 17:03:22   JOE_BOSTIC  $ */
/***********************************************************************************************
 ***             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                                            *
 *                                                                                             *
 *                    File Name : SIDEBARGlyphx.CPP                                            *
 *                                                                                             *
 *                   Programmer : Steve Tall                                                   *
 *                                                                                             *
 *                   Start Date : March 14th, 2019                                             *
 *                                                                                             *
 *                  Last Update : March 14th, 2019                                             *
 *                                                                                             *
 *---------------------------------------------------------------------------------------------*
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

#include	"function.h"
#include "SidebarGlyphx.h"


/*
**  ST - 3/14/2019 10:49AM
** 
**  We are going to need one sidebar per player for multiplayer with GlyphX. We can't have different maps / cell arrays per 
**  player though, so SidebarClass being in the middle of the map/display class hierarchy is a problem.
** 
**  All the class static data will have to be made non-static so we can have multiple instances.
** 
**  So, this is a stub sidebar class with the functionality we need just to support the exporting of production data to the
**  GlyphX client.
** 
** 
*/



/***********************************************************************************************
 * SidebarGlyphxClass::SidebarGlyphxClass -- Default constructor for the sidebar.              *
 *                                                                                             *
 *    Constructor for the sidebar handler. It basically sets up the sidebar to the empty       *
 *    condition.                                                                               *
 *                                                                                             *
 * INPUT:   none                                                                               *
 *                                                                                             *
 * OUTPUT:  none                                                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   11/17/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
SidebarGlyphxClass::SidebarGlyphxClass(void) :
	SidebarPlayerPtr(NULL)
{
	//IsRepairActive = false;
	//IsUpgradeActive = false;
	//IsDemolishActive = false;
}




/***********************************************************************************************
 * SidebarGlyphxClass::Init_Clear -- Sets sidebar to a known (and deactivated) state           *
 *                                                                                             *
 * INPUT:   none                                                                               *
 *                                                                                             *
 * OUTPUT:  none                                                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   12/24/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
void SidebarGlyphxClass::Init_Clear(HouseClass *player_ptr)
{
	SidebarPlayerPtr = player_ptr;
	
	//IsRepairActive = false;
	//IsUpgradeActive = false;
	//IsDemolishActive = false;

	Column[0].Set_Parent_Sidebar(this);
	Column[1].Set_Parent_Sidebar(this);

	Column[0].Init_Clear();
	Column[1].Init_Clear();


	//Activate(false);
}


/***********************************************************************************************
 * SidebarGlyphxClass::Init_IO -- Adds buttons to the button list                              *
 *                                                                                             *
 * INPUT:   none                                                                               *
 *                                                                                             *
 * OUTPUT:  none                                                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   12/24/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
void SidebarGlyphxClass::Init_IO(void)
{
	/*
	** If a game was loaded & the sidebar was enabled, pop it up now
	*/
	//if (IsSidebarActive) {
	//	IsSidebarActive = false;
	//	Activate(1);
	//}
}



/***********************************************************************************************
 * SidebarGlyphxClass::Which_Column -- Determines which column a given type should appear.     *
 *                                                                                             *
 *    Use this function to resolve what column the specified object type should be placed      *
 *    into.                                                                                    *
 *                                                                                             *
 * INPUT:   otype -- Pointer to the object type class of the object in question.               *
 *                                                                                             *
 * OUTPUT:  Returns with the column number that the object should be placed in.                *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   01/01/1995 JLB : Created.                                                                 *
 *=============================================================================================*/
int SidebarGlyphxClass::Which_Column(RTTIType type)
{
	if (type == RTTI_BUILDINGTYPE || type == RTTI_BUILDING) {
		return(0);
	}
	return(1);
}


/***********************************************************************************************
 * SidebarGlyphxClass::Factory_Link -- Links a factory to a sidebar strip.                     *
 *                                                                                             *
 *    This routine will link the specified factory to the sidebar strip. A factory must be     *
 *    linked to the sidebar so that as the factory production progresses, the sidebar will     *
 *    show the production progress.                                                            *
 *                                                                                             *
 * INPUT:   factory  -- The factory number to attach.                                          *
 *                                                                                             *
 *          type     -- The object type number.                                                *
 *                                                                                             *
 *          id       -- The object sub-type number.                                            *
 *                                                                                             *
 * OUTPUT:  Was the factory successfully attached to the sidebar strip?                        *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   05/19/1995 JLB : Created.                                                                 *
 *=============================================================================================*/
bool SidebarGlyphxClass::Factory_Link(int factory, RTTIType type, int id)
{
	return(Column[Which_Column(type)].Factory_Link(factory, type, id));
}



/***********************************************************************************************
 * SidebarGlyphxClass::Add -- Adds a game object to the sidebar list.                          *
 *                                                                                             *
 *    This routine is used to add a game object to the sidebar. Call this routine when a       *
 *    factory type building is created. It handles the case of adding an item that has already *
 *    been added -- it just ignores it.                                                        *
 *                                                                                             *
 * INPUT:   object   -- Pointer to the object that is being added.                             *
 *                                                                                             *
 * OUTPUT:  bool; Was the object added to the sidebar?                                         *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   11/17/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
bool SidebarGlyphxClass::Add(RTTIType type, int id, bool via_capture)
{
	int column;

	/*
	** Add the sidebar only if we're not in editor mode.
	*/
	if (!Debug_Map) {
		column = Which_Column(type);

		if (Column[column].Add(type, id, via_capture)) {
			//Activate(1);
			return(true);
		}
		return(false);
	}

	return(false);
}



/***********************************************************************************************
 * SidebarGlyphxClass::AI -- Handles player clicking on sidebar area.                          *
 *                                                                                             *
 *    This routine handles the processing necessary when the player clicks on the sidebar.     *
 *    Typically, this is selection of the item to build.                                       *
 *                                                                                             *
 * INPUT:   input -- Reference to the keyboard input value.                                    *
 *                                                                                             *
 *          x,y   -- Mouse coordinates at time of input.                                       *
 *                                                                                             *
 * OUTPUT:  bool; Was the click handled?                                                       *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   10/28/94   JLB : Created.                                                                 *
 *   11/11/1994 JLB : Processes input directly.                                                *
 *   12/26/1994 JLB : Uses factory manager class for construction handling.                    *
 *   12/31/1994 JLB : Simplified to use the sidebar strip class handlers.                      *
 *   12/31/1994 JLB : Uses mouse coordinate parameters.                                        *
 *   06/27/1995 JLB : <TAB> key toggles sidebar.                                               *
 *=============================================================================================*/
void SidebarGlyphxClass::AI(KeyNumType & input, int x, int y)
{
	if (!Debug_Map) {
		Column[0].AI(input, x, y);
		Column[1].AI(input, x, y);
	}
}


/***********************************************************************************************
 * SidebarGlyphxClass::Recalc -- Examines the sidebar data and updates it as necessary.        *
 *                                                                                             *
 *    Occasionally a factory gets destroyed. This routine must be called in such a case        *
 *    because it might be possible that sidebar object need to be removed. This routine will   *
 *    examine all existing objects in the sidebar class and if no possible factory can         *
 *    produce it, then it will be removed.                                                     *
 *                                                                                             *
 * INPUT:   none                                                                               *
 *                                                                                             *
 * OUTPUT:  none                                                                               *
 *                                                                                             *
 * WARNINGS:   This routine is exhaustive and thus time consuming. Only call it when really    *
 *             necessary. Such as when a factory is destroyed rather than when a non-factory   *
 *             is destroyed.                                                                   *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   11/30/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
void SidebarGlyphxClass::Recalc(void)
{
	Column[0].Recalc();
	Column[1].Recalc();
}



/***********************************************************************************************
 * SidebarGlyphxClass::StripClass::StripClass -- Default constructor for the side strip class. *
 *                                                                                             *
 *    This constructor is used to reset the side strip to default empty state.                 *
 *                                                                                             *
 * INPUT:   none                                                                               *
 *                                                                                             *
 * OUTPUT:  none                                                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   12/31/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
SidebarGlyphxClass::StripClass::StripClass(void)
{
	IsBuilding = false;
	BuildableCount = 0;
	for (int index = 0; index < MAX_BUILDABLES; index++) {
		Buildables[index].BuildableID = 0;
		Buildables[index].BuildableType = RTTI_NONE;
		Buildables[index].Factory = -1;
		Buildables[index].BuildableViaCapture = false;		// Added for new sidebar functionality. ST - 9/24/2019 3:10PM 
	}
	ParentSidebar = NULL;
}



/***********************************************************************************************
 * SidebarGlyphxClass::StripClass::Init_Clear -- Sets sidebar to a known (and deactivated) state*
 *                                                                                             *
 * INPUT:   none                                                                               *
 *                                                                                             *
 * OUTPUT:  none                                                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   12/24/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
void SidebarGlyphxClass::StripClass::Init_Clear(void)
{
	IsBuilding = false;
	BuildableCount = 0;

	/*
	** Since we're resetting the strips, clear out all the buildables & factory pointers.
	*/
	for (int index = 0; index < MAX_BUILDABLES; index++) {
		Buildables[index].BuildableID = 0;
		Buildables[index].BuildableType = RTTI_NONE;
		Buildables[index].Factory = -1;
		Buildables[index].BuildableViaCapture = false;		// Added for new sidebar functionality. ST - 9/24/2019 3:10PM 
	}
}




/***********************************************************************************************
 * SidebarGlyphxClass::StripClass::Add -- Add an object to the side strip.                     *
 *                                                                                             *
 *    Use this routine to add a buildable object to the side strip.                            *
 *                                                                                             *
 * INPUT:   object   -- Pointer to the object type that can be built and is to be added to     *
 *                      the side strip.                                                        *
 *                                                                                             *
 * OUTPUT:  bool; Was the object successfully added to the side strip? Failure could be the    *
 *                result of running out of room in the side strip array or the object might    *
 *                already be in the list.                                                      *
 *                                                                                             *
 * WARNINGS:   none.                                                                           *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   12/31/1994 JLB : Created.                                                                 *
 *=============================================================================================*/
bool SidebarGlyphxClass::StripClass::Add(RTTIType type, int id, bool via_capture)
{
	if (BuildableCount <= MAX_BUILDABLES) {
		for (int index = 0; index < BuildableCount; index++) {
			if (Buildables[index].BuildableType == type && Buildables[index].BuildableID == id) {
				return(false);
			}
		}
		if (!ScenarioInit && type != RTTI_SPECIAL) {
			Speak(VOX_NEW_CONSTRUCT);
		}
		Buildables[BuildableCount].BuildableType = type;
		Buildables[BuildableCount].BuildableID = id;
		Buildables[BuildableCount].Factory = -1;
		Buildables[BuildableCount].BuildableViaCapture = via_capture;
		BuildableCount++;
		return(true);
	}
	return(false);
}



/***********************************************************************************************
 * SidebarGlyphxClass::StripClass::AI -- Input and AI processing for the side strip.                 *
 *                                                                                             *
 *    The side strip AI processing is performed by this function. This function not only       *
 *    checks for player input, but also handles any graphic logic updating necessary as a      *
 *    result of flashing or construction animation.                                            *
 *                                                                                             *
 * INPUT:   input -- The player input code.                                                    *
 *                                                                                             *
 *          x,y   -- Mouse coordinate to use.                                                  *
 *                                                                                             *
 * OUTPUT:  bool; Did the AI detect that it will need a rendering change? If this routine      *
 *                returns true, then the Draw_It function should be called at the              *
 *                earliest opportunity.                                                        *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   12/31/1994 JLB : Created.                                                                 *
 *   12/31/1994 JLB : Uses mouse coordinate parameters.                                        *
 *=============================================================================================*/
bool SidebarGlyphxClass::StripClass::AI(KeyNumType & input, int , int )
{
	/*
	** This is needed as it's where units get queued for structure exit. ST -3/14/2019 12:03PM
	*/
	
	
	if (IsBuilding) {
		for (int index = 0; index < BuildableCount; index++) {
			int factoryid = Buildables[index].Factory;

			if (factoryid != -1) {
				FactoryClass * factory = Factories.Raw_Ptr(factoryid);

				if (factory && (factory->Has_Changed() || factory->Is_Blocked())) {
					
					if (factory->Has_Completed()) {

						/*
						**	Construction has been completed. Announce this fact to the player and
						**	try to get the object to automatically leave the factory. Buildings are
						**	the main exception to the ability to leave the factory under their own
						**	power.
						*/
						TechnoClass * pending = factory->Get_Object();
						if (pending) {
							switch (pending->What_Am_I()) {
								case RTTI_UNIT:
								case RTTI_AIRCRAFT:
									OutList.Add(EventClass(EventClass::PLACE, pending->What_Am_I(), -1));
									if (!factory->Is_Blocked()) {
										Speak(VOX_UNIT_READY);
									}
									break;

								case RTTI_BUILDING:
									if (!factory->Is_Blocked()) {
										Speak(VOX_CONSTRUCTION);
									}
									break;

								case RTTI_INFANTRY:
									OutList.Add(EventClass(EventClass::PLACE, pending->What_Am_I(), -1));
									if (!factory->Is_Blocked()) {
										Speak(VOX_UNIT_READY);
									}
									break;
							}
						}
					}
				}
			}
		}
	}

	return(false);
}




/***********************************************************************************************
 * SidebarGlyphxClass::StripClass::Recalc -- Revalidates the current sidebar list of objects.  *
 *                                                                                             *
 *    This routine will revalidate all the buildable objects in the sidebar. This routine      *
 *    comes in handy when a factory has been destroyed, and the sidebar needs to reflect any   *
 *    change that this requires. It checks every object to see if there is a factory available *
 *    that could produce it. If none can be found, then the object is removed from the         *
 *    sidebar.                                                                                 *
 *                                                                                             *
 * INPUT:   none                                                                               *
 *                                                                                             *
 * OUTPUT:  bool; The sidebar has changed as a result of this call?                            *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   01/19/1995 JLB : Created.                                                                 *
 *   06/26/1995 JLB : Doesn't collapse sidebar when buildables removed.                        *
 *=============================================================================================*/
bool SidebarGlyphxClass::StripClass::Recalc(void)
{
	int ok;

	if (Debug_Map || !BuildableCount) {
		return(false);
	}

	/*
	**	Sweep through all objects listed in the sidebar. If any of those object can
	**	not be created -- even in theory -- then they must be removed form the sidebar and
	**	any current production must be abandoned.
	*/
	for (int index = 0; index < BuildableCount; index++) {
		TechnoTypeClass const * tech = Fetch_Techno_Type(Buildables[index].BuildableType, Buildables[index].BuildableID);
		if (tech) {
			ok = tech->Who_Can_Build_Me(true, false, ParentSidebar->SidebarPlayerPtr->Class->House) != NULL;
		} else {
			switch (Buildables[index].BuildableID) {
				case SPC_ION_CANNON:
					ok = ParentSidebar->SidebarPlayerPtr->IonCannon.Is_Present();
					break;

				case SPC_NUCLEAR_BOMB:
					ok = ParentSidebar->SidebarPlayerPtr->NukeStrike.Is_Present();
					break;

				case SPC_AIR_STRIKE:
					ok = ParentSidebar->SidebarPlayerPtr->AirStrike.Is_Present();
					break;

				default:
					ok = false;
					break;
			}
		}

		if (!ok) {

			/*
			**	Removes this entry from the list.
			*/
			if (BuildableCount > 1 && index < BuildableCount-1) {
				memcpy(&Buildables[index], &Buildables[index+1], sizeof(Buildables[0])*((BuildableCount-index)-1));
			}
			BuildableCount--;
			index--;

			Buildables[BuildableCount].BuildableID = 0;
			Buildables[BuildableCount].BuildableType = RTTI_NONE;
			Buildables[BuildableCount].Factory = -1;
			Buildables[BuildableCount].BuildableViaCapture = false;
		}
	}

	return(false);
}



/***********************************************************************************************
 * SidebarGlyphxClass::StripClass::Factory_Link -- Links a factory to a sidebar button.              *
 *                                                                                             *
 *    This routine will link the specified factory to this sidebar strip. The exact button to  *
 *    link to is determined from the object type and id specified. A linked button is one that *
 *    will show appropriate construction animation (clock shape) that matches the state of     *
 *    the factory.                                                                             *
 *                                                                                             *
 * INPUT:   factory  -- The factory number to link to the sidebar.                             *
 *                                                                                             *
 *          type     -- The object type that this factory refers to.                           *
 *                                                                                             *
 *          id       -- The object sub-type that this factory refers to.                       *
 *                                                                                             *
 * OUTPUT:  Was the factory successfully attached? Failure would indicate that there is no     *
 *          object of the specified type and sub-type in the sidebar list.                     *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   05/18/1995 JLB : Created.                                                                 *
 *=============================================================================================*/
bool SidebarGlyphxClass::StripClass::Factory_Link(int factory, RTTIType type, int id)
{
	for (int index = 0; index < BuildableCount; index++) {
		if (Buildables[index].BuildableType == type && Buildables[index].BuildableID == id) {
			Buildables[index].Factory = factory;
			IsBuilding = true;

			return(true);
		}
	}
	return(false);
}


/***********************************************************************************************
 * SidebarGlyphxClass::Abandon_Production -- Stops production of the object specified.               *
 *                                                                                             *
 *    This routine is used to abandon production of the object specified. The factory will     *
 *    be completely disabled by this call.                                                     *
 *                                                                                             *
 * INPUT:   type     -- The object type that is to be abandoned. The sub-type is not needed    *
 *                      since it is presumed there can be only one type in production at any   *
 *                      one time.                                                              *
 *                                                                                             *
 *          factory  -- The factory number that is doing the production.                       *
 *                                                                                             *
 * OUTPUT:  Was the factory successfully abandoned?                                            *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   05/18/1995 JLB : Created.                                                                 *
 *=============================================================================================*/
bool SidebarGlyphxClass::Abandon_Production(RTTIType type, int factory)
{
	return(Column[Which_Column(type)].Abandon_Production(factory));
}


/***********************************************************************************************
 * SidebarGlyphxClass::StripClass::Abandon_Produ -- Abandons production associated with sidebar.     *
 *                                                                                             *
 *    Production of the object associated with this sidebar is abandoned when this routine is  *
 *    called.                                                                                  *
 *                                                                                             *
 * INPUT:   factory  -- The factory index that is to be suspended.                             *
 *                                                                                             *
 * OUTPUT:  Was the production abandonment successful?                                         *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   05/18/1995 JLB : Created.                                                                 *
 *   08/06/1995 JLB : More intelligent abandon logic for multiple factories.                   *
 *=============================================================================================*/
bool SidebarGlyphxClass::StripClass::Abandon_Production(int factory)
{
	bool noprod = true;
	bool abandon = false;
	for (int index = 0; index < BuildableCount; index++) {
		if (Buildables[index].Factory == factory) {
			Factories.Raw_Ptr(factory)->Abandon();
			Buildables[index].Factory = -1;
			abandon = true;
		} else {
			if (Buildables[index].Factory != -1) {
				noprod = false;
			}
		}
	}

	/*
	**	If there is no production whatsoever on this strip, then flag it so.
	*/
	if (noprod) {
		IsBuilding = false;
	}
	return(abandon);
}






/***********************************************************************************************
 * SidebarGlyphxClass::Code_Pointers -- Converts classes pointers to savable representation    *
 *                                                                                             *
 * INPUT:   none                                                                               *
 *                                                                                             *
 * OUTPUT:  none                                                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   9/25/2019 5:36PM ST : Created.                                                            *
 *=============================================================================================*/
void SidebarGlyphxClass::Code_Pointers(void)
{
	if (SidebarPlayerPtr) {
		((HouseClass *&)SidebarPlayerPtr) = (HouseClass *)SidebarPlayerPtr->Class->House;
	} else {
		((HouseClass *&)SidebarPlayerPtr) = (HouseClass *)HOUSE_NONE;
	}	
}


/***********************************************************************************************
 * SidebarGlyphxClass::Decode_Pointers -- Converts classes savable representation to run-time  *
 *                                                                                             *
 * INPUT:   none                                                                               *
 *                                                                                             *
 * OUTPUT:  none                                                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   9/25/2019 5:36PM ST : Created.                                                            *
 *=============================================================================================*/
void SidebarGlyphxClass::Decode_Pointers(void)
{
	
	if (*((HousesType*)&SidebarPlayerPtr) == HOUSE_NONE) {
		SidebarPlayerPtr = NULL;
	} else {
		((HouseClass *&)SidebarPlayerPtr) = HouseClass::As_Pointer(*((HousesType*)&SidebarPlayerPtr));
	}
}


/***********************************************************************************************
 * SidebarGlyphxClass::Load -- Loads from a save game file.                                    *
 *                                                                                             *
 * INPUT:   file  -- The file to read the data from.                                           *
 *                                                                                             *
 * OUTPUT:  true = success, false = failure                                                    *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   9/26/2019 10:57AM ST : Created.                                                           *
 *=============================================================================================*/
bool SidebarGlyphxClass::Load(FileClass & file)
{
	::new (this) SidebarGlyphxClass();

	bool ok = Read_Object(this, sizeof(*this), file, false);

	Column[0].Set_Parent_Sidebar(this);
	Column[1].Set_Parent_Sidebar(this);

	return ok;
}


/***********************************************************************************************
 * SidebarGlyphxClass::Save -- Write to a save game file.                                      *
 *                                                                                             *
 * INPUT:   file  -- The file to write the data to.                                            *
 *                                                                                             *
 * OUTPUT:  true = success, false = failure                                                    *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   9/26/2019 10:57AM ST : Created.                                                           *
 *=============================================================================================*/
bool SidebarGlyphxClass::Save(FileClass & file)
{
	return(Write_Object(this, sizeof(*this), file));
}


extern SidebarGlyphxClass *Get_Current_Context_Sidebar(HouseClass *player_ptr);


void Sidebar_Glyphx_Init_Clear(HouseClass *player_ptr)
{
	SidebarGlyphxClass *sidebar = Get_Current_Context_Sidebar(player_ptr);
	if (sidebar) {
		sidebar->Init_Clear(player_ptr);
	}
}

void Sidebar_Glyphx_Init_IO(HouseClass *player_ptr)
{
	SidebarGlyphxClass *sidebar = Get_Current_Context_Sidebar(player_ptr);
	if (sidebar) {
		sidebar->Init_IO();
	}
}

bool Sidebar_Glyphx_Abandon_Production(RTTIType type, int factory, HouseClass *player_ptr)
{
	SidebarGlyphxClass *sidebar = Get_Current_Context_Sidebar(player_ptr);
	if (sidebar) {
		return sidebar->Abandon_Production(type, factory);
	}

	return false;
}

bool Sidebar_Glyphx_Add(RTTIType type, int id, HouseClass *player_ptr, bool via_capture)
{
	SidebarGlyphxClass *sidebar = Get_Current_Context_Sidebar(player_ptr);
	if (sidebar) {
		return sidebar->Add(type, id, via_capture);
	}

	return false;
}

void Sidebar_Glyphx_Recalc(HouseClass *player_ptr)
{
	SidebarGlyphxClass *sidebar = Get_Current_Context_Sidebar(player_ptr);
	if (sidebar) {
		sidebar->Recalc();
	}
}

void Sidebar_Glyphx_AI(HouseClass *player_ptr, KeyNumType & input)
{
	SidebarGlyphxClass *sidebar = Get_Current_Context_Sidebar(player_ptr);
	if (sidebar) {
		sidebar->AI(input, 0, 0);
	}
}

bool Sidebar_Glyphx_Factory_Link(int factory, RTTIType type, int id, HouseClass *player_ptr)
{
	SidebarGlyphxClass *sidebar = Get_Current_Context_Sidebar(player_ptr);
	if (sidebar) {
		return sidebar->Factory_Link(factory, type, id);
	}

	return false;
}

bool Sidebar_Glyphx_Save(FileClass &file, SidebarGlyphxClass *sidebar)
{
	if (sidebar) {
		return sidebar->Save(file);
	}
	return false;
}			  

bool Sidebar_Glyphx_Load(FileClass &file, SidebarGlyphxClass *sidebar)
{
	if (sidebar) {
		return sidebar->Load(file);
	}
	return false;
}			  

void Sidebar_Glyphx_Code_Pointers(SidebarGlyphxClass *sidebar)
{
	if (sidebar) {
		sidebar->Code_Pointers();
	}
}			  

void Sidebar_Glyphx_Decode_Pointers(SidebarGlyphxClass *sidebar)
{
	if (sidebar) {
		sidebar->Decode_Pointers();
	}
}