400 lines
13 KiB
C++
400 lines
13 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/MAPSEL.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 : MAPSEL.CPP *
|
|
* *
|
|
* Programmer : Barry W. Green *
|
|
* *
|
|
* Start Date : April 17, 1995 *
|
|
* *
|
|
* Last Update : April 27, 1995 [BWG] *
|
|
* *
|
|
*---------------------------------------------------------------------------------------------*
|
|
* Functions: *
|
|
* Bit_It_In -- Pixel fade graphic copy. *
|
|
* Map_Selection -- Starts the whole process of selecting next map to go to *
|
|
* Print_Statistics -- Prints statistics on country selected *
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
|
|
#include "function.h"
|
|
|
|
void Cycle_Call_Back_Delay(int time, PaletteClass &pal);
|
|
extern int ControlQ;
|
|
|
|
int Mouse_Over_Spot(int house, int scenario);
|
|
void Set_Mouse(MouseType shape, int &start, int &count, int &delay, int &xspot, int &yspot);
|
|
//VG for ant mission progression
|
|
const char* antmission[] = {NULL, "SCA01EA.INI", "SCA02EA.INI", "SCA03EA.INI", "SCA04EA.INI"};
|
|
|
|
struct point {
|
|
int x;
|
|
int y;
|
|
} const MapCoords[2][14][3] = {
|
|
{
|
|
{{185,123},{ -1, -1},{ -1, -1}},
|
|
{{173,112},{ -1, -1},{ -1, -1}},
|
|
{{196,100},{200,112},{ -1, -1}},
|
|
{{175,113},{ -1, -1},{ -1, -1}},
|
|
{{187, 91},{202, 93},{206,105}},
|
|
{{207,161},{212,172},{ -1, -1}},
|
|
{{172, 92},{ -1, -1},{ -1, -1}},
|
|
{{132,119},{146,125},{ -1, -1}},
|
|
{{199, 73},{205, 86},{ -1, -1}},
|
|
{{236,114},{ -1, -1},{ -1, -1}},
|
|
{{219, 64},{225, 76},{ -1, -1}},
|
|
{{256, 69},{ -1, -1},{ -1, -1}},
|
|
{{262, 77},{ -1, -1},{ -1, -1}},
|
|
{{249, 97},{ -1, -1},{ -1, -1}}
|
|
},
|
|
// Soviet coords
|
|
{
|
|
{{178,105},{ -1, -1},{ -1, -1}},
|
|
{{163,101},{163,113},{ -1, -1}},
|
|
{{160, 89},{ -1, -1},{ -1, -1}},
|
|
{{142,101},{142,117},{ -1, -1}},
|
|
{{212,163},{ -1, -1},{ -1, -1}},
|
|
{{155,133},{171,144},{ -1, -1}},
|
|
{{216,103},{ -1, -1},{ -1, -1}},
|
|
{{132,145},{154,154},{ -1, -1}},
|
|
{{122,117},{ -1, -1},{ -1, -1}},
|
|
{{117,130},{ -1, -1},{ -1, -1}},
|
|
{{ 99,107},{109,146},{ -1, -1}},
|
|
{{134,125},{ -1, -1},{ -1, -1}},
|
|
{{ 32,156},{ 46,171},{ -1, -1}},
|
|
{{108, 97},{ -1, -1},{ -1, -1}}
|
|
}
|
|
};
|
|
|
|
#ifndef WIN32
|
|
extern short StreamLowImpact;
|
|
#endif //WIN32
|
|
|
|
/***********************************************************************************************
|
|
* Map_Selection -- Starts the whole process of selecting next map to go to *
|
|
* *
|
|
* *
|
|
* INPUT: *
|
|
* *
|
|
* OUTPUT: none *
|
|
* *
|
|
* WARNINGS: none *
|
|
* *
|
|
* HISTORY: *
|
|
* 07/18/1996 BWG : Created. *
|
|
*=============================================================================================*/
|
|
extern int CopyType;
|
|
#ifndef WIN32
|
|
extern short StreamLowImpact;
|
|
#endif
|
|
char const * Map_Selection(void)
|
|
{
|
|
return NULL;
|
|
#if (0)//PG
|
|
static char scenarioname[_MAX_FNAME+_MAX_EXT];
|
|
|
|
#ifdef FIXIT_ANTS
|
|
if (AntsEnabled) {
|
|
strcpy(scenarioname, Scen.ScenarioName);
|
|
char buf[10];
|
|
sprintf(buf, "%02d", Scen.Scenario+1);
|
|
memcpy(&scenarioname[3], buf, 2);
|
|
return(scenarioname);
|
|
}
|
|
|
|
#endif
|
|
char _filename[]="MSAA.WSA";
|
|
int house = (PlayerPtr->Class->House == HOUSE_USSR || PlayerPtr->Class->House == HOUSE_UKRAINE);
|
|
|
|
_filename[2] = house ? 'S' : 'A';
|
|
_filename[3] = Scen.Scenario + 'A';
|
|
PaletteClass mappalette;
|
|
|
|
int scenario = Scen.Scenario;
|
|
int selection;
|
|
static CDTimerClass<SystemTimerClass> timer;
|
|
int start = 0;
|
|
int count = 0;
|
|
int delay = 0;
|
|
int xspot = 0;
|
|
int yspot = 0;
|
|
|
|
void const * appear1 = MFCD::Retrieve("MAPWIPE2.AUD");
|
|
void const * bleep11 = MFCD::Retrieve("BLEEP11.AUD");
|
|
void const * country4 = MFCD::Retrieve("MAPWIPE5.AUD");
|
|
void const * toney7 = MFCD::Retrieve("TONEY7.AUD");
|
|
void const * bleep17 = MFCD::Retrieve("BLEEP17.AUD");
|
|
|
|
void const * scold1 = MFCD::Retrieve("TONEY4.AUD");
|
|
void const * country1 = MFCD::Retrieve("TONEY10.AUD");
|
|
|
|
#ifdef WIN32
|
|
GraphicBufferClass *pseudoseenbuff = new GraphicBufferClass(320, 200, (void*)NULL);
|
|
#endif
|
|
|
|
// fixed oldvolume = Options.ScoreVolume;
|
|
// Options.Set_Score_Volume(fixed(4, 10));
|
|
Theme.Queue_Song(THEME_MAP);
|
|
|
|
void *anim = Open_Animation(_filename, NULL, 0L, (WSAOpenType)(WSA_OPEN_FROM_MEM | WSA_OPEN_TO_PAGE), mappalette);
|
|
|
|
Keyboard->Clear();
|
|
SeenPage.Clear();
|
|
mappalette.Set(FADE_PALETTE_FAST, Call_Back);
|
|
|
|
#ifdef WIN32
|
|
pseudoseenbuff->Clear();
|
|
Animate_Frame(anim, *pseudoseenbuff, 1);
|
|
for(int x=0; x<256; x++) memset(&PaletteInterpolationTable[x][0],x,256);
|
|
CopyType = 1;
|
|
Interpolate_2X_Scale(pseudoseenbuff , &SeenBuff , 0);
|
|
#else
|
|
HidPage.Clear();
|
|
Animate_Frame(anim, HidPage, 1);
|
|
HidPage.Blit(SeenPage);
|
|
#endif
|
|
|
|
|
|
int frame = 1;
|
|
StreamLowImpact = true;
|
|
#ifdef WIN32
|
|
Play_Sample(appear1, 255, Options.Normalize_Volume(170));
|
|
#else
|
|
Play_Sample(appear1, 255, Options.Normalize_Volume(55));
|
|
#endif
|
|
while (frame < Get_Animation_Frame_Count(anim)) {
|
|
#ifdef WIN32
|
|
CopyType = 1;
|
|
Animate_Frame(anim, *pseudoseenbuff, frame++);
|
|
Interpolate_2X_Scale(pseudoseenbuff , &SeenBuff , NULL);
|
|
CopyType = 0;
|
|
#else
|
|
Animate_Frame(anim, SeenPage, frame++);
|
|
#endif
|
|
Call_Back_Delay(2);
|
|
switch(frame) {
|
|
case 16:
|
|
#ifdef WIN32
|
|
Play_Sample(bleep11, 255, Options.Normalize_Volume(170));
|
|
#else
|
|
Play_Sample(bleep11, 255, Options.Normalize_Volume(55));
|
|
#endif
|
|
break;
|
|
case 30:
|
|
#ifdef WIN32
|
|
Play_Sample(country4, 255, Options.Normalize_Volume(170));
|
|
#else
|
|
Play_Sample(country4, 255, Options.Normalize_Volume(55));
|
|
#endif
|
|
break;
|
|
case 51:
|
|
#ifdef WIN32
|
|
Play_Sample(toney7, 255, Options.Normalize_Volume(170));
|
|
#else
|
|
Play_Sample(toney7, 255, Options.Normalize_Volume(55));
|
|
#endif
|
|
break;
|
|
case 61:
|
|
#ifdef WIN32
|
|
Play_Sample(bleep17, 255, Options.Normalize_Volume(170));
|
|
#else
|
|
Play_Sample(bleep17, 255, Options.Normalize_Volume(55));
|
|
#endif
|
|
break;
|
|
}
|
|
}
|
|
StreamLowImpact = false;
|
|
Call_Back();
|
|
Close_Animation(anim);
|
|
Show_Mouse();
|
|
Keyboard->Clear();
|
|
|
|
bool done = 0;
|
|
MouseType shape = MOUSE_NORMAL;
|
|
while (!done) {
|
|
#ifdef WIN32
|
|
/*
|
|
** If we have just received input focus again after running in the background then
|
|
** we need to redraw.
|
|
*/
|
|
if (AllSurfaces.SurfacesRestored) {
|
|
AllSurfaces.SurfacesRestored=FALSE;
|
|
CopyType = 1;
|
|
Interpolate_2X_Scale(pseudoseenbuff , &SeenBuff , NULL);
|
|
CopyType = 0;
|
|
}
|
|
#endif
|
|
Cycle_Call_Back_Delay(1, mappalette);
|
|
int choice = Mouse_Over_Spot(house, scenario);
|
|
if (choice == -1) {
|
|
shape = MOUSE_NORMAL;
|
|
} else {
|
|
shape = MOUSE_CAN_ATTACK;
|
|
}
|
|
|
|
Set_Mouse(shape, start, count, delay, xspot, yspot);
|
|
if (timer == 0) {
|
|
frame++;
|
|
frame %= count;
|
|
timer = delay;
|
|
Set_Mouse_Cursor(xspot, yspot, Extract_Shape(MouseClass::MouseShapes, start + frame));
|
|
}
|
|
if (Keyboard->Check()) {
|
|
if ((Keyboard->Get() & 0x10FF) == KN_LMOUSE) {
|
|
if (choice != -1) {
|
|
done = 1;
|
|
selection = choice;
|
|
#ifdef WIN32
|
|
Play_Sample(country1, 255, Options.Normalize_Volume(170));
|
|
#else
|
|
Play_Sample(country1, 255, Options.Normalize_Volume(50));
|
|
#endif
|
|
} else {
|
|
#ifdef WIN32
|
|
Play_Sample(scold1, 255, Options.Normalize_Volume(170));
|
|
#else
|
|
Play_Sample(scold1, 255, Options.Normalize_Volume(50));
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Hide_Mouse();
|
|
|
|
/*
|
|
** Restore the mouse to normal shape before leaving this routine.
|
|
*/
|
|
Set_Mouse(MOUSE_NORMAL, start, count, delay, xspot, yspot);
|
|
Set_Mouse_Cursor(xspot, yspot, Extract_Shape(MouseClass::MouseShapes, start));
|
|
|
|
Keyboard->Clear();
|
|
// BlackPalette.Set(FADE_PALETTE_SLOW, Call_Back);
|
|
// SeenPage.Clear();
|
|
|
|
Fancy_Text_Print(TXT_STAND_BY, 160 * RESFACTOR, 190 * RESFACTOR, GadgetClass::Get_Color_Scheme(), TBLACK, TPF_CENTER|TPF_6PT_GRAD|TPF_DROPSHADOW);
|
|
|
|
/*
|
|
** Create the new scenario filename from the selection. The filename is
|
|
** derived from the previous filename but it has the scenario number
|
|
** incremented and the chosen variation set.
|
|
*/
|
|
|
|
//V.G. added so Ant Missions would progress
|
|
if(Scen.ScenarioName[2] == 'A'){
|
|
int antnum = Scen.Scenario++;
|
|
if(antnum > 4) antnum = 1;
|
|
strcpy(scenarioname, antmission[antnum]);
|
|
}
|
|
else{
|
|
strcpy(scenarioname, Scen.ScenarioName);
|
|
char buf[10];
|
|
sprintf(buf, "%02d", Scen.Scenario+1);
|
|
memcpy(&scenarioname[3], buf, 2);
|
|
scenarioname[6] = 'A' + selection;
|
|
}
|
|
Theme.Fade_Out();
|
|
// Options.Set_Score_Volume(oldvolume);
|
|
|
|
// Scen.ScenVar = (ScenarioVarType)selection;
|
|
//Mono_Printf("Chose variant %d \n", selection);
|
|
return(scenarioname);
|
|
#endif
|
|
}
|
|
|
|
int Mouse_Over_Spot(int house, int scenario)
|
|
{
|
|
int retval = -1;
|
|
for (int selection = 0; selection < 3 && MapCoords[house][scenario][selection].x != -1; selection++) {
|
|
int mousex = Get_Mouse_X() / RESFACTOR;
|
|
int mousey = Get_Mouse_Y() / RESFACTOR;
|
|
if (mousex >= MapCoords[house][scenario][selection].x &&
|
|
mousey >= MapCoords[house][scenario][selection].y &&
|
|
mousex <= MapCoords[house][scenario][selection].x+11 &&
|
|
mousey <= MapCoords[house][scenario][selection].y+9) {
|
|
|
|
retval = selection;
|
|
break;
|
|
}
|
|
}
|
|
return(retval);
|
|
}
|
|
void Cycle_Call_Back_Delay(int time, PaletteClass &pal)
|
|
{
|
|
static CDTimerClass<SystemTimerClass> _ftimer;
|
|
static bool _up = false;
|
|
static int val = 255;
|
|
|
|
while(time--) {
|
|
/*
|
|
** Process the fading white color.
|
|
*/
|
|
if (!_ftimer) {
|
|
_ftimer = TIMER_SECOND/6;
|
|
|
|
#define STEP_RATE 20
|
|
if (_up) {
|
|
val += STEP_RATE;
|
|
if (val > 150) {
|
|
val = 150;
|
|
_up = false;
|
|
}
|
|
} else {
|
|
val -= STEP_RATE;
|
|
if (val < 0x20) {
|
|
val = 0x20;
|
|
_up = true;
|
|
}
|
|
}
|
|
|
|
/*
|
|
** Set the pulse color as the proportional value between white and the
|
|
** minimum value for pulsing.
|
|
*/
|
|
pal[254] = GamePalette[WHITE];
|
|
pal[254].Adjust(val, BlackColor);
|
|
|
|
pal.Set();
|
|
}
|
|
Call_Back_Delay(1);
|
|
}
|
|
}
|
|
|
|
void Set_Mouse(MouseType shape, int &start, int &count, int &delay, int &xspot, int &yspot)
|
|
{
|
|
switch(shape) {
|
|
case MOUSE_NORMAL:
|
|
start = 0;
|
|
count = 1;
|
|
delay = 0;
|
|
xspot = 0;
|
|
yspot = 0;
|
|
break;
|
|
default:
|
|
start = 21;
|
|
count = 8;
|
|
delay = 4;
|
|
xspot = 14;
|
|
yspot = 11;
|
|
break;
|
|
}
|
|
}
|