| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475 |
- //
- // 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/POWER.CPP 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 : POWER.CPP *
- * *
- * Programmer : Joe L. Bostic *
- * *
- * Start Date : 12/15/94 *
- * *
- * Last Update : October 14, 1996 [JLB] *
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * PowerClass::AI -- Process the power bar logic. *
- * PowerClass::Draw_It -- Renders the power bar graphic. *
- * PowerClass::Init_Clear -- Clears all the power bar variables. *
- * PowerClass::One_Time -- One time processing for the power bar. *
- * PowerClass::PowerButtonClass::Action -- Handles the mouse over the power bar area. *
- * PowerClass::PowerClass -- Default constructor for the power bar class. *
- * PowerClass::Refresh_Cells -- Intercepts the redraw logic to see if sidebar to redraw too. *
- * PowerClass::Power_Height -- Given a value figure where it falls on bar *
- * PowerClass::Flash_Power -- Flag the power bar to flash. *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "function.h"
- /*
- ** Points to the shape to use for the "desired" power level indicator.
- */
- void const * PowerClass::PowerShape;
- void const * PowerClass::PowerBarShape;
- PowerClass::PowerButtonClass PowerClass::PowerButton;
- /***********************************************************************************************
- * PowerClass::PowerClass -- Default constructor for the power bar class. *
- * *
- * This is the default constructor for the power bar class. It doesn't really do anything. *
- * *
- * INPUT: none *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 12/20/1994 JLB : Created. *
- *=============================================================================================*/
- PowerClass::PowerClass(void) :
- IsToRedraw(false),
- IsActive(false),
- FlashTimer(0),
- RecordedDrain(-1),
- RecordedPower(-1),
- DesiredDrainHeight(0),
- DesiredPowerHeight(0),
- DrainHeight(0),
- PowerHeight(0),
- DrainBounce(0),
- PowerBounce(0),
- PowerDir(0),
- DrainDir(0)
- {
- }
- /***********************************************************************************************
- * PowerClass::Init_Clear -- Clears all the power bar variables. *
- * *
- * This routine is called in preparation for the start of a scenario. The power bar is *
- * initialized into the null state by this routine. As soon as the scenario starts, the *
- * power bar will rise to reflect the actual power output and drain. *
- * *
- * INPUT: none *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 08/07/1995 JLB : Created. *
- *=============================================================================================*/
- void PowerClass::Init_Clear(void)
- {
- RadarClass::Init_Clear();
- RecordedDrain = -1;
- RecordedPower = -1;
- DesiredDrainHeight = 0;
- DesiredPowerHeight = 0;
- DrainHeight = 0;
- PowerHeight = 0;
- PowerBounce = 0;
- DrainBounce = 0;
- DrainDir = 0;
- PowerDir = 0;
- FlashTimer = 0;
- }
- /***********************************************************************************************
- * PowerClass::One_Time -- One time processing for the power bar. *
- * *
- * This routine is for code that truly only needs to be done once per game run. *
- * *
- * INPUT: none *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 12/26/1994 JLB : Created. *
- *=============================================================================================*/
- void PowerClass::One_Time(void)
- {
- RadarClass::One_Time();
- PowerButton.X = POWER_X * RESFACTOR;
- PowerButton.Y = POWER_Y * RESFACTOR;
- PowerButton.Width = (POWER_WIDTH * RESFACTOR)-1;
- PowerButton.Height = POWER_HEIGHT * RESFACTOR;
- PowerShape = MFCD::Retrieve("POWER.SHP");
- PowerBarShape = MFCD::Retrieve("POWERBAR.SHP");
- }
- /***********************************************************************************************
- * PowerClass::Draw_It -- Renders the power bar graphic. *
- * *
- * This routine will draw the power bar graphic to the LogicPage. *
- * *
- * INPUT: complete -- Should the power bar be redrawn even if it isn't specifically flagged *
- * to do so? *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 12/20/1994 JLB : Created. *
- * 12/27/1994 JLB : Changes power bar color depending on amount of power. *
- *=============================================================================================*/
- void PowerClass::Draw_It(bool complete)
- {
- static int _modtable[]={
- 0, -1, 0, 1, 0, -1, -2, -1, 0, 1, 2, 1 ,0
- };
- if (complete || IsToRedraw) {
- BStart(BENCH_POWER);
- if (LogicPage->Lock()) {
- if (Map.IsSidebarActive) {
- IsToRedraw = false;
- ShapeFlags_Type flags = SHAPE_NORMAL;
- void const * remap = NULL;
- if (FlashTimer > 1 && ((FlashTimer % 3) & 0x01) != 0) {
- flags = flags | SHAPE_FADING;
- remap = Map.FadingRed;
- }
- // LogicPage->Fill_Rect(POWER_X, POWER_Y, POWER_X+POWER_WIDTH-1, POWER_Y+POWER_HEIGHT-1, LTGREY);
- CC_Draw_Shape(PowerBarShape, 0, 240 * RESFACTOR, 88 * RESFACTOR, WINDOW_MAIN, flags | SHAPE_NORMAL | SHAPE_WIN_REL, remap);
- #ifdef WIN32
- /*
- ** Hires power strip is too big to fit into a shape so it is in two parts
- */
- CC_Draw_Shape(PowerBarShape, 1, 240 * RESFACTOR, (88 * RESFACTOR) + (56*RESFACTOR), WINDOW_MAIN, flags | SHAPE_NORMAL | SHAPE_WIN_REL, remap);
- #endif
- /*
- ** Determine how much the power production exceeds or falls short
- ** of power demands.
- */
- int bottom = (POWER_Y + POWER_HEIGHT - 1) * RESFACTOR;
- int power_height = (PowerHeight == DesiredPowerHeight) ? PowerHeight + (_modtable[PowerBounce] * PowerDir) : PowerHeight;
- int drain_height = (DrainHeight == DesiredDrainHeight) ? DrainHeight + (_modtable[DrainBounce] * DrainDir) : DrainHeight;
- power_height = Bound(power_height, 0, POWER_HEIGHT - 2);
- drain_height = Bound(drain_height, 0, POWER_HEIGHT - 2);
- /*
- ** Draw the power output graphic on top of the power bar framework.
- */
- if (power_height) {
- int color1 = 3;
- int color2 = 4;
- if (PlayerPtr->Drain > PlayerPtr->Power) {
- color1 = 214;
- color2 = 211;
- }
- if (PlayerPtr->Drain > (PlayerPtr->Power * 2)) {
- color1 = 235;
- color2 = 230;
- }
- /*
- ** New power bar is in slightly different place
- **
- ** Old power bar was 107 pixels high. New bar is 153 pixels high.
- **
- ** ST - 5/2/96 11:23AM
- */
- #ifdef WIN32
- power_height = (power_height*(76*RESFACTOR+1)) / (53*RESFACTOR+1);
- drain_height = (drain_height*(76*RESFACTOR+1)) / (53*RESFACTOR+1);
- #endif
- bottom = (175*RESFACTOR)+1;
- LogicPage->Fill_Rect(245*RESFACTOR, bottom-power_height, 245*RESFACTOR+1, bottom, color2);
- LogicPage->Fill_Rect(246*RESFACTOR, bottom-power_height, 246*RESFACTOR+1, bottom, color1);
- }
- /*
- ** Draw the power drain threshold marker.
- */
- CC_Draw_Shape(PowerShape, 0, (POWER_X * RESFACTOR)+RESFACTOR, bottom - (drain_height + (2 * RESFACTOR)), WINDOW_MAIN, flags | SHAPE_NORMAL, remap);
- }
- LogicPage->Unlock();
- }
- BEnd(BENCH_POWER);
- }
- RadarClass::Draw_It(complete);
- }
- /***********************************************************************************************
- * PowerClass::AI -- Process the power bar logic. *
- * *
- * Use this routine to process the power bar logic. This consists of animation effects. *
- * *
- * INPUT: input -- The player input value to be consumed or ignored as appropriate. *
- * *
- * x,y -- Mouse coordinate parameters to use. *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 12/20/1994 JLB : Created. *
- * 12/31/1994 JLB : Uses mouse coordinate parameters. *
- *=============================================================================================*/
- void PowerClass::AI(KeyNumType &input, int x, int y)
- {
- if (Map.IsSidebarActive /*IsActive*/) {
- int olddrain = DrainHeight;
- int oldpower = PowerHeight;
- /*
- ** If the recorded power value has changed we need to adjust for
- ** it.
- */
- if (PlayerPtr->Power != RecordedPower) {
- DesiredPowerHeight = Power_Height(PlayerPtr->Power);
- RecordedPower = PlayerPtr->Power;
- PowerBounce = 12;
- if (PowerHeight > DesiredPowerHeight) {
- PowerDir = -1;
- } else if (PowerHeight < DesiredPowerHeight) {
- PowerDir = 1;
- } else {
- PowerBounce = 0;
- }
- }
- /*
- ** If the recorded drain value has changed we need to adjust for
- ** it.
- */
- if (PlayerPtr->Drain != RecordedDrain) {
- DesiredDrainHeight = Power_Height(PlayerPtr->Drain);
- RecordedDrain = PlayerPtr->Drain;
- DrainBounce = 12;
- if (DrainHeight > DesiredDrainHeight) {
- DrainDir = -1;
- } else if (DrainHeight < DesiredDrainHeight) {
- DrainDir = 1;
- } else {
- DrainBounce = 0;
- }
- }
- if (DrainBounce && DrainHeight == DesiredDrainHeight) {
- IsToRedraw = true;
- Flag_To_Redraw(false);
- DrainBounce--;
- } else {
- /*
- ** If we need to move the drain height then do so.
- */
- if (DrainHeight != DesiredDrainHeight) {
- DrainHeight += DrainDir;
- }
- }
- if (PowerBounce && PowerHeight == DesiredPowerHeight) {
- IsToRedraw = true;
- Flag_To_Redraw(false);
- PowerBounce--;
- } else {
- /*
- ** If we need to move the power height then do so.
- */
- if (PowerHeight != DesiredPowerHeight) {
- PowerHeight += PowerDir;
- }
- }
- if (olddrain != DrainHeight || oldpower != PowerHeight) {
- IsToRedraw = true;
- Flag_To_Redraw(false);
- }
- /*
- ** Flag to redraw if the power bar flash effect has expired.
- */
- // if (FlashTimer == 1) {
- if (FlashTimer > 0) {
- IsToRedraw = true;
- Flag_To_Redraw(false);
- }
- }
- RadarClass::AI(input, x, y);
- }
- /***********************************************************************************************
- * PowerClass::Refresh_Cells -- Intercepts the redraw logic to see if sidebar to redraw too. *
- * *
- * This routine will examine a refresh list request and determine if the sidebar would be *
- * affect. If so, it will flag the sidebar to be redrawn. *
- * *
- * INPUT: cell -- The cell that the offset list is base on. *
- * *
- * list -- The list of cell offset used to flag for redraw. If the special sidebar *
- * affecting cell magic offset number is detected, the sidebar is flagged *
- * for redraw and the magic offset is removed. *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 06/01/1995 JLB : Created. *
- *=============================================================================================*/
- void PowerClass::Refresh_Cells(CELL cell, short const * list)
- {
- if (*list == REFRESH_SIDEBAR) {
- IsToRedraw = true;
- Flag_To_Redraw(false);
- }
- RadarClass::Refresh_Cells(cell, list);
- }
- /***************************************************************************
- * PowerClass::Power_Height -- Given a value figure where it falls on bar *
- * *
- * INPUT: int value - the value we are testing *
- * *
- * OUTPUT: int the height of the point that this value is on graph *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 06/14/1995 PWG : Created. *
- *=========================================================================*/
- int PowerClass::Power_Height(int value)
- {
- int num = value/ POWER_STEP_LEVEL; // figure out the initial num of DRAIN_VALUE's
- int retval = 0; // currently there is no power
- /*
- ** Loop through the different hundreds figuring out the fractional piece
- ** of each.
- */
- for (int lp = 0; lp < num; lp ++) {
- retval = retval + (((POWER_HEIGHT - 2) - retval) / POWER_STEP_FACTOR);
- value -= POWER_STEP_LEVEL;
- }
- /*
- ** Adjust the retval to factor in the remainder
- */
- if (value) {
- retval = retval + (((((POWER_HEIGHT - 2) - retval) / POWER_STEP_FACTOR) * value) / POWER_STEP_LEVEL);
- }
- retval = Bound(retval, 0, POWER_HEIGHT-2);
- return(retval);
- }
- /***********************************************************************************************
- * PowerClass::PowerButtonClass::Action -- Handles the mouse over the power bar area. *
- * *
- * This routine handles input on the power bar area. Since no input is used for the power *
- * bar, this routine just pops up appropriate help text for the power bar. *
- * *
- * INPUT: flags -- The event flags that triggered this action call. *
- * *
- * key -- The key code (if any) associated with the trigger event. *
- * *
- * OUTPUT: Should further button processing be stopped? *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 08/07/1995 JLB : Created. *
- *=============================================================================================*/
- int PowerClass::PowerButtonClass::Action(unsigned flags, KeyNumType & key)
- {
- if (!Map.IsSidebarActive) {
- return(false);
- }
- /*
- ** Force any help label to disappear when the mouse is held over the
- ** radar map.
- */
- Map.Override_Mouse_Shape(MOUSE_NORMAL);
- if (PlayerPtr->Power_Fraction() < 1 && PlayerPtr->Power > 0) {
- Map.Help_Text(TXT_POWER_OUTPUT_LOW, -1, -1, GadgetClass::Get_Color_Scheme()->Color);
- } else {
- Map.Help_Text(TXT_POWER_OUTPUT, -1, -1, GadgetClass::Get_Color_Scheme()->Color);
- }
- GadgetClass::Action(flags, key);
- return(true);
- }
- /***********************************************************************************************
- * PowerClass::Flash_Power -- Flag the power bar to flash. *
- * *
- * This will cause the power bar to display with a flash so as to draw attention to *
- * itself. Typical use of this effect is when power is low. *
- * *
- * INPUT: none *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 10/14/1996 JLB : Created. *
- *=============================================================================================*/
- void PowerClass::Flash_Power(void)
- {
- FlashTimer = TICKS_PER_SECOND;
- IsToRedraw = true;
- Flag_To_Redraw(false);
- }
|