/*
** Command & Conquer Generals(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: GameWindowTransitions.h /////////////////////////////////////////////////
//-----------------------------------------------------------------------------
//
// Electronic Arts Pacific.
//
// Confidential Information
// Copyright (C) 2002 - All Rights Reserved
//
//-----------------------------------------------------------------------------
//
// created: Dec 2002
//
// Filename: GameWindowTransitions.h
//
// author: Chris Huybregts
//
// purpose:
//
//-----------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////
#pragma once
#ifndef __GAME_WINDOW_TRANSITIONS_H_
#define __GAME_WINDOW_TRANSITIONS_H_
//-----------------------------------------------------------------------------
// SYSTEM INCLUDES ////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// USER INCLUDES //////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// FORWARD REFERENCES /////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
class GameWindow;
class Image;
class DisplayString;
//-----------------------------------------------------------------------------
// TYPE DEFINES ///////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
enum
{
TRANSITION_FLASH = 0,
BUTTON_TRANSITION_FLASH,
WIN_FADE_TRANSITION,
WIN_SCALE_UP_TRANSITION,
MAINMENU_SCALE_UP_TRANSITION,
TEXT_TYPE_TRANSITION,
SCREEN_FADE_TRANSITION,
COUNT_UP_TRANSITION,
FULL_FADE_TRANSITION,
TEXT_ON_FRAME_TRANSITION,
MAINMENU_MEDIUM_SCALE_UP_TRANSITION,
MAINMENU_SMALL_SCALE_DOWN_TRANSITION,
CONTROL_BAR_ARROW_TRANSITION,
SCORE_SCALE_UP_TRANSITION,
REVERSE_SOUND_TRANSITION,
MAX_TRANSITION_WINDOW_STYLES ///< Keep this last
};
static const LookupListRec TransitionStyleNames[] =
{
{ "FLASH", TRANSITION_FLASH },
{ "BUTTONFLASH", BUTTON_TRANSITION_FLASH },
{ "WINFADE", WIN_FADE_TRANSITION },
{ "WINSCALEUP", WIN_SCALE_UP_TRANSITION },
{ "MAINMENUSCALEUP", MAINMENU_SCALE_UP_TRANSITION },
{ "TYPETEXT", TEXT_TYPE_TRANSITION },
{ "SCREENFADE", SCREEN_FADE_TRANSITION },
{ "COUNTUP", COUNT_UP_TRANSITION },
{ "FULLFADE", FULL_FADE_TRANSITION },
{ "TEXTONFRAME", TEXT_ON_FRAME_TRANSITION },
{ "MAINMENUMEDIUMSCALEUP", MAINMENU_MEDIUM_SCALE_UP_TRANSITION },
{ "MAINMENUSMALLSCALEDOWN", MAINMENU_SMALL_SCALE_DOWN_TRANSITION },
{ "CONTROLBARARROW", CONTROL_BAR_ARROW_TRANSITION },
{ "SCORESCALEUP", SCORE_SCALE_UP_TRANSITION },
{ "REVERSESOUND", REVERSE_SOUND_TRANSITION },
{ NULL, 0 }// keep this last!
};
// base class for the transitions
// inherit off of this adding in all the values
class Transition
{
public:
Transition ( void );
virtual ~Transition( void );
virtual void init( GameWindow *win ) = 0;
virtual void update( Int frame ) = 0;
virtual void reverse( void ) = 0;
virtual void draw( void ) = 0;
virtual void skip( void ) = 0;
Bool isFinished( void ) { return m_isFinished; }
Int getFrameLength( void ){ return m_frameLength; }
protected:
Int m_frameLength; // how many frames does this thing take.
Bool m_isFinished; // when we finish we set this
Bool m_isForward;
Bool m_isReversed; // when we reverse we set this
GameWindow *m_win;
};
//-----------------------------------------------------------------------------
class TextOnFrameTransition : public Transition
{
public:
TextOnFrameTransition ( void );
virtual ~TextOnFrameTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
TEXTONFRAMETRANSITION_START = 0,
TEXTONFRAMETRANSITION_END = 1 // Max text type we'll allow.
};
};
//-----------------------------------------------------------------------------
class ReverseSoundTransition : public Transition
{
public:
ReverseSoundTransition ( void );
virtual ~ReverseSoundTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
REVERSESOUNDTRANSITION_START = 0,
REVERSESOUNDTRANSITION_FIRESOUND = 1,
REVERSESOUNDTRANSITION_END = 2 // Max text type we'll allow.
};
};
//-----------------------------------------------------------------------------
class FullFadeTransition : public Transition
{
public:
FullFadeTransition ( void );
virtual ~FullFadeTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
FULLFADETRANSITION_START = 0,
FULLFADETRANSITION_END = 10 // Max text type we'll allow.
};
ICoord2D m_pos;
ICoord2D m_size;
Real m_percent;
Int m_drawState;
};
//-----------------------------------------------------------------------------
class ControlBarArrowTransition : public Transition
{
public:
ControlBarArrowTransition ( void );
virtual ~ControlBarArrowTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
CONTROLBARARROWTRANSITION_START = 0,
CONTROLBARARROWTRANSITION_BEGIN_FADE = 16,
CONTROLBARARROWTRANSITION_END = 22 // Max text type we'll allow.
};
ICoord2D m_pos;
ICoord2D m_incrementPos;
ICoord2D m_size;
Real m_percent;
Real m_fadePercent;
Int m_drawState;
const Image* m_arrowImage;
};
//-----------------------------------------------------------------------------
class ScreenFadeTransition : public Transition
{
public:
ScreenFadeTransition ( void );
virtual ~ScreenFadeTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
SCREENFADETRANSITION_START = 0,
SCREENFADETRANSITION_END = 30 // Max text type we'll allow.
};
ICoord2D m_pos;
ICoord2D m_size;
Real m_percent;
Int m_drawState;
};
//-----------------------------------------------------------------------------
class CountUpTransition : public Transition
{
public:
CountUpTransition ( void );
virtual ~CountUpTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
COUNTUPTRANSITION_START = 0,
COUNTUPTRANSITION_END = 30 // Max text type we'll allow.
};
ICoord2D m_pos;
ICoord2D m_size;
Int m_drawState;
UnicodeString m_fullText;
UnicodeString m_partialText;
Int m_intValue;
Int m_currentValue;
enum{
COUNT_ONES = 1,
COUNT_100S = 100,
COUNT_1000S = 1000
};
Int m_countState;
};
//-----------------------------------------------------------------------------
class TextTypeTransition : public Transition
{
public:
TextTypeTransition ( void );
virtual ~TextTypeTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
TEXTTYPETRANSITION_START = 0,
TEXTTYPETRANSITION_END = 30 // Max text type we'll allow.
};
ICoord2D m_pos;
ICoord2D m_size;
Int m_drawState;
UnicodeString m_fullText;
UnicodeString m_partialText;
DisplayString *m_dStr;
};
//-----------------------------------------------------------------------------
class MainMenuScaleUpTransition : public Transition
{
public:
MainMenuScaleUpTransition ( void );
virtual ~MainMenuScaleUpTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
MAINMENUSCALEUPTRANSITION_START = 0,
MAINMENUSCALEUPTRANSITION_END = 5
};
ICoord2D m_pos;
ICoord2D m_size;
Int m_drawState;
ICoord2D m_growPos;
ICoord2D m_growSize;
ICoord2D m_incrementPos;
ICoord2D m_incrementSize;
GameWindow *m_growWin;
};
//-----------------------------------------------------------------------------
class MainMenuMediumScaleUpTransition : public Transition
{
public:
MainMenuMediumScaleUpTransition ( void );
virtual ~MainMenuMediumScaleUpTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
MAINMENUMEDIUMSCALEUPTRANSITION_START = 0,
MAINMENUMEDIUMSCALEUPTRANSITION_END = 3
};
ICoord2D m_pos;
ICoord2D m_size;
Int m_drawState;
ICoord2D m_growPos;
ICoord2D m_growSize;
ICoord2D m_incrementSize;
GameWindow *m_growWin;
};
//-----------------------------------------------------------------------------
class MainMenuSmallScaleDownTransition : public Transition
{
public:
MainMenuSmallScaleDownTransition ( void );
virtual ~MainMenuSmallScaleDownTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
MAINMENUSMALLSCALEDOWNTRANSITION_START = 0,
MAINMENUSMALLSCALEDOWNTRANSITION_1 = 1,
MAINMENUSMALLSCALEDOWNTRANSITION_2 = 2,
MAINMENUSMALLSCALEDOWNTRANSITION_3 = 3,
MAINMENUSMALLSCALEDOWNTRANSITION_4 = 4,
MAINMENUSMALLSCALEDOWNTRANSITION_5 = 5,
MAINMENUSMALLSCALEDOWNTRANSITION_END
};
ICoord2D m_pos;
ICoord2D m_size;
Int m_drawState;
ICoord2D m_growPos;
ICoord2D m_growSize;
ICoord2D m_incrementSize;
GameWindow *m_growWin;
};
//-----------------------------------------------------------------------------
class ScaleUpTransition : public Transition
{
public:
ScaleUpTransition ( void );
virtual ~ScaleUpTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
SCALEUPTRANSITION_START = 0,
SCALEUPTRANSITION_1 = 1,
SCALEUPTRANSITION_2 = 2,
SCALEUPTRANSITION_3 = 3,
SCALEUPTRANSITION_4 = 4,
SCALEUPTRANSITION_5 = 5,
// SCALEUPTRANSITION_6 = 6,
// SCALEUPTRANSITION_7 = 7,
// SCALEUPTRANSITION_8 = 8,
// SCALEUPTRANSITION_9 = 9,
// SCALEUPTRANSITION_10 = 10,
// SCALEUPTRANSITION_11 = 11,
// SCALEUPTRANSITION_12 = 12,
// SCALEUPTRANSITION_13 = 13,
// SCALEUPTRANSITION_14 = 14,
// SCALEUPTRANSITION_15 = 15,
// SCALEUPTRANSITION_16 = 16,
// SCALEUPTRANSITION_17 = 17,
// SCALEUPTRANSITION_18 = 18,
// SCALEUPTRANSITION_19 = 19,
SCALEUPTRANSITION_END
};
ICoord2D m_pos;
ICoord2D m_size;
Int m_drawState;
ICoord2D m_centerPos;
ICoord2D m_incrementSize;
};
//-----------------------------------------------------------------------------
class ScoreScaleUpTransition : public Transition
{
public:
ScoreScaleUpTransition ( void );
virtual ~ScoreScaleUpTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
SCORESCALEUPTRANSITION_START = 0,
SCORESCALEUPTRANSITION_1 = 1,
SCORESCALEUPTRANSITION_2 = 2,
SCORESCALEUPTRANSITION_3 = 3,
SCORESCALEUPTRANSITION_4 = 4,
SCORESCALEUPTRANSITION_5 = 5,
SCORESCALEUPTRANSITION_END
};
ICoord2D m_pos;
ICoord2D m_size;
Int m_drawState;
ICoord2D m_centerPos;
ICoord2D m_incrementSize;
};
//-----------------------------------------------------------------------------
class FadeTransition : public Transition
{
public:
FadeTransition ( void );
virtual ~FadeTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
FADETRANSITION_START = 0,
FADETRANSITION_FADE_IN_1 = 1,
FADETRANSITION_FADE_IN_2 = 2,
FADETRANSITION_FADE_IN_3 = 3,
FADETRANSITION_FADE_IN_4 = 4,
FADETRANSITION_FADE_IN_5 = 5,
FADETRANSITION_FADE_IN_6 = 6,
FADETRANSITION_FADE_IN_7 = 7,
FADETRANSITION_FADE_IN_8 = 8,
FADETRANSITION_FADE_IN_9 = 9,
FADETRANSITION_END
};
ICoord2D m_pos;
ICoord2D m_size;
Int m_drawState;
};
//-----------------------------------------------------------------------------
class FlashTransition : public Transition
{
public:
FlashTransition ( void );
virtual ~FlashTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
FLASHTRANSITION_START = 0,
FLASHTRANSITION_FADE_IN_1 = 1,
FLASHTRANSITION_FADE_IN_2 = 2,
FLASHTRANSITION_FADE_IN_3 = 3,
FLASHTRANSITION_FADE_TO_BACKGROUND_1 = 4,
FLASHTRANSITION_FADE_TO_BACKGROUND_2 = 5,
FLASHTRANSITION_FADE_TO_BACKGROUND_3 = 6,
FLASHTRANSITION_FADE_TO_BACKGROUND_4 = 7,
FLASHTRANSITION_END
};
ICoord2D m_pos;
ICoord2D m_size;
Int m_drawState;
};
//-----------------------------------------------------------------------------
class ButtonFlashTransition : public Transition
{
public:
ButtonFlashTransition ( void );
virtual ~ButtonFlashTransition( void );
virtual void init( GameWindow *win );
virtual void update( Int frame );
virtual void reverse( void );
virtual void draw( void );
virtual void skip( void );
protected:
enum{
BUTTONFLASHTRANSITION_START = 0,
BUTTONFLASHTRANSITION_FADE_IN_1 = 1,
BUTTONFLASHTRANSITION_FADE_IN_2 = 2,
BUTTONFLASHTRANSITION_FADE_IN_3 = 3,
BUTTONFLASHTRANSITION_FADE_TO_BACKGROUND_1 =4,
BUTTONFLASHTRANSITION_FADE_TO_BACKGROUND_2 = 5,
BUTTONFLASHTRANSITION_FADE_TO_BACKGROUND_3 = 6,
BUTTONFLASHTRANSITION_FADE_TO_BACKGROUND_4 = 7,
BUTTONFLASHTRANSITION_FADE_TO_GRADE_IN_1 = 11,
BUTTONFLASHTRANSITION_FADE_TO_GRADE_IN_2 = BUTTONFLASHTRANSITION_FADE_TO_GRADE_IN_1 +1,
BUTTONFLASHTRANSITION_FADE_TO_GRADE_OUT_1 = BUTTONFLASHTRANSITION_FADE_TO_GRADE_IN_2 +1,
BUTTONFLASHTRANSITION_FADE_TO_GRADE_OUT_2 = BUTTONFLASHTRANSITION_FADE_TO_GRADE_OUT_1 +1,
BUTTONFLASHTRANSITION_FADE_TO_GRADE_OUT_3 = BUTTONFLASHTRANSITION_FADE_TO_GRADE_OUT_2 +1,
BUTTONFLASHTRANSITION_FADE_TO_GRADE_OUT_4 = BUTTONFLASHTRANSITION_FADE_TO_GRADE_OUT_3 + 1,
BUTTONFLASHTRANSITION_END, // this is the end of the sequence, we need some special defines... well put them below here
BUTTONFLASHTRANSITION_SHOW_BACKGROUND
};
ICoord2D m_pos;
ICoord2D m_size;
Int m_drawState;
Image *m_gradient;
};
//-----------------------------------------------------------------------------
class TransitionWindow
{
public:
TransitionWindow( void );
~TransitionWindow( void );
Bool init( void );
void update( Int frame );
Bool isFinished( void );
void reverse( Int totalFrames );
Int getTotalFrames( void );
void skip( void );
void draw( void );
// INI parsed vars
AsciiString m_winName;
Int m_frameDelay; // what frame number we start on
Int m_style; // the style we'll be using
// standard vars
NameKeyType m_winID;
GameWindow *m_win;
Transition *m_transition; // each window is allowed one trasition
Int m_currentFrameDelay; // this will change based on if we're going forward or backwards
};
//-----------------------------------------------------------------------------
class TransitionGroup
{
public:
TransitionGroup( void );
~TransitionGroup( void );
void init( void );
void update( void );
Bool isFinished( void );
void reverse( void );
void draw( void );
void skip ( void );
AsciiString getName( void ) { return m_name; }
void setName( AsciiString name){ m_name = name; }
void addWindow( TransitionWindow *transWin );
Bool isReversed( void );
Bool isFireOnce( void ) { return m_fireOnce; }
Bool m_fireOnce;
private:
typedef std::list TransitionWindowList;
TransitionWindowList m_transitionWindowList;
Int m_directionMultiplier;
Int m_currentFrame; ///< maintain how long we've spent on this transition;
AsciiString m_name;
};
//-----------------------------------------------------------------------------
class GameWindowTransitionsHandler: public SubsystemInterface
{
public:
GameWindowTransitionsHandler(void);
~GameWindowTransitionsHandler( void );
void init(void );
void load(void );
void reset( void );
void update( void );
void draw( void );
Bool isFinished( void );
const FieldParse *getFieldParse() const { return m_gameWindowTransitionsFieldParseTable; } ///< returns the parsing fields
static const FieldParse m_gameWindowTransitionsFieldParseTable[]; ///< the parse table
static void parseWindow( INI* ini, void *instance, void *store, const void *userData );
void setGroup(AsciiString groupName, Bool immidiate = FALSE); // THis will be the next group to fire off.
void reverse( AsciiString groupName );// reverse the animations for the current group.
void remove( AsciiString groupName, Bool skipPending = FALSE );// remove the animation from the current or pending groups.
TransitionGroup *getNewGroup( AsciiString name );
private:
TransitionGroup *findGroup( AsciiString groupName );
typedef std::list TransitionGroupList;
TransitionGroupList m_transitionGroupList;
TransitionGroup *m_currentGroup;
TransitionGroup *m_pendingGroup;
TransitionGroup *m_drawGroup;
TransitionGroup *m_secondaryDrawGroup; // needed to draw the last frame of the previvous draw group once more.
};
void PushButtonImageDrawThree(GameWindow *window, Int alpha );
//-----------------------------------------------------------------------------
// INLINING ///////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// EXTERNALS //////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
extern GameWindowTransitionsHandler *TheTransitionHandler;
#endif // __GAME_WINDOW_TRANSITIONS_H_