| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399 |
- /*
- ** Command & Conquer Red Alert(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program 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.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /* $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)
- {
- 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);
- }
- 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;
- }
- }
|