268 lines
12 KiB
C++
268 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: /CounterStrike/SCROLL.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 : 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"
|
|
|
|
#ifdef WIN32
|
|
#define SCROLL_DELAY 1
|
|
#else
|
|
#define SCROLL_DELAY 2
|
|
#endif
|
|
|
|
CDTimerClass<SystemTimerClass> 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 = SCROLL_DELAY;
|
|
Inertia = 0;
|
|
}
|
|
|
|
|
|
/***********************************************************************************************
|
|
* 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
|
|
bool player_scrolled=false;
|
|
static DirType direction;
|
|
int rate;
|
|
|
|
|
|
/*
|
|
** 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 (!noscroll) {
|
|
bool at_screen_edge = (y == 0 || x == 0 || x >= SeenBuff.Get_Width()-1 || y >= SeenBuff.Get_Height()-1);
|
|
|
|
/*
|
|
** Verify that the mouse is over a scroll region.
|
|
*/
|
|
if (Inertia || at_screen_edge) {
|
|
if (at_screen_edge) {
|
|
|
|
player_scrolled=true;
|
|
|
|
/*
|
|
** Adjust the mouse coordinates to emphasize the
|
|
** cardinal directions over the diagonals.
|
|
*/
|
|
int altx = x;
|
|
if (altx < 50 * RESFACTOR) altx -= ((50 * RESFACTOR)-altx);
|
|
altx = max(altx, 0);
|
|
if (altx > ((320-50) * RESFACTOR)) altx += altx-((320-50) * RESFACTOR);
|
|
altx = min(altx, (320 * RESFACTOR));
|
|
if (altx > (50 * RESFACTOR) && altx < ((320-50) * RESFACTOR)) {
|
|
altx += (((320/2) * RESFACTOR)-altx)/2;
|
|
}
|
|
|
|
int alty = y;
|
|
if (alty < (50 * RESFACTOR)) alty -= (50 * RESFACTOR)-alty;
|
|
alty = max(alty, 0);
|
|
if (alty > (150 * RESFACTOR)) alty += alty-(150 * RESFACTOR);
|
|
alty = min(alty, 200 * RESFACTOR);
|
|
|
|
direction = (DirType)Desired_Facing256((320/2) * RESFACTOR, (200/2) * RESFACTOR, 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] = {
|
|
0x00E0*RESFACTOR,
|
|
0x00C0*RESFACTOR,
|
|
0x00A0*RESFACTOR,
|
|
0x0080*RESFACTOR,
|
|
0x0060*RESFACTOR,
|
|
0x0040*RESFACTOR,
|
|
0x0020*RESFACTOR,
|
|
0x0010*RESFACTOR,
|
|
0x0008*RESFACTOR
|
|
};
|
|
if (Debug_Map) {
|
|
rate = Options.ScrollRate+1;
|
|
} else {
|
|
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.
|
|
*/
|
|
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];
|
|
|
|
if (Debug_Map) {
|
|
Scroll_Map(direction, distance, true);
|
|
Counter = SCROLL_DELAY;
|
|
} else {
|
|
distance = _rate[rate];
|
|
Scroll_Map(direction, distance, true);
|
|
|
|
if (Counter == 0 && player_scrolled) {
|
|
Counter = SCROLL_DELAY;
|
|
Inertia++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
if (!Debug_Map && !player_scrolled) {
|
|
if (!Counter) {
|
|
Inertia--;
|
|
if (Inertia<0) Inertia++;
|
|
Counter = 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 current 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);
|
|
}
|
|
|
|
|