/* ** Command & Conquer Generals Zero Hour(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 . */ //////////////////////////////////////////////////////////////////////////////// // // // (c) 2001-2003 Electronic Arts Inc. // // // //////////////////////////////////////////////////////////////////////////////// // FILE: ControlBarScheme.h ///////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Electronic Arts Pacific. // // Confidential Information // Copyright (C) 2002 - All Rights Reserved // //----------------------------------------------------------------------------- // // created: Apr 2002 // // Filename: ControlBarScheme.h // // author: Chris Huybregts // // purpose: // //----------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////////////////// #pragma once #ifndef __CONTROL_BAR_SCHEME_H_ #define __CONTROL_BAR_SCHEME_H_ //----------------------------------------------------------------------------- // SYSTEM INCLUDES //////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // USER INCLUDES ////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- #include "GameClient/Color.h" //----------------------------------------------------------------------------- // FORWARD REFERENCES ///////////////////////////////////////////////////////// //----------------------------------------------------------------------------- class AsciiString; class playerTemplate; class Image; enum TimeOfDay; //----------------------------------------------------------------------------- // TYPE DEFINES /////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- #define MAX_CONTROL_BAR_SCHEME_IMAGE_LAYERS 6 #define CONTROL_BAR_SCHEME_FOREGROUND_IMAGE_LAYERS 3 // Class that holds the images the control bar will draw //----------------------------------------------------------------------------- class ControlBarSchemeImage { public: ControlBarSchemeImage( void ); ~ControlBarSchemeImage( void ); AsciiString m_name; ///< Name of the image ICoord2D m_position; ///< the position we'll draw it at ICoord2D m_size; ///< the size of the image needed when we draw it Image *m_image; ///< the actual pointer to the mapped image // m_layer is where the image will get drawn, everything in layer 0-2 gets drawn during the forground draw // the layers 3-5 gets drawn during the background draw Int m_layer; //layer means how deep the image will be drawn, it's a number between 0-5 with 0 being on top }; // Class that will hold the information needed for the animations //----------------------------------------------------------------------------- class ControlBarSchemeAnimation { public: ControlBarSchemeAnimation( void ); ~ControlBarSchemeAnimation( void ); /// Enum that will contain all the kinds of animations we have... make sure in ControlBarScheme.cpp there's a /// mapping for it for the INI translation enum { CB_ANIM_SLIDE_RIGHT = 0, CB_ANIM_MAX }; AsciiString m_name; ///< Current animation name Int m_animType; ///< Type of animation that this will follow ControlBarSchemeImage *m_animImage; ///< Pointer of the image that this animation will act on UnsignedInt m_animDuration; ///< Contians how long the animation should take based off game frames ICoord2D m_finalPos; ///< The final position when we hit the m_animDuration frame UnsignedInt getCurrentFrame(void) { return m_currentFrame; } void setCurrentFrame( UnsignedInt currentFrame ) { m_currentFrame = currentFrame; } ICoord2D getStartPos( void ) { return m_startPos; } void setStartPos(ICoord2D startPos) { m_startPos = startPos; } private: ICoord2D m_startPos; ///< set when we first begin an animation UnsignedInt m_currentFrame; ///< This is the last frame (a value between 0 and m_animDuration) }; // Class that each scheme will have. Contains all information about that scheme //----------------------------------------------------------------------------- class ControlBarScheme { public: ControlBarScheme( void ); ~ControlBarScheme( void ); void init( void ); void update( void ); void drawForeground( Coord2D multi, ICoord2D offset ); ///< draw function to be called within a w3d draw procedure for the foreground void drawBackground( Coord2D multi, ICoord2D offset ); ///< draw function to be called within a w3d draw procedure for the background void reset( void ); void addAnimation( ControlBarSchemeAnimation *schemeAnim ); void addImage( ControlBarSchemeImage *schemeImage); void updateAnim (ControlBarSchemeAnimation * anim); AsciiString m_name; ///< it's name ICoord2D m_ScreenCreationRes; ///< Used to determine what screen res this will look the best on AsciiString m_side; ///< contain what faction type this command bar was made for (used when selecting command bar by template Image *m_buttonQueueImage; ///< We'll probably want each one to have it's own image. Image *m_rightHUDImage; ///< We'll probably want each one to have it's own right HUD image. Color m_buildUpClockColor; ///< we can setup the color for the buildup clock if we want Color m_borderBuildColor; ///< we can setup the color for the button border colors Color m_borderActionColor; ///< we can setup the color for the button border colors Color m_borderUpgradeColor; ///< we can setup the color for the button border colors Color m_borderSystemColor; ///< we can setup the color for the button border colors Color m_commandBarBorderColor; Image *m_optionsButtonEnable; Image *m_optionsButtonHightlited; Image *m_optionsButtonPushed; Image *m_optionsButtonDisabled; Image *m_idleWorkerButtonEnable; Image *m_idleWorkerButtonHightlited; Image *m_idleWorkerButtonPushed; Image *m_idleWorkerButtonDisabled; Image *m_buddyButtonEnable; Image *m_buddyButtonHightlited; Image *m_buddyButtonPushed; Image *m_buddyButtonDisabled; Image *m_beaconButtonEnable; Image *m_beaconButtonHightlited; Image *m_beaconButtonPushed; Image *m_beaconButtonDisabled; Image *m_genBarButtonIn; Image *m_genBarButtonOn; Image *m_toggleButtonUpIn; Image *m_toggleButtonUpOn; Image *m_toggleButtonUpPushed; Image *m_toggleButtonDownIn; Image *m_toggleButtonDownOn; Image *m_toggleButtonDownPushed; Image *m_generalButtonEnable; Image *m_generalButtonHightlited; Image *m_generalButtonPushed; Image *m_generalButtonDisabled; Image *m_uAttackButtonEnable; Image *m_uAttackButtonHightlited; Image *m_uAttackButtonPushed; Image *m_minMaxButtonEnable; Image *m_minMaxButtonHightlited; Image *m_minMaxButtonPushed; Image *m_genArrow; ICoord2D m_moneyUL; ICoord2D m_moneyLR; ICoord2D m_minMaxUL; ICoord2D m_minMaxLR; ICoord2D m_generalUL; ICoord2D m_generalLR; ICoord2D m_uAttackUL; ICoord2D m_uAttackLR; ICoord2D m_optionsUL; ICoord2D m_optionsLR; ICoord2D m_workerUL; ICoord2D m_workerLR; ICoord2D m_chatUL; ICoord2D m_chatLR; ICoord2D m_beaconUL; ICoord2D m_beaconLR; ICoord2D m_powerBarUL; ICoord2D m_powerBarLR; Image *m_expBarForeground; Image *m_commandMarkerImage; Image *m_powerPurchaseImage; typedef std::list< ControlBarSchemeImage* > ControlBarSchemeImageList; ControlBarSchemeImageList m_layer[MAX_CONTROL_BAR_SCHEME_IMAGE_LAYERS]; typedef std::list< ControlBarSchemeAnimation* > ControlBarSchemeAnimationList; ControlBarSchemeAnimationList m_animations; }; class ControlBarSchemeManager { public: ControlBarSchemeManager( void ); ~ControlBarSchemeManager( void ); void init( void ); ///< Initialize from the INI files void update( void ); ///< move the animations if we have any void drawForeground( ICoord2D offset ); ///< draw function to be called within a w3d draw procedure for the foreground void drawBackground( ICoord2D offset ); ///< draw function to be called within a w3d draw procedure for the background void setControlBarSchemeByPlayer(Player *p); ///< Based off the playerTemplate, pick the right scheme for the control bar void setControlBarSchemeByPlayerTemplate( const PlayerTemplate *pt, Bool useSmall = FALSE); void setControlBarScheme(AsciiString schemeName); ///< SchemeName must be a valid INI entry // parse Functions for the INI file const FieldParse *getFieldParse() const { return m_controlBarSchemeFieldParseTable; } ///< returns the parsing fields static const FieldParse m_controlBarSchemeFieldParseTable[]; ///< the parse table static void parseImagePart( INI* ini, void *instance, void *store, const void *userData ); ///< Parse the image part of the INI file static void parseAnimatingPart( INI* ini, void *instance, void *store, const void *userData ); ///< Parse the animation part of the INI file static void parseAnimatingPartImage( INI* ini, void *instance, void *store, const void *userData ); ///< parse the image part of the animation part :) ControlBarScheme *findControlBarScheme( AsciiString name ); ///< attempt to find the control bar scheme by it's name ControlBarScheme *newControlBarScheme( AsciiString name ); ///< create a new control bar scheme and return it. void preloadAssets( TimeOfDay timeOfDay ); ///< preload the assets private: ControlBarScheme *m_currentScheme; ///< the current scheme that everythign uses Coord2D m_multiplyer; typedef std::list< ControlBarScheme* > ControlBarSchemeList; ///< list of control bar schemes ControlBarSchemeList m_schemeList; }; //----------------------------------------------------------------------------- // INLINING /////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // EXTERNALS ////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------- #endif // __CONTROL_BAR_SCHEME_H_