// // 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/MOUSE.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 : MOUSE.CPP * * * * Programmer : Joe L. Bostic * * * * Start Date : 12/15/94 * * * * Last Update : September 21, 1995 [JLB] * * * *---------------------------------------------------------------------------------------------* * Functions: * * MouseClass::AI -- Process player input as it relates to the mouse * * MouseClass::Init_Clear -- Sets the mouse system to a known state * * MouseClass::MouseClass -- Default constructor for the mouse handler class. * * MouseClass::Mouse_Small -- Controls the sizing of the mouse. * * MouseClass::One_Time -- Performs the one time initialization of the mouse system. * * MouseClass::Override_Mouse_Shape -- Alters the shape of the mouse. * * MouseClass::Revert_Mouse_Shape -- Reverts the mouse shape to the non overridden shape. * * MouseClass::Set_Default_Mouse -- Sets the mouse to match the shape specified. * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #include "function.h" /* ** This points to the loaded mouse shapes. */ void const * MouseClass::MouseShapes; /* ** This is the timer that controls the mouse animation. It is always at a fixed ** rate so it uses the constant system timer. */ CDTimerClass MouseClass::Timer = 0; /*********************************************************************************************** * MouseClass::MouseClass -- Default constructor for the mouse handler class. * * * * This is the default constructor for the mouse handling class. It merely sets up the * * mouse system to its default state. * * * * INPUT: none * * * * OUTPUT: none * * * * WARNINGS: none * * * * HISTORY: * * 12/24/1994 JLB : Created. * *=============================================================================================*/ MouseClass::MouseClass(void) : IsSmall(false), CurrentMouseShape(MOUSE_NORMAL), NormalMouseShape(MOUSE_NORMAL), Frame(0) { } /*********************************************************************************************** * MouseClass::Set_Default_Mouse -- Sets the mouse to match the shape specified. * * * * This routine is used to inform the display system as to which mouse shape is desired. * * * * INPUT: mouse -- The mouse shape number to set the mouse to. * * * * OUTPUT: none * * * * WARNINGS: none * * * * HISTORY: * * 09/19/1994 JLB : Created. * *=============================================================================================*/ void MouseClass::Set_Default_Mouse(MouseType mouse, bool size) { assert((unsigned)mouse < MOUSE_COUNT); NormalMouseShape = mouse; Override_Mouse_Shape(mouse, size); } /*********************************************************************************************** * MouseClass::Revert_Mouse_Shape -- Reverts the mouse shape to the non overridden shape. * * * * Use this routine to cancel the effects of Override_Mouse_Shape(). It will revert the * * mouse back to the original shape. * * * * INPUT: none * * * * OUTPUT: none * * * * WARNINGS: none * * * * HISTORY: * * 03/27/1995 JLB : Created. * *=============================================================================================*/ void MouseClass::Revert_Mouse_Shape(void) { Override_Mouse_Shape(NormalMouseShape, false); } /*********************************************************************************************** * MouseClass::Mouse_Small -- Controls the sizing of the mouse. * * * * This routine is called to change the mouse sizing override. If the mouse can change * * size to that specified, then the mouse imagery will be changed. If a change of imagery * * cannot occur (due to lack of appropriate artwork), then no action will be performed. * * * * INPUT: small -- Should the mouse be made small? If not, then it will be made large. * * * * OUTPUT: none * * * * WARNINGS: none * * * * HISTORY: * * 09/21/1995 JLB : Created. * *=============================================================================================*/ void MouseClass::Mouse_Small(bool wsmall) { MouseStruct const * control = &MouseControl[CurrentMouseShape]; if (IsSmall == wsmall) { return; } IsSmall = wsmall; if (wsmall) { if (control->SmallFrame != -1) { Set_Mouse_Cursor(control->X, control->Y, Extract_Shape(MouseShapes, control->SmallFrame + Frame/4)); } else { Set_Mouse_Cursor(MouseControl[MOUSE_NORMAL].X, MouseControl[MOUSE_NORMAL].Y, Extract_Shape(MouseShapes, MOUSE_NORMAL)); } } else { Set_Mouse_Cursor(control->X, control->Y, Extract_Shape(MouseShapes, control->StartFrame + Frame/4)); } } /*********************************************************************************************** * MouseClass::Override_Mouse_Shape -- Alters the shape of the mouse. * * * * This routine is used to alter the shape of the mouse as needed. * * Typical mouse shape change occurs when scrolling the map or * * selecting targets. * * * * INPUT: mouse -- The mouse shape number to use. * * * * OUTPUT: bool; Was the mouse shape changed? * * * * WARNINGS: This is not intended to be used as a means to hide the * * mouse. Nor will it work correctly if the mouse shape * * file hasn't been loaded. * * * * HISTORY: * * 03/10/1994 JLB : Created. * * 06/03/1994 JLB : Made into member function. * * 12/24/1994 JLB : Added small control parameter. * *=============================================================================================*/ #ifdef WIN32 void Block_Mouse(GraphicBufferClass *buffer); void Unblock_Mouse(GraphicBufferClass *buffer); #endif bool MouseClass::Override_Mouse_Shape(MouseType mouse, bool wsmall) { assert((unsigned)mouse < MOUSE_COUNT); MouseStruct const * control = &MouseControl[mouse]; static bool startup = false; int baseshp; /* ** Only certain mouse shapes have a small counterpart. If the requested mouse ** shape is not one of these, then force the small size override flag to false. */ if (control->SmallFrame == -1) { wsmall = false; } /* ** If the mouse shape is going to change, then inform the mouse driver of the ** change. */ if (!startup || (MouseShapes && ((mouse != CurrentMouseShape) || (wsmall != IsSmall)))) { startup = true; Timer = control->FrameRate; Frame = 0; baseshp = (wsmall) ? control->SmallFrame : control->StartFrame; if (baseshp == -1) { baseshp = control->StartFrame; } Set_Mouse_Cursor(control->X, control->Y, Extract_Shape(MouseShapes, baseshp)); CurrentMouseShape = mouse; IsSmall = wsmall; return(true); } return(false); } /*********************************************************************************************** * MouseClass::AI -- Process player input as it relates to the mouse * * * * This routine will is to be called once per game tick and is passed the player keyboard * * or mouse input code. It processes this code and updates the mouse shape as appropriate. * * * * INPUT: input -- The player input code as returned from Keyboard->Get(). * * * * x,y -- The mouse coordinate values to use. * * * * OUTPUT: none * * * * WARNINGS: none * * * * HISTORY: * * 12/24/1994 JLB : Created. * * 12/31/1994 JLB : Uses mouse coordinate parameters. * * 03/27/1995 JLB : New animation control. * * 05/28/1995 JLB : Moderates animation so is more steady regardless of speed. * * 06/30/1995 JLB : Uses constant timer system. * *=============================================================================================*/ void MouseClass::AI(KeyNumType &input, int x, int y) { MouseStruct const * control = &MouseControl[CurrentMouseShape]; if (control->FrameRate && Timer == 0) { Frame++; Frame %= control->FrameCount; Timer = control->FrameRate; if (!IsSmall || control->SmallFrame != -1) { int baseframe = (IsSmall) ? control->SmallFrame : control->StartFrame; if (baseframe == -1) baseframe = control->StartFrame; Set_Mouse_Cursor(control->X, control->Y, Extract_Shape(MouseShapes, baseframe + Frame)); } } ScrollClass::AI(input, x, y); } /*********************************************************************************************** * MouseClass::One_Time -- Performs the one time initialization of the mouse system. * * * * Use this routine to load the mouse data file and perform any other necessary one time * * preparations for the game. * * * * INPUT: none * * * * OUTPUT: none * * * * WARNINGS: Only call this routine ONCE. * * * * HISTORY: * * 12/24/1994 JLB : Created. * *=============================================================================================*/ void MouseClass::One_Time(void) { ScrollClass::One_Time(); /* ** Override the mouse shape file with the one in the current directory, but only if there ** is an override file available. */ #ifndef NDEBUG RawFileClass file("MOUSE.SHP"); if (file.Is_Available()) { MouseShapes = Load_Alloc_Data(file); } else { MouseShapes = MFCD::Retrieve("MOUSE.SHP"); } #else MouseShapes = MFCD::Retrieve("MOUSE.SHP"); #endif } /*********************************************************************************************** * MouseClass::Init_Clear -- Sets the mouse system to a known state * * * * This routine will reset the mouse handling system. Typically, this routine is called * * when preparing for the beginning of a new scenario. * * * * INPUT: theater -- The theater that the scenario will take place. * * * * OUTPUT: none * * * * WARNINGS: none * * * * HISTORY: * * 12/24/1994 JLB : Created. * *=============================================================================================*/ void MouseClass::Init_Clear(void) { ScrollClass::Init_Clear(); IsSmall = false; NormalMouseShape = MOUSE_NORMAL; } /* ** This array of structures is used to control the mouse animation ** sequences. */ //#ifdef WIN32 //#define WD 45 //#define HT 36 //#else #define WD 29 #define HT 23 //#endif MouseClass::MouseStruct MouseClass::MouseControl[MOUSE_COUNT] = { {0, 1, 0, 80, 0, 0}, // MOUSE_NORMAL {1, 1, 0, -1, WD/2, 0}, // MOUSE_N {2, 1, 0, -1, WD, 0}, // MOUSE_NE {3, 1, 0, -1, WD, HT/2}, // MOUSE_E {4, 1, 0, -1, WD, HT}, // MOUSE_SE {5, 1, 0, -1, WD/2, HT}, // MOUSE_S {6, 1, 0, -1, 0, HT}, // MOUSE_SW {7, 1, 0, -1, 0, HT/2}, // MOUSE_W {8, 1, 0, -1, 0, 0}, // MOUSE_NW {124, 1, 0, -1, WD/2, 0}, // MOUSE_NO_N {125, 1, 0, -1, WD, 0}, // MOUSE_NO_NE {126, 1, 0, -1, WD, HT/2}, // MOUSE_NO_E {127, 1, 0, -1, WD, HT}, // MOUSE_NO_SE {128, 1, 0, -1, WD/2, HT}, // MOUSE_NO_S {129, 1, 0, -1, 0, HT}, // MOUSE_NO_SW {130, 1, 0, -1, 0, HT/2}, // MOUSE_NO_W {131, 1, 0, -1, 0, 0}, // MOUSE_NO_NW {14, 1, 0, 33, WD/2, HT/2}, // MOUSE_NO_MOVE {10, 4, 4, 29, WD/2, HT/2}, // MOUSE_CAN_MOVE {113, 3, 4, 142, WD/2, HT/2}, // MOUSE_ENTER {59, 9, 4, -1, WD/2, HT/2}, // MOUSE_DEPLOY {15, 6, 4, -1, WD/2, HT/2}, // MOUSE_CAN_SELECT {21, 8, 4, 134, WD/2, HT/2}, // MOUSE_CAN_ATTACK {68, 12, 2, -1, WD/2, HT/2}, // MOUSE_SELL_BACK {148, 12, 2, -1, WD/2, HT/2}, // MOUSE_SELL_UNIT {35, 24, 2, -1, WD/2, HT/2}, // MOUSE_REPAIR {120, 1, 0, -1, WD/2, HT/2}, // MOUSE_NO_REPAIR {119, 1, 0, -1, WD/2, HT/2}, // MOUSE_NO_SELL_BACK {81, 1, 0, 145, WD/2, HT/2}, // MOUSE_RADAR_CURSOR {90, 7, 4, -1, WD/2, HT/2}, // MOUSE_NUCLEAR_BOMB {82, 8, 2, 213, WD/2, HT/2}, // MOUSE_AIR_STRIKE {116, 3, 4, 121, WD/2, HT/2}, // MOUSE_DEMOLITIONS {147, 1, 0, 146, WD/2, HT/2}, // MOUSE_AREA_GUARD {160, 4, 4, 194, WD/2, HT/2}, // MOUSE_HEAL {164, 3, 4, 167, WD/2, HT/2}, // MOUSE_DAMAGE {170, 24, 2, -1, WD/2, HT/2}, // MOUSE_GREPAIR {195, 8, 4, 203, WD/2, HT/2}, // MOUSE_STAY_ATTACK {211, 1, 0, -1, WD/2, HT/2}, // MOUSE_NO_DEPLOY {212, 1, 0, -1, WD/2, HT/2}, // MOUSE_NO_ENTER {213, 1, 0, -1, WD/2, HT/2}, // MOUSE_NO_REPAIR {97, 8, 3, -1, WD/2, HT/2}, // MOUSE_CHRONO_SELECT {105, 8, 2, -1, WD/2, HT/2}, // MOUSE_CHRONO_DEST };