123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- //
- // 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: F:\projects\c&c\vcs\code\scroll.cpv 2.18 16 Oct 1995 16:49:08 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 : SCROLL.CPP *
- * *
- * Programmer : Joe L. Bostic *
- * *
- * Start Date : 01/08/95 *
- * *
- * Last Update : August 25, 1995 [JLB] *
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * ScrollClass::AI -- Handles scroll AI processing. *
- * ScrollClass::ScrollClass -- Constructor for the scroll class object. *
- * ScrollClass::Set_Autoscroll -- Turns autoscrolling on or off. *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "function.h"
- #define SCROLL_DELAY 1
- CountDownTimerClass ScrollClass::Counter;
- /***********************************************************************************************
- * ScrollClass::ScrollClass -- Constructor for the scroll class object. *
- * *
- * This is the constructor for the scroll class object. *
- * *
- * INPUT: none *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 08/10/1995 JLB : Created. *
- *=============================================================================================*/
- ScrollClass::ScrollClass(void)
- {
- IsAutoScroll = true;
- Counter.Set(SCROLL_DELAY);
- Inertia = 0;
- Counter.Start();
- }
- /***********************************************************************************************
- * ScrollClass::AI -- Handles scroll AI processing. *
- * *
- * This routine is called every game frame for purposes of input processing. *
- * *
- * INPUT: input -- Reference to the keyboard/mouse event that just occurred. *
- * *
- * x,y -- The mouse coordinates. *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 08/10/1995 JLB : Created. *
- * 08/10/1995 JLB : Revamped for free smooth scrolling. *
- * 08/25/1995 JLB : Handles new scrolling option. *
- *=============================================================================================*/
- #define EVA_WIDTH 80
- void ScrollClass::AI(KeyNumType &input, int x, int y)
- {
- #if 0
- static DirType direction;
- bool player_scrolled=false;
- /*
- ** If rubber band mode is in progress, then don't allow scrolling of the tactical map.
- */
- if (!IsRubberBand /*&& !IsTentative*/) {
- /*
- ** Special check to not scroll within the special no-scroll regions.
- */
- bool noscroll = false;
- if (Special.IsScrollMod && y == 0 && ((x > 3 && x < EVA_WIDTH) || (x > SeenBuff.Get_Width()-EVA_WIDTH && x < SeenBuff.Get_Width()-3))) {
- noscroll = true;
- }
- if (!noscroll) {
- /*
- ** Verify that the mouse is over a scroll region.
- */
- if (Inertia || y == 0 || x == 0 || x == (SeenBuff.Get_Width()-1) || y == (SeenBuff.Get_Height()-1)) {
- if (y == 0 || x == 0 || x == (SeenBuff.Get_Width()-1) || y == (SeenBuff.Get_Height()-1)) {
- player_scrolled=true;
- /*
- ** Adjust the mouse coordinates to emphasise the
- ** cardinal directions over the diagonals.
- */
- int altx = x;
- if (altx < 50) altx -= (50-altx)*2;
- altx = MAX(altx, 0);
- if (altx > (SeenBuff.Get_Width()-50)) altx += (altx-(SeenBuff.Get_Width()-50))*2;
- altx = MIN(altx, SeenBuff.Get_Width());
- if (altx > 50 && altx < (SeenBuff.Get_Width()-50)) {
- altx += ((SeenBuff.Get_Width()/2)-altx)/2;
- }
- int alty = y;
- if (alty < 50) alty -= (50-alty);
- alty = MAX(alty, 0);
- if (alty > (SeenBuff.Get_Height()-50)) alty += ((alty-(SeenBuff.Get_Height()-50)));
- alty = MIN(alty, SeenBuff.Get_Height());
- direction = (DirType)Desired_Facing256((SeenBuff.Get_Width())/2, (SeenBuff.Get_Height())/2, altx, alty);
- }
- int control = Dir_Facing(direction);
- /*
- ** The mouse is over a scroll region so set the mouse shape accordingly if the map
- ** can be scrolled in the direction indicated.
- */
- static int _rate[9] = {
- 0x01C0,
- 0x0180,
- 0x0140,
- 0x0100,
- 0x00C0,
- 0x0080,
- 0x0040,
- 0x0020,
- 0x0010
- };
- int rate = 8-Inertia;
- if (rate<Options.ScrollRate+1){
- rate = Options.ScrollRate+1;
- Inertia = 8-rate;
- }
- /*
- ** Increase the scroll rate if the mouse button is held down.
- */
- // if (Keyboard::Down(KN_LMOUSE)) {
- // rate = Bound(rate-3, 0, 4);
- // }
- if (Keyboard::Down(KN_RMOUSE)) {
- rate = Bound(rate+1, 4, (int)(sizeof(_rate)/sizeof(_rate[0]))-1);
- }
- /*
- ** If options indicate that scrolling should be forced to
- ** one of the 8 facings, then adjust the direction value
- ** accordingly.
- */
- if (!Options.IsFreeScroll) {
- direction = Facing_Dir(Dir_Facing(direction));
- }
- int distance = _rate[rate]/2;
- if (!Scroll_Map(direction, distance, false)) {
- Override_Mouse_Shape((MouseType)(MOUSE_NO_N+control), false);
- } else {
- Override_Mouse_Shape((MouseType)(MOUSE_N+control), false);
- /*
- ** If the mouse button is pressed or auto scrolling is active, then scroll
- ** the map if the delay counter indicates.
- */
- if (Keyboard::Down(KN_LMOUSE) || IsAutoScroll) {
- distance = _rate[rate];
- Scroll_Map(direction, distance, true);
- if (Counter.Time()==0 && player_scrolled) {
- Counter.Set(SCROLL_DELAY);
- Inertia++;
- }
- }
- }
- }
- if (!player_scrolled){
- if (Counter.Time()==0) {
- Inertia--;
- if (Inertia<0) Inertia++;
- Counter.Set(SCROLL_DELAY);
- }
- }
- }
- }
- #endif
- HelpClass::AI(input, x, y);
- }
- /***********************************************************************************************
- * ScrollClass::Set_Autoscroll -- Turns autoscrolling on or off. *
- * *
- * This routine controls the autoscrolling setting. Autoscroll, when active, will cause the *
- * map to scroll if the mouse is held over the scroll region. This is regardless of whether *
- * any mouse button is held down or not. *
- * *
- * INPUT: control -- Should the autoscroll be turned on? *
- * 0 = turn off *
- * 1 = turn on *
- * -1 = toggle currrent setting *
- * *
- * OUTPUT: Returns with the old setting of the autoscroll flag. *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 08/10/1995 JLB : Created. *
- *=============================================================================================*/
- bool ScrollClass::Set_Autoscroll(int control)
- {
- bool old = IsAutoScroll;
- switch (control) {
- case -1:
- IsAutoScroll = !IsAutoScroll;
- break;
- default:
- IsAutoScroll = control;
- break;
- }
- return(old);
- }
|