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.
This commit is contained in:
parent
ea8ecc76fa
commit
03416d24e1
1038 changed files with 629779 additions and 0 deletions
267
REDALERT/SCROLL.CPP
Normal file
267
REDALERT/SCROLL.CPP
Normal file
|
@ -0,0 +1,267 @@
|
|||
//
|
||||
// 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);
|
||||
}
|
||||
|
||||
|
Reference in a new issue