CnC_Remastered_Collection/TIBERIANDAWN/SCROLL.CPP
PG-SteveT 03416d24e1 Initial Source Code commit
Initial commit of original Tiberian Dawn and Red Alert source code converted to build as DLLs, and compatible with the release version of Command & Conquer Remastered.
2020-05-27 12:16:20 -07:00

255 lines
12 KiB
C++

//
// 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);
}