// // 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$ */ /*********************************************************************************************** *** 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 : EXPAND.CPP * * * * Programmer : Joe L. Bostic * * * * Start Date : 11/03/95 * * * * Last Update : November 3, 1995 [JLB] * * * *---------------------------------------------------------------------------------------------* * Functions: * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #include "function.h" #ifdef NEWMENU bool Expansion_Present(void) { CCFileClass file("EXPAND.DAT"); return(file.Is_Available()); } class EListClass : public ListClass { public: EListClass(int id, int x, int y, int w, int h, TextPrintType flags, void const * up, void const * down) : ListClass(id, x, y, w, h, flags, up, down) {}; protected: virtual void Draw_Entry(int index, int x, int y, int width, int selected); }; void EListClass::Draw_Entry(int index, int x, int y, int width, int selected) { if (TextFlags & TPF_6PT_GRAD) { TextPrintType flags = TextFlags; if (selected) { flags = flags | TPF_BRIGHT_COLOR; LogicPage->Fill_Rect (x, y, x + width - 1, y + LineHeight - 1, CC_GREEN_SHADOW); } else { if (!(flags & TPF_USE_GRAD_PAL)) { flags = flags | TPF_MEDIUM_COLOR; } } Conquer_Clip_Text_Print(List[index]+sizeof(int), x, y, CC_GREEN, TBLACK, flags, width, Tabs); } else { Conquer_Clip_Text_Print(List[index]+sizeof(int), x, y, (selected ? BLUE : WHITE), TBLACK, TextFlags, width, Tabs); } } bool Expansion_Dialog(void) { int factor = (SeenBuff.Get_Width() == 320) ? 1 : 2; int option_width = 236 * factor; int option_height = 162 * factor; int option_x = (320*factor - option_width) /2; int option_y = (200*factor - option_height) /2; GadgetClass * buttons = NULL; void const *up_button; void const *down_button; if (InMainLoop){ up_button = Hires_Retrieve("BTN-UP.SHP"); down_button = Hires_Retrieve("BTN-DN.SHP"); }else{ up_button = Hires_Retrieve("BTN-UP2.SHP"); down_button = Hires_Retrieve("BTN-DN2.SHP"); } TextButtonClass ok(200, TXT_OK, TPF_6PT_GRAD|TPF_NOSHADOW, option_x+25*factor, option_y+option_height-15*factor); TextButtonClass cancel(201, TXT_CANCEL, TPF_6PT_GRAD|TPF_NOSHADOW, option_x+option_width-50*factor, option_y+option_height-15*factor); EListClass list(202, option_x+10*factor, option_y+20*factor, option_width-20*factor, option_height-40*factor, TPF_6PT_GRAD|TPF_NOSHADOW, up_button, down_button); buttons = &ok; cancel.Add(*buttons); list.Add(*buttons); /* ** Add in all the expansion scenarios. */ char * sbuffer = (char*)_ShapeBuffer; int index; for (index = 20; index < 60; index++) { char buffer[128]; CCFileClass file; Set_Scenario_Name(buffer, index, SCEN_PLAYER_GDI, SCEN_DIR_EAST, SCEN_VAR_A); strcat(buffer, ".INI"); file.Set_Name(buffer); if (file.Is_Available()) { file.Read(sbuffer, 1000); sbuffer[1000] = '\r'; sbuffer[1000+1] = '\n'; sbuffer[1000+2] = '\0'; WWGetPrivateProfileString("Basic", "Name", "x", buffer, sizeof(buffer), sbuffer); char * data = new char [strlen(buffer)+1+sizeof(int)+25]; *((int*)&data[0]) = index; strcpy(&data[sizeof(int)], "GDI: "); strcat(&data[sizeof(int)], buffer); list.Add_Item(data); } } for (index = 20; index < 60; index++) { char buffer[128]; CCFileClass file; Set_Scenario_Name(buffer, index, SCEN_PLAYER_NOD, SCEN_DIR_EAST, SCEN_VAR_A); strcat(buffer, ".INI"); file.Set_Name(buffer); if (file.Is_Available()) { file.Read(sbuffer, 1000); sbuffer[1000] = '\r'; sbuffer[1000+1] = '\n'; sbuffer[1000+2] = '\0'; WWGetPrivateProfileString("Basic", "Name", "x", buffer, sizeof(buffer), sbuffer); char * data = new char [strlen(buffer)+1+sizeof(int)+25]; *((int*)&data[0]) = index; strcpy(&data[sizeof(int)], "NOD: "); strcat(&data[sizeof(int)], buffer); list.Add_Item(data); } } Set_Logic_Page(SeenBuff); bool recalc = true; bool display = true; bool process = true; bool okval = true; while (process) { Call_Back(); /* ** If we have just received input focus again after running in the background then ** we need to redraw. */ if (AllSurfaces.SurfacesRestored){ AllSurfaces.SurfacesRestored=FALSE; display=TRUE; } if (display) { display = false; Hide_Mouse(); /* ** Load the background picture. */ Load_Title_Screen("HTITLE.PCX", &HidPage, Palette); Blit_Hid_Page_To_Seen_Buff(); Dialog_Box(option_x, option_y, option_width, option_height); Draw_Caption(TXT_MISSION_DESCRIPTION, option_x, option_y, option_width); buttons->Draw_All(); Show_Mouse(); } KeyNumType input = buttons->Input(); switch (input) { case KN_RETURN: case 200|KN_BUTTON: if (list.Current_Item()[sizeof(int)] == 'G') { ScenPlayer = SCEN_PLAYER_GDI; } else { ScenPlayer = SCEN_PLAYER_NOD; } ScenDir = SCEN_DIR_EAST; Whom = HOUSE_GOOD; Scenario = *(int *)list.Current_Item(); process = false; okval = true; break; case KN_ESC: case 201|KN_BUTTON: ScenPlayer = SCEN_PLAYER_GDI; ScenDir = SCEN_DIR_EAST; Whom = HOUSE_GOOD; Scenario = *(int *)list.Current_Item(); process = false; okval = false; break; default: break; } } /* ** Free up the allocations for the text lines in the list box. */ for (index = 0; index < list.Count(); index++) { delete [] (char *)list.Get_Item(index); } return(okval); } /*********************************************************************************************** * Bonus_Dialog -- Asks the user which bonus mission he wants to play * * * * * * * * INPUT: Nothing * * * * OUTPUT: Nothing * * * * WARNINGS: None * * * * HISTORY: * * 3/26/97 11:07AM ST : Created * *=============================================================================================*/ bool Bonus_Dialog(void) { int factor = (SeenBuff.Get_Width() == 320) ? 1 : 2; int option_width = 236 * factor; int option_height = 162 * factor; int option_x = (320*factor - option_width) /2; int option_y = (200*factor - option_height) /2; GadgetClass * buttons = NULL; void const *up_button; void const *down_button; if (InMainLoop){ up_button = Hires_Retrieve("BTN-UP.SHP"); down_button = Hires_Retrieve("BTN-DN.SHP"); }else{ up_button = Hires_Retrieve("BTN-UP2.SHP"); down_button = Hires_Retrieve("BTN-DN2.SHP"); } TextButtonClass ok(200, TXT_OK, TPF_6PT_GRAD|TPF_NOSHADOW, option_x+25*factor, option_y+option_height-15*factor); TextButtonClass cancel(201, TXT_CANCEL, TPF_6PT_GRAD|TPF_NOSHADOW, option_x+option_width-50*factor, option_y+option_height-15*factor); EListClass list(202, option_x+10*factor, option_y+20*factor, option_width-20*factor, option_height-40*factor, TPF_6PT_GRAD|TPF_NOSHADOW, up_button, down_button); buttons = &ok; cancel.Add(*buttons); list.Add(*buttons); /* ** Add in all the expansion scenarios. */ char * sbuffer = (char*)_ShapeBuffer; int gdi_scen_names[3]={ TXT_BONUS_MISSION_1, TXT_BONUS_MISSION_2, TXT_BONUS_MISSION_3 }; int nod_scen_names[2]={ TXT_BONUS_MISSION_4, TXT_BONUS_MISSION_5 }; int index; for (index = 60; index < 63; index++) { char buffer[128]; CCFileClass file; Set_Scenario_Name(buffer, index, SCEN_PLAYER_GDI, SCEN_DIR_EAST, SCEN_VAR_A); strcat(buffer, ".INI"); file.Set_Name(buffer); if (file.Is_Available()) { memcpy (buffer, Text_String (gdi_scen_names[index-60]), 1+strlen(Text_String (gdi_scen_names[index-60]))); char * data = new char [strlen(buffer)+1+sizeof(int)+25]; *((int*)&data[0]) = index; strcpy(&data[sizeof(int)], "GDI: "); strcat(&data[sizeof(int)], buffer); list.Add_Item(data); } } for (index = 60; index < 62; index++) { char buffer[128]; CCFileClass file; Set_Scenario_Name(buffer, index, SCEN_PLAYER_NOD, SCEN_DIR_EAST, SCEN_VAR_A); strcat(buffer, ".INI"); file.Set_Name(buffer); if (file.Is_Available()) { memcpy (buffer, Text_String (nod_scen_names[index-60]), 1+strlen(Text_String (nod_scen_names[index-60]))); char * data = new char [strlen(buffer)+1+sizeof(int)+25]; *((int*)&data[0]) = index; strcpy(&data[sizeof(int)], "NOD: "); strcat(&data[sizeof(int)], buffer); list.Add_Item(data); } } Set_Logic_Page(SeenBuff); bool recalc = true; bool display = true; bool process = true; bool okval = true; while (process) { Call_Back(); /* ** If we have just received input focus again after running in the background then ** we need to redraw. */ if (AllSurfaces.SurfacesRestored){ AllSurfaces.SurfacesRestored=FALSE; display=TRUE; } if (display) { display = false; Hide_Mouse(); /* ** Load the background picture. */ Load_Title_Screen("HTITLE.PCX", &HidPage, Palette); Blit_Hid_Page_To_Seen_Buff(); Dialog_Box(option_x, option_y, option_width, option_height); Draw_Caption(TXT_BONUS_MISSIONS, option_x, option_y, option_width); buttons->Draw_All(); Show_Mouse(); } KeyNumType input = buttons->Input(); switch (input) { case KN_RETURN: case 200|KN_BUTTON: if (list.Current_Item()[sizeof(int)] == 'G') { ScenPlayer = SCEN_PLAYER_GDI; } else { ScenPlayer = SCEN_PLAYER_NOD; } ScenDir = SCEN_DIR_EAST; Whom = HOUSE_GOOD; Scenario = *(int *)list.Current_Item(); process = false; okval = true; break; case KN_ESC: case 201|KN_BUTTON: ScenPlayer = SCEN_PLAYER_GDI; ScenDir = SCEN_DIR_EAST; Whom = HOUSE_GOOD; Scenario = *(int *)list.Current_Item(); process = false; okval = false; break; default: break; } } /* ** Free up the allocations for the text lines in the list box. */ for (index = 0; index < list.Count(); index++) { delete [] (char *)list.Get_Item(index); } return(okval); } #endif