CnC_Remastered_Collection/REDALERT/SIDEBAR.H

397 lines
14 KiB
C++

//
// 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: /CounterStrike/SIDEBAR.H 1 3/03/97 10:25a 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 : SIDEBAR.H *
* *
* Programmer : Joe L. Bostic *
* *
* Start Date : October 20, 1994 *
* *
* Last Update : October 20, 1994 [JLB] *
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#ifndef SIDEBAR_H
#define SIDEBAR_H
#include "function.h"
#include "power.h"
#include "factory.h"
class InitClass {};
class SidebarClass: public PowerClass
{
public:
/*
** These constants are used to control the sidebar rendering. They are instantiated
** as enumerations since C++ cannot use "const" in this context.
*/
enum SideBarClassEnums {
BUTTON_ACTIVATOR=100, // Button ID for the activator.
SIDE_X=320-80, // The X position of sidebar upper left corner.
SIDE_Y=7+70, // The Y position of sidebar upper left corner.
SIDE_WIDTH=SIDEBAR_WID, // Width of the entire sidebar (in pixels).
SIDE_HEIGHT=200-(7+70), // Height of the entire sidebar (in pixels).
TOP_HEIGHT=13, // Height of top section (with repair/sell buttons).
COLUMN_ONE_X=(320-80)+8, // Sidestrip upper left coordinates...
COLUMN_ONE_Y=int(SIDE_Y)+int(TOP_HEIGHT),
COLUMN_TWO_X=(320-80)+8+((80-16)/2)+3,
COLUMN_TWO_Y=7+70+13,
//BGA: changes to all buttons
#ifdef GERMAN
BUTTON_ONE_WIDTH=20, // Button width.
BUTTON_TWO_WIDTH=27, // Button width.
BUTTON_THREE_WIDTH=26, // Button width.
BUTTON_HEIGHT=9, // Button height.
BUTTON_ONE_X=SIDE_X+2, // Left button X coordinate.
BUTTON_ONE_Y=SIDE_Y+2, // Left button Y coordinate.
BUTTON_TWO_X=SIDE_X+24, // Right button X coordinate.
BUTTON_TWO_Y=SIDE_Y+2, // Right button Y coordinate.
BUTTON_THREE_X=SIDE_X+53, // Right button X coordinate.
BUTTON_THREE_Y=SIDE_Y+2, // Right button Y coordinate.
#endif
#ifdef FRENCH
BUTTON_ONE_WIDTH=20, // Button width.
BUTTON_TWO_WIDTH=27, // Button width.
BUTTON_THREE_WIDTH=26, // Button width.
BUTTON_HEIGHT=9, // Button height.
BUTTON_ONE_X=SIDE_X+2, // Left button X coordinate.
BUTTON_ONE_Y=SIDE_Y+2, // Left button Y coordinate.
BUTTON_TWO_X=SIDE_X+24, // Right button X coordinate.
BUTTON_TWO_Y=SIDE_Y+2, // Right button Y coordinate.
BUTTON_THREE_X=SIDE_X+53, // Right button X coordinate.
BUTTON_THREE_Y=SIDE_Y+2, // Right button Y coordinate.
#endif
#ifdef ENGLISH
BUTTON_ONE_WIDTH=32, // Button width.
BUTTON_TWO_WIDTH=20, // Button width.
BUTTON_THREE_WIDTH=20, // Button width.
BUTTON_HEIGHT=9, // Button height.
BUTTON_ONE_X=(int)SIDE_X+2, // Left button X coordinate.
BUTTON_ONE_Y=(int)SIDE_Y+2, // Left button Y coordinate.
BUTTON_TWO_X=(int)SIDE_X+36, // Right button X coordinate.
BUTTON_TWO_Y=(int)SIDE_Y+2, // Right button Y coordinate.
BUTTON_THREE_X=(int)SIDE_X+58, // Right button X coordinate.
BUTTON_THREE_Y=(int)SIDE_Y+2, // Right button Y coordinate.
#endif
COLUMNS=2 // Number of side strips on sidebar.
};
static void * SidebarShape;
static void * SidebarMiddleShape; //Only used in Win95 version
static void * SidebarBottomShape; //Only used in Win95 version
SidebarClass(void);
SidebarClass(NoInitClass const & x);
/*
** Initialization
*/
virtual void One_Time(void); // One-time inits
virtual void Init_Clear(void); // Clears all to known state
virtual void Init_IO(void); // Inits button list
virtual void Init_Theater(TheaterType theater); // Theater-specific inits
void Reload_Sidebar(void); // Loads house-specific sidebar art
virtual void AI(KeyNumType & input, int x, int y);
virtual void Draw_It(bool complete);
virtual void Refresh_Cells(CELL cell, short const *list);
void Zoom_Mode_Control(void);
bool Abandon_Production(RTTIType type, int factory);
bool Activate(int control);
bool Add(RTTIType type, int ID, bool via_capture = false); // Added via_capture for new sidebar functionality. ST - 9/24/2019 3:15PM );
bool Sidebar_Click(KeyNumType & input, int x, int y);
void Recalc(void);
bool Factory_Link(int factory, RTTIType type, int id);
/*
** Each side strip is managed by this class. It handles all strip specific
** actions.
*/
class StripClass : public StageClass
{
class SelectClass : public ControlClass
{
public:
SelectClass(void);
SelectClass(NoInitClass const & x) : ControlClass(x) {};
void Set_Owner(StripClass & strip, int index);
StripClass * Strip;
int Index;
protected:
virtual int Action(unsigned flags, KeyNumType & key);
};
public:
StripClass(void) {}
StripClass(InitClass const &);
StripClass(NoInitClass const & ) {};
bool Add(RTTIType type, int ID, bool via_capture); // Added via_capture for new sidebar functionality. ST - 9/24/2019 3:15PM );
bool Abandon_Production(int factory);
bool Scroll(bool up);
bool AI(KeyNumType & input, int x, int y);
void Draw_It(bool complete);
void One_Time(int id);
void Init_Clear(void);
void Init_IO(int id);
void Init_Theater(TheaterType theater);
void Reload_LogoShapes(void);
bool Recalc(void);
void Activate(void);
void Deactivate(void);
void Flag_To_Redraw(void);
bool Factory_Link(int factory, RTTIType type, int id);
void const * Get_Special_Cameo(SpecialWeaponType type);
/*
** File I/O.
*/
bool Load(Straw & file);
bool Save(Pipe & file) const;
/*
** Working numbers used when rendering and processing the side strip.
*/
enum SideBarGeneralEnums {
BUTTON_UP=200,
BUTTON_DOWN=210,
BUTTON_SELECT=220,
MAX_BUILDABLES=75, // Maximum number of object types in sidebar.
OBJECT_HEIGHT=24, // Pixel height of each buildable object.
OBJECT_WIDTH=32, // Pixel width of each buildable object.
STRIP_WIDTH=35, // Width of strip (not counting border lines).
MAX_VISIBLE=4, // Number of object slots visible at any one time.
#ifdef WIN32
SCROLL_RATE=12, // The pixel jump while scrolling (larger is faster).
#else
SCROLL_RATE=8, // The pixel jump while scrolling (larger is faster).
#endif
UP_X_OFFSET=2, // Scroll up arrow coordinates.
#ifdef WIN32
UP_Y_OFFSET=int(MAX_VISIBLE)*int(OBJECT_HEIGHT)+1,
#else
UP_Y_OFFSET=int(MAX_VISIBLE)*int(OBJECT_HEIGHT)+2,
#endif
DOWN_X_OFFSET=18, // Scroll down arrow coordinates.
DOWN_Y_OFFSET=UP_Y_OFFSET,//BGint(MAX_VISIBLE)*int(OBJECT_HEIGHT)+1,
SBUTTON_WIDTH=16, // Width of the mini-scroll button.
SBUTTON_HEIGHT=12, // Height of the mini-scroll button.
LEFT_EDGE_OFFSET=2, // Offset from left edge for building shapes.
TEXT_X_OFFSET=18, // X offset to print "ready" text.
TEXT_Y_OFFSET=15, // Y offset to print "ready" text.
TEXT_COLOR=255 // Color to use for the "Ready" text.
};
/*
** This is the coordinate of the upper left corner that this side strip
** uses for rendering.
*/
int X,Y;
/*
** This is a unique identifier for the sidebar strip. Using this identifier,
** it is possible to differentiate the button messages that arrive from the
** common input button list. It >MUST< be equal to the strip's index into
** the Column[] array, because the strip uses it to access the stripclass
** buttons.
*/
int ID;
/*
** Shape numbers for the shapes in the STRIP.SHP file.
*/
enum SideBarStipShapeEnums {
SB_BLANK, // The blank rectangle to use if there are no objects present.
SB_FRAME
};
/*
** If this particular side strip needs to be redrawn, then this flag
** will be true.
*/
unsigned IsToRedraw:1;
/*
** If construction is in progress (no other objects in this strip can
** be started), then this flag will be true. It will be cleared when
** the strip is free to start production again.
*/
unsigned IsBuilding:1;
/*
** This controls the sidebar slide direction. If this is true, then the sidebar
** will scroll downward -- revealing previous objects.
*/
unsigned IsScrollingDown:1;
/*
** If the sidebar is scrolling, then this flag is true. Otherwise it is false.
*/
unsigned IsScrolling:1;
/*
** This is the object (sidebar slot) that is flashing. Only one slot can be flashing
** at any one instant. This is usually the result of a click on the slot and construction
** has commenced.
*/
int Flasher;
/*
** As the sidebar scrolls up and down, this variable holds the index for the topmost
** visible sidebar slot.
*/
int TopIndex;
/*
** This is the queued scroll direction and amount. The sidebar
** will scroll the number of slots indicated by this value. This
** value is set according to the scroll buttons.
*/
int Scroller;
/*
** The sidebar has smooth scrolling. This is the number of pixels the sidebar
** has slide down. Thus, if this value were 5, then there would be 5 pixels of
** the TopIndex-1 sidebar object visible. When the Slid value reaches 24, then
** the value resets to zero and the TopIndex is decremented. For sliding in the
** opposite direction, change the IsScrollingDown flag.
*/
int Slid;
/*
** The value of Slid the last time we rendered the sidebar.
*/
int LastSlid;
/*
** This is the count of the number of sidebar slots that are active.
*/
int BuildableCount;
/*
** This is the array of buildable object types. This array is sorted in the order
** that it is to be displayed. This array keeps track of which objects are building
** and ready to be placed. The very nature of this method precludes simultaneous
** construction of the same object type.
*/
typedef struct BuildType {
int BuildableID;
RTTIType BuildableType;
int Factory; // Production manager.
bool BuildableViaCapture; // Added for new sidebar functionality. ST - 9/24/2019 3:10PM
} BuildType;
BuildType Buildables[MAX_BUILDABLES];
/*
** Pointer to the shape data for small versions of the logos. These are used as
** placeholder pieces on the side bar.
*/
static void * LogoShapes;
/*
** This points to the animation sequence of frames used to mark the passage of time
** as an object is undergoing construction.
*/
static void const * ClockShapes;
/*
** This points to the animation sequence which deals with special
** shapes which handle non-production based icons.
*/
static void const * SpecialShapes[SPC_COUNT];
/*
** This is the last theater that the special palette remap table was loaded
** for. If the current theater differs from this recorded value, then the
** remap tables are reloaded.
*/
// static TheaterType LastTheater;
static ShapeButtonClass UpButton[COLUMNS];
static ShapeButtonClass DownButton[COLUMNS];
static SelectClass SelectButton[COLUMNS][MAX_VISIBLE];
/*
** This points to the shapes that are used for the clock overlay. This displays
** progress of construction.
*/
static char ClockTranslucentTable[(1+1)*256];
} Column[COLUMNS];
/*
** If the sidebar is active then this flag is true.
*/
unsigned IsSidebarActive:1;
/*
** This flag tells the rendering system that the sidebar needs to be redrawn.
*/
unsigned IsToRedraw:1;
class SBGadgetClass: public GadgetClass {
public:
//#ifdef WIN32
SBGadgetClass(void) : GadgetClass((int)((int)SIDE_X+8)*RESFACTOR, (int)SIDE_Y*RESFACTOR, (int)((int)SIDE_WIDTH-1)*RESFACTOR-1, (int)((int)SIDE_HEIGHT-1)*RESFACTOR, LEFTUP) {};
//#else
// SBGadgetClass(void) : GadgetClass((int)SIDE_X+8, (int)SIDE_Y, (int)SIDE_WIDTH-1, (int)SIDE_HEIGHT-1, LEFTUP) {};
//#endif
protected:
virtual int Action(unsigned flags, KeyNumType & key);
};
/*
** This is the button that is used to collapse and expand the sidebar.
** These buttons must be available to derived classes, for Save/Load.
*/
static ShapeButtonClass Repair;
static ShapeButtonClass Upgrade;
static ShapeButtonClass Zoom;
static SBGadgetClass Background;
bool Scroll(bool up, int column);
private:
bool Activate_Repair(int control);
bool Activate_Upgrade(int control);
bool Activate_Demolish(int control);
int Which_Column(RTTIType type);
unsigned IsRepairActive:1;
unsigned IsUpgradeActive:1;
unsigned IsDemolishActive:1;
};
#endif