static bool intRefreshOrderButtons(void) { SECONDARY_STATE State; UWORD OrdIndex; UDWORD id; for (unsigned j = 0; j < AvailableOrders.size() && j < MAX_DISPLAYABLE_ORDERS; ++j) { OrdIndex = AvailableOrders[j].OrderIndex; // Get current order state. State = GetSecondaryStates(OrderButtons[OrdIndex].Order); // Set actual number of buttons. OrderButtons[OrdIndex].AcNumButs = OrderButtons[OrdIndex].NumButs; id = OrderButtons[OrdIndex].ButBaseID; for (unsigned i = 0; i < OrderButtons[OrdIndex].AcNumButs; ++i) { // Set the state for the button. switch(OrderButtons[OrdIndex].ButType) { case ORD_BTYPE_RADIO: case ORD_BTYPE_BOOLEAN: if((State & OrderButtons[OrdIndex].StateMask) == (UDWORD)OrderButtons[OrdIndex].States[i]) { widgSetButtonState(psWScreen, id, WBUT_CLICKLOCK); } else { widgSetButtonState(psWScreen, id, 0); } break; case ORD_BTYPE_BOOLEAN_DEPEND: if((State & OrderButtons[OrdIndex].StateMask) == (UDWORD)OrderButtons[OrdIndex].States[i]) { widgSetButtonState(psWScreen, id, WBUT_CLICKLOCK); } else { if(i == 0) { widgSetButtonState(psWScreen, id, 0); } else { widgSetButtonState(psWScreen, id, WBUT_DISABLE); } } break; case ORD_BTYPE_BOOLEAN_COMBINE: if( State & (UDWORD)OrderButtons[OrdIndex].States[i] ) { widgSetButtonState(psWScreen, id, WBUT_CLICKLOCK); } break; } id ++; } } return true; }
// //////////////////////////////////////////////////////////////////////////// void addTextButton(UDWORD id, UDWORD PosX, UDWORD PosY, const char *txt, unsigned int style) { W_BUTINIT sButInit; sButInit.formID = FRONTEND_BOTFORM; sButInit.id = id; sButInit.x = (short)PosX; sButInit.y = (short)PosY; // Align if ( !(style & WBUT_TXTCENTRE) ) { sButInit.width = (short)(iV_GetTextWidth(txt)+10); sButInit.x+=35; } else { sButInit.style |= WBUT_TXTCENTRE; sButInit.width = FRONTEND_BUTWIDTH; } // Enable right clicks if (style & WBUT_SECONDARY) { sButInit.style |= WBUT_SECONDARY; } sButInit.UserData = (style & WBUT_DISABLE); // store disable state sButInit.height = FRONTEND_BUTHEIGHT; sButInit.pDisplay = displayTextOption; sButInit.FontID = font_large; sButInit.pText = txt; widgAddButton(psWScreen, &sButInit); // Disable button if (style & WBUT_DISABLE) { widgSetButtonState(psWScreen, id, WBUT_DISABLE); } }
// Process the droid order screen. // void intProcessOrder(UDWORD id) { UWORD i; UWORD OrdIndex; UDWORD BaseID; UDWORD StateIndex; UDWORD CombineState; if (id == IDORDER_CLOSE) { intRemoveOrder(); if (intMode == INT_ORDER) { intMode = INT_NORMAL; } else { /* Unlock the stats button */ widgSetButtonState(psWScreen, objStatID, 0); intMode = INT_OBJECT; } return; } for (OrdIndex = 0; OrdIndex < NUM_ORDERS; OrdIndex++) { BaseID = OrderButtons[OrdIndex].ButBaseID; switch (OrderButtons[OrdIndex].ButType) { case ORD_BTYPE_RADIO: if ((id >= BaseID) && (id < BaseID + OrderButtons[OrdIndex].AcNumButs)) { StateIndex = id - BaseID; for (i = 0; i < OrderButtons[OrdIndex].AcNumButs; i++) { widgSetButtonState(psWScreen, BaseID + i, 0); } if (SetSecondaryState(OrderButtons[OrdIndex].Order, OrderButtons[OrdIndex].States[StateIndex] & OrderButtons[OrdIndex].StateMask)) { widgSetButtonState(psWScreen, id, WBUT_CLICKLOCK); } } break; case ORD_BTYPE_BOOLEAN: if ((id >= BaseID) && (id < BaseID + OrderButtons[OrdIndex].AcNumButs)) { StateIndex = id - BaseID; if (widgGetButtonState(psWScreen, id) & WBUT_CLICKLOCK) { widgSetButtonState(psWScreen, id, 0); SetSecondaryState(OrderButtons[OrdIndex].Order, 0); } else { widgSetButtonState(psWScreen, id, WBUT_CLICKLOCK); SetSecondaryState(OrderButtons[OrdIndex].Order, OrderButtons[OrdIndex].States[StateIndex] & OrderButtons[OrdIndex].StateMask); } } break; case ORD_BTYPE_BOOLEAN_DEPEND: // Toggle the state of this button. if (id == BaseID) { if (widgGetButtonState(psWScreen, id) & WBUT_CLICKLOCK) { widgSetButtonState(psWScreen, id, 0); // Disable the dependant button. widgSetButtonState(psWScreen, id + 1, WBUT_DISABLE); } else { widgSetButtonState(psWScreen, id, WBUT_CLICKLOCK); // Enable the dependant button. widgSetButtonState(psWScreen, id + 1, 0); } } if ((id > BaseID) && (id < BaseID + OrderButtons[OrdIndex].AcNumButs)) { // If the previous button is down ( armed ).. if (widgGetButtonState(psWScreen, id - 1) & WBUT_CLICKLOCK) { // Toggle the state of this button. if (widgGetButtonState(psWScreen, id) & WBUT_CLICKLOCK) { widgSetButtonState(psWScreen, id, 0); SetSecondaryState(OrderButtons[OrdIndex].Order, 0); } else { StateIndex = id - BaseID; widgSetButtonState(psWScreen, id, WBUT_CLICKLOCK); SetSecondaryState(OrderButtons[OrdIndex].Order, OrderButtons[OrdIndex].States[StateIndex] & OrderButtons[OrdIndex].StateMask); } } } break; case ORD_BTYPE_BOOLEAN_COMBINE: if ((id >= BaseID) && (id < BaseID + OrderButtons[OrdIndex].AcNumButs)) { // Toggle the state of this button. if (widgGetButtonState(psWScreen, id) & WBUT_CLICKLOCK) { widgSetButtonState(psWScreen, id, 0); } else { widgSetButtonState(psWScreen, id, WBUT_CLICKLOCK); } // read the state of all the buttons to get the final state CombineState = 0; for (StateIndex = 0; StateIndex < OrderButtons[OrdIndex].AcNumButs; StateIndex++) { if (widgGetButtonState(psWScreen, BaseID + StateIndex) & WBUT_CLICKLOCK) { CombineState |= OrderButtons[OrdIndex].States[StateIndex]; } } // set the final state SetSecondaryState(OrderButtons[OrdIndex].Order, CombineState & OrderButtons[OrdIndex].StateMask); } break; } } }
// Add the droid order screen. // Returns true if the form was displayed ok. // //changed to a BASE_OBJECT to accomodate the factories - AB 21/04/99 bool intAddOrder(BASE_OBJECT *psObj) { bool Animate = true; SECONDARY_STATE State; UWORD OrdIndex; UWORD Height, NumDisplayedOrders; UWORD NumButs; UWORD NumJustifyButs, NumCombineButs, NumCombineBefore; bool bLastCombine, bHidden; DROID *Droid; STRUCTURE *psStructure; if (bInTutorial) { // No RMB orders in tutorial!! return (false); } // Is the form already up? if (widgGetFromID(psWScreen, IDORDER_FORM) != NULL) { intRemoveOrderNoAnim(); Animate = false; } // Is the stats window up? if (widgGetFromID(psWScreen, IDSTAT_FORM) != NULL) { intRemoveStatsNoAnim(); Animate = false; } if (psObj) { if (psObj->type == OBJ_DROID) { Droid = (DROID *)psObj; psStructure = NULL; } else if (psObj->type == OBJ_STRUCTURE) { Droid = NULL; psStructure = (STRUCTURE *)psObj; psSelectedFactory = psStructure; ASSERT_OR_RETURN(false, StructIsFactory(psSelectedFactory), "Trying to select a %s as a factory!", objInfo((BASE_OBJECT *)psSelectedFactory)); } else { ASSERT(false, "Invalid object type"); Droid = NULL; psStructure = NULL; } } else { Droid = NULL; psStructure = NULL; } setWidgetsStatus(true); AvailableOrders.clear(); SelectedDroids.clear(); // Selected droid is a command droid? if ((Droid != NULL) && (Droid->droidType == DROID_COMMAND)) { // displaying for a command droid - ignore any other droids SelectedDroids.push_back(Droid); } else if (psStructure != NULL) { AvailableOrders = buildStructureOrderList(psStructure); if (AvailableOrders.empty()) { return false; } } // Otherwise build a list of selected droids. else if (!BuildSelectedDroidList()) { // If no droids selected then see if we were given a specific droid. if (Droid != NULL) { // and put it in the list. SelectedDroids.push_back(Droid); } } // Build a list of orders available for the list of selected droids. - if a factory has not been selected if (psStructure == NULL) { AvailableOrders = buildDroidOrderList(); if (AvailableOrders.empty()) { // If no orders then return; return false; } } WIDGET *parent = psWScreen->psForm; /* Create the basic form */ IntFormAnimated *orderForm = new IntFormAnimated(parent, Animate); // Do not animate the opening, if the window was already open. orderForm->id = IDORDER_FORM; orderForm->setGeometry(ORDER_X, ORDER_Y, ORDER_WIDTH, ORDER_HEIGHT); // Add the close button. W_BUTINIT sButInit; sButInit.formID = IDORDER_FORM; sButInit.id = IDORDER_CLOSE; sButInit.x = ORDER_WIDTH - CLOSE_WIDTH; sButInit.y = 0; sButInit.width = CLOSE_WIDTH; sButInit.height = CLOSE_HEIGHT; sButInit.pTip = _("Close"); sButInit.pDisplay = intDisplayImageHilight; sButInit.UserData = PACKDWORD_TRI(0, IMAGE_CLOSEHILIGHT , IMAGE_CLOSE); if (!widgAddButton(psWScreen, &sButInit)) { return false; } sButInit = W_BUTINIT(); sButInit.formID = IDORDER_FORM; sButInit.id = IDORDER_CLOSE + 1; sButInit.pDisplay = intDisplayButtonHilight; sButInit.y = ORDER_BUTY; Height = 0; NumDisplayedOrders = 0; for (unsigned j = 0; j < AvailableOrders.size() && NumDisplayedOrders < MAX_DISPLAYABLE_ORDERS; ++j) { OrdIndex = AvailableOrders[j].OrderIndex; // Get current order state. State = GetSecondaryStates(OrderButtons[OrdIndex].Order); // Get number of buttons. NumButs = OrderButtons[OrdIndex].NumButs; // Set actual number of buttons. OrderButtons[OrdIndex].AcNumButs = NumButs; // Handle special case for factory -> command droid assignment buttons. switch (OrderButtons[OrdIndex].Class) { case ORDBUTCLASS_FACTORY: NumButs = countAssignableFactories((UBYTE)selectedPlayer, FACTORY_FLAG); break; case ORDBUTCLASS_CYBORGFACTORY: NumButs = countAssignableFactories((UBYTE)selectedPlayer, CYBORG_FLAG); break; case ORDBUTCLASS_VTOLFACTORY: NumButs = countAssignableFactories((UBYTE)selectedPlayer, VTOL_FLAG); break; default: break; } sButInit.id = OrderButtons[OrdIndex].ButBaseID; NumJustifyButs = NumButs; bLastCombine = false; switch (OrderButtons[OrdIndex].ButJustify & ORD_JUSTIFY_MASK) { case ORD_JUSTIFY_LEFT: sButInit.x = ORDER_BUTX; break; case ORD_JUSTIFY_RIGHT: sButInit.x = orderForm->width() - ORDER_BUTX - (NumJustifyButs * GetImageWidth(IntImages, OrderButtons[OrdIndex].ButImageID[0]) + (NumJustifyButs - 1) * ORDER_BUTGAP); break; case ORD_JUSTIFY_CENTER: sButInit.x = (orderForm->width() - (NumJustifyButs * GetImageWidth(IntImages, OrderButtons[OrdIndex].ButImageID[0]) + (NumJustifyButs - 1) * ORDER_BUTGAP)) / 2; break; case ORD_JUSTIFY_COMBINE: // see how many are on this line before the button NumCombineBefore = 0; for (unsigned i = 0; i < j; ++i) { if ((OrderButtons[AvailableOrders[i].OrderIndex].ButJustify & ORD_JUSTIFY_MASK) == ORD_JUSTIFY_COMBINE) { NumCombineBefore += 1; } } NumCombineButs = (UWORD)(NumCombineBefore + 1); // now see how many in total for (unsigned i = j + 1; i < AvailableOrders.size(); ++i) { if ((OrderButtons[AvailableOrders[i].OrderIndex].ButJustify & ORD_JUSTIFY_MASK) == ORD_JUSTIFY_COMBINE) { NumCombineButs += 1; } } // get position on line NumCombineButs = (UWORD)(NumCombineButs - (NumCombineBefore - (NumCombineBefore % ORD_MAX_COMBINE_BUTS))); if (NumCombineButs >= ORD_MAX_COMBINE_BUTS) { // the buttons will fill the line sButInit.x = (SWORD)(ORDER_BUTX + (GetImageWidth(IntImages, OrderButtons[OrdIndex].ButImageID[0]) + ORDER_BUTGAP) * NumCombineBefore); } else { // center the buttons sButInit.x = orderForm->width() / 2 - (NumCombineButs * GetImageWidth(IntImages, OrderButtons[OrdIndex].ButImageID[0]) + (NumCombineButs - 1) * ORDER_BUTGAP) / 2; sButInit.x = (SWORD)(sButInit.x + (GetImageWidth(IntImages, OrderButtons[OrdIndex].ButImageID[0]) + ORDER_BUTGAP) * NumCombineBefore); } // see if need to start a new line of buttons if ((NumCombineBefore + 1) == (NumCombineButs % ORD_MAX_COMBINE_BUTS)) { bLastCombine = true; } break; } for (unsigned i = 0; i < OrderButtons[OrdIndex].AcNumButs; ++i) { sButInit.pTip = getDORDDescription(OrderButtons[OrdIndex].ButTips[i]); sButInit.width = (UWORD)GetImageWidth(IntImages, OrderButtons[OrdIndex].ButImageID[i]); sButInit.height = (UWORD)GetImageHeight(IntImages, OrderButtons[OrdIndex].ButImageID[i]); sButInit.UserData = PACKDWORD_TRI(OrderButtons[OrdIndex].ButGreyID[i], OrderButtons[OrdIndex].ButHilightID[i], OrderButtons[OrdIndex].ButImageID[i]); if (!widgAddButton(psWScreen, &sButInit)) { return false; } // Set the default state for the button. switch (OrderButtons[OrdIndex].ButType) { case ORD_BTYPE_RADIO: case ORD_BTYPE_BOOLEAN: if ((State & OrderButtons[OrdIndex].StateMask) == (UDWORD)OrderButtons[OrdIndex].States[i]) { widgSetButtonState(psWScreen, sButInit.id, WBUT_CLICKLOCK); } else { widgSetButtonState(psWScreen, sButInit.id, 0); } break; case ORD_BTYPE_BOOLEAN_DEPEND: if ((State & OrderButtons[OrdIndex].StateMask) == (UDWORD)OrderButtons[OrdIndex].States[i]) { widgSetButtonState(psWScreen, sButInit.id, WBUT_CLICKLOCK); } else { if (i == 0) { widgSetButtonState(psWScreen, sButInit.id, 0); } else { widgSetButtonState(psWScreen, sButInit.id, WBUT_DISABLE); } } break; case ORD_BTYPE_BOOLEAN_COMBINE: if (State & (UDWORD)OrderButtons[OrdIndex].States[i]) { widgSetButtonState(psWScreen, sButInit.id, WBUT_CLICKLOCK); } break; } // may not add a button if the factory doesn't exist bHidden = false; switch (OrderButtons[OrdIndex].Class) { case ORDBUTCLASS_FACTORY: if (!checkFactoryExists(selectedPlayer, FACTORY_FLAG, i)) { widgHide(psWScreen, sButInit.id); bHidden = true; } break; case ORDBUTCLASS_CYBORGFACTORY: if (!checkFactoryExists(selectedPlayer, CYBORG_FLAG, i)) { widgHide(psWScreen, sButInit.id); bHidden = true; } break; case ORDBUTCLASS_VTOLFACTORY: if (!checkFactoryExists(selectedPlayer, VTOL_FLAG, i)) { widgHide(psWScreen, sButInit.id); bHidden = true; } break; default: break; } if (!bHidden) { sButInit.x = (SWORD)(sButInit.x + sButInit.width + ORDER_BUTGAP); } sButInit.id++; } if (((OrderButtons[OrdIndex].ButJustify & ORD_JUSTIFY_MASK) != ORD_JUSTIFY_COMBINE) || bLastCombine) { sButInit.y = (SWORD)(sButInit.y + sButInit.height + ORDER_BUTGAP); Height = (UWORD)(Height + sButInit.height + ORDER_BUTGAP); } NumDisplayedOrders ++; } // Now we know how many orders there are we can resize the form accordingly. int newHeight = Height + CLOSE_HEIGHT + ORDER_BUTGAP; orderForm->setGeometry(orderForm->x(), ORDER_BOTTOMY - newHeight, orderForm->width(), newHeight); OrderUp = true; return true; }
bool runGameOptionsMenu(void) { UDWORD id; id = widgRunScreen(psWScreen); // Run the current set of widgets switch(id) { case FRONTEND_LANGUAGE_R: setNextLanguage(); widgSetString(psWScreen, FRONTEND_LANGUAGE_R, getLanguageName()); /* Hack to reset current menu text, which looks fancy. */ widgSetString(psWScreen, FRONTEND_LANGUAGE, _("Language")); widgSetString(psWScreen, FRONTEND_COLOUR, _("Unit Colour")); widgSetString(psWScreen, FRONTEND_DIFFICULTY, _("Difficulty")); widgSetString(psWScreen, FRONTEND_SCROLLSPEED,_("Scroll Speed")); widgSetString(psWScreen, FRONTEND_SIDETEXT, _("GAME OPTIONS")); // FIXME: Changing the below return button tooltip does not work. //widgSetString(psWScreen, FRONTEND_BOTFORM, P_("menu", "Return")); switch( getDifficultyLevel() ) { case DL_EASY: widgSetString(psWScreen,FRONTEND_DIFFICULTY_R, _("Easy")); break; case DL_NORMAL: widgSetString(psWScreen,FRONTEND_DIFFICULTY_R, _("Normal")); break; case DL_HARD: widgSetString(psWScreen,FRONTEND_DIFFICULTY_R, _("Hard") ); break; case DL_TOUGH: case DL_KILLER: debug(LOG_ERROR, "runGameOptionsMenu: Unused difficulty level selected!"); break; } break; case FRONTEND_RADAR_R: rotateRadar = !rotateRadar; widgSetString(psWScreen, FRONTEND_RADAR_R, rotateRadar ? _("Rotating") : _("Fixed")); break; case FRONTEND_SCROLLSPEED: break; case FRONTEND_DIFFICULTY: case FRONTEND_DIFFICULTY_R: switch( getDifficultyLevel() ) { case DL_EASY: setDifficultyLevel(DL_NORMAL); widgSetString(psWScreen,FRONTEND_DIFFICULTY_R, _("Normal")); break; case DL_NORMAL: setDifficultyLevel(DL_HARD); widgSetString(psWScreen,FRONTEND_DIFFICULTY_R, _("Hard") ); break; case DL_HARD: setDifficultyLevel(DL_EASY); widgSetString(psWScreen,FRONTEND_DIFFICULTY_R, _("Easy")); break; default: // DL_TOUGH and DL_KILLER break; } break; case FRONTEND_SCROLLSPEED_SL: scroll_speed_accel = widgGetSliderPos(psWScreen,FRONTEND_SCROLLSPEED_SL) * 100; //0-1600 if(scroll_speed_accel ==0) // make sure you CAN scroll. { scroll_speed_accel = 100; } break; case FRONTEND_QUIT: changeTitleMode(OPTIONS); break; case FE_P0: widgSetButtonState(psWScreen, FE_P0, WBUT_LOCK); widgSetButtonState(psWScreen, FE_P4, 0); widgSetButtonState(psWScreen, FE_P5, 0); widgSetButtonState(psWScreen, FE_P6, 0); widgSetButtonState(psWScreen, FE_P7, 0); war_SetSPcolor(0); break; case FE_P4: widgSetButtonState(psWScreen, FE_P0, 0); widgSetButtonState(psWScreen, FE_P4, WBUT_LOCK); widgSetButtonState(psWScreen, FE_P5, 0); widgSetButtonState(psWScreen, FE_P6, 0); widgSetButtonState(psWScreen, FE_P7, 0); war_SetSPcolor(4); break; case FE_P5: widgSetButtonState(psWScreen, FE_P0, 0); widgSetButtonState(psWScreen, FE_P4, 0); widgSetButtonState(psWScreen, FE_P5, WBUT_LOCK); widgSetButtonState(psWScreen, FE_P6, 0); widgSetButtonState(psWScreen, FE_P7, 0); war_SetSPcolor(5); break; case FE_P6: widgSetButtonState(psWScreen, FE_P0, 0); widgSetButtonState(psWScreen, FE_P4, 0); widgSetButtonState(psWScreen, FE_P5, 0); widgSetButtonState(psWScreen, FE_P6, WBUT_LOCK); widgSetButtonState(psWScreen, FE_P7, 0); war_SetSPcolor(6); break; case FE_P7: widgSetButtonState(psWScreen, FE_P0, 0); widgSetButtonState(psWScreen, FE_P4, 0); widgSetButtonState(psWScreen, FE_P5, 0); widgSetButtonState(psWScreen, FE_P6, 0); widgSetButtonState(psWScreen, FE_P7, WBUT_LOCK); war_SetSPcolor(7); break; default: break; } // If close button pressed then return from this menu. if(CancelPressed()) { changeTitleMode(OPTIONS); } widgDisplayScreen(psWScreen); // show the widgets currently running return true; }
// //////////////////////////////////////////////////////////////////////////// // Game Options Menu static bool startGameOptionsMenu(void) { UDWORD w, h; int playercolor; addBackdrop(); addTopForm(); addBottomForm(); // Difficulty addTextButton(FRONTEND_DIFFICULTY, FRONTEND_POS2X-25, FRONTEND_POS2Y, _("Difficulty"), 0); switch (getDifficultyLevel()) { case DL_EASY: addTextButton(FRONTEND_DIFFICULTY_R, FRONTEND_POS2M-25, FRONTEND_POS2Y, _("Easy"), 0); break; case DL_NORMAL: addTextButton(FRONTEND_DIFFICULTY_R, FRONTEND_POS2M-25,FRONTEND_POS2Y, _("Normal"), 0); break; case DL_HARD: default: addTextButton(FRONTEND_DIFFICULTY_R, FRONTEND_POS2M-25, FRONTEND_POS2Y, _("Hard"), 0); break; } // Scroll speed addTextButton(FRONTEND_SCROLLSPEED, FRONTEND_POS3X-25, FRONTEND_POS3Y, _("Scroll Speed"), 0); addFESlider(FRONTEND_SCROLLSPEED_SL, FRONTEND_BOTFORM, FRONTEND_POS3M, FRONTEND_POS3Y+5, 16, scroll_speed_accel / 100); // Colour stuff w = iV_GetImageWidth(FrontImages, IMAGE_PLAYERN); h = iV_GetImageHeight(FrontImages, IMAGE_PLAYERN); addMultiBut(psWScreen, FRONTEND_BOTFORM, FE_P0, FRONTEND_POS4M+(0*(w+6)), FRONTEND_POS4Y, w, h, NULL, IMAGE_PLAYERN, IMAGE_PLAYERX, true, 0); addMultiBut(psWScreen, FRONTEND_BOTFORM, FE_P4, FRONTEND_POS4M+(1*(w+6)), FRONTEND_POS4Y, w, h, NULL, IMAGE_PLAYERN, IMAGE_PLAYERX, true, 4); addMultiBut(psWScreen, FRONTEND_BOTFORM, FE_P5, FRONTEND_POS4M+(2*(w+6)), FRONTEND_POS4Y, w, h, NULL, IMAGE_PLAYERN, IMAGE_PLAYERX, true, 5); addMultiBut(psWScreen, FRONTEND_BOTFORM, FE_P6, FRONTEND_POS4M+(3*(w+6)), FRONTEND_POS4Y, w, h, NULL, IMAGE_PLAYERN, IMAGE_PLAYERX, true, 6); addMultiBut(psWScreen, FRONTEND_BOTFORM, FE_P7, FRONTEND_POS4M+(4*(w+6)), FRONTEND_POS4Y, w, h, NULL, IMAGE_PLAYERN, IMAGE_PLAYERX, true, 7); // language addTextButton(FRONTEND_LANGUAGE, FRONTEND_POS2X - 25, FRONTEND_POS5Y, _("Language"), 0); addTextButton(FRONTEND_LANGUAGE_R, FRONTEND_POS2M - 25, FRONTEND_POS5Y, getLanguageName(), 0); // FIXME: if playercolor = 1-3, then we Assert in widgSetButtonState() since we don't define FE_P1 - FE_P3 // I assume the reason is that in SP games, those are reserved for the AI? Valid values are 0, 4-7. // This is a workaround, until we find what is setting that to 1-3. See configuration.c:701 playercolor = war_GetSPcolor(); if (playercolor >= 1 && playercolor <= 3) { playercolor = 0; } widgSetButtonState(psWScreen, FE_P0 + playercolor, WBUT_LOCK); addTextButton(FRONTEND_COLOUR, FRONTEND_POS4X-25, FRONTEND_POS4Y, _("Unit Colour"), 0); // Radar addTextButton(FRONTEND_RADAR, FRONTEND_POS6X - 25, FRONTEND_POS6Y, _("Radar"), 0); addTextButton(FRONTEND_RADAR_R, FRONTEND_POS6M - 25, FRONTEND_POS6Y, rotateRadar ? _("Rotating") : _("Fixed"), 0); // Quit addMultiBut(psWScreen, FRONTEND_BOTFORM, FRONTEND_QUIT, 10, 10, 30, 29, P_("menu", "Return"), IMAGE_RETURN, IMAGE_RETURN_HI, IMAGE_RETURN_HI); // Add some text down the side of the form addSideText(FRONTEND_SIDETEXT, FRONTEND_SIDEX, FRONTEND_SIDEY, _("GAME OPTIONS")); return true; }
/* Add the Transporter Button form */ bool intAddTransButtonForm(void) { UDWORD numButtons, i; SDWORD BufferID; DROID *psDroid; /* Add the button form */ W_FORMINIT sFormInit; sFormInit.formID = IDTRANS_FORM; sFormInit.id = IDTRANS_TABFORM; sFormInit.style = WFORM_TABBED; sFormInit.width = TRANS_TABWIDTH; sFormInit.height = TRANS_TABHEIGHT; sFormInit.x = TRANS_TABX; sFormInit.y = TRANS_TABY; sFormInit.majorPos = WFORM_TABTOP; sFormInit.minorPos = WFORM_TABNONE; sFormInit.majorSize = OBJ_TABWIDTH; sFormInit.majorOffset = OBJ_TABOFFSET; sFormInit.tabVertOffset = (OBJ_TABHEIGHT / 2); sFormInit.tabMajorThickness = OBJ_TABHEIGHT; numButtons = 0; /*work out the number of buttons */ for (psDroid = transInterfaceDroidList(); psDroid; psDroid = psDroid->psNext) { //only interested in Transporter droids if ((psDroid->droidType == DROID_TRANSPORTER || psDroid->droidType == DROID_SUPERTRANSPORTER) && (psDroid->action != DACTION_TRANSPORTOUT && psDroid->action != DACTION_TRANSPORTIN)) { //set the first Transporter to be the current one if not already set if (psCurrTransporter == NULL) { psCurrTransporter = psDroid; } numButtons++; } } //set the number of tabs required sFormInit.numMajor = numForms((OBJ_BUTWIDTH + OBJ_GAP) * numButtons, OBJ_WIDTH - OBJ_GAP); sFormInit.pUserData = &StandardTab; sFormInit.pTabDisplay = intDisplayTab; if (sFormInit.numMajor > MAX_TAB_STD_SHOWN) { // we do NOT use smallTab icons here, so be safe and only display max # of // standard sized tab icons. sFormInit.numMajor = MAX_TAB_STD_SHOWN; } //set minor tabs to 1 for (i = 0; i < sFormInit.numMajor; i++) { sFormInit.aNumMinors[i] = 1; } if (!widgAddForm(psWScreen, &sFormInit)) { return false; } /* Add the transporter and status buttons */ W_FORMINIT sBFormInit; sBFormInit.formID = IDTRANS_TABFORM; sBFormInit.id = IDTRANS_START; sBFormInit.majorID = 0; sBFormInit.minorID = 0; sBFormInit.style = WFORM_CLICKABLE; sBFormInit.x = OBJ_STARTX; sBFormInit.y = OBJ_STARTY; sBFormInit.width = OBJ_BUTWIDTH; sBFormInit.height = OBJ_BUTHEIGHT; W_FORMINIT sBFormInit2 = sBFormInit; sBFormInit2.id = IDTRANS_STATSTART; sBFormInit2.y = OBJ_STATSTARTY; ClearObjectBuffers(); ClearTopicBuffers(); //add each button for (psDroid = transInterfaceDroidList(); psDroid; psDroid = psDroid->psNext) { if ((psDroid->droidType == DROID_TRANSPORTER || psDroid->droidType == DROID_SUPERTRANSPORTER) && (psDroid->action != DACTION_TRANSPORTOUT && psDroid->action != DACTION_TRANSPORTIN)) { /* Set the tip and add the button */ sBFormInit.pTip = droidGetName(psDroid); BufferID = sBFormInit.id - IDTRANS_START; ASSERT(BufferID < NUM_TOPICBUFFERS, "BufferID > NUM_TOPICBUFFERS"); ClearTopicButtonBuffer(BufferID); RENDERBUTTON_INUSE(&TopicBuffers[BufferID]); TopicBuffers[BufferID].Data = (void *)psDroid; sBFormInit.pUserData = &TopicBuffers[BufferID]; sBFormInit.pDisplay = intDisplayObjectButton; if (!widgAddForm(psWScreen, &sBFormInit)) { return false; } /* if the current droid matches psCurrTransporter lock the button */ if (psDroid == psCurrTransporter) { widgSetButtonState(psWScreen, sBFormInit.id, WBUT_LOCK); widgSetTabs(psWScreen, IDTRANS_TABFORM, sBFormInit.majorID, 0); } //now do status button sBFormInit2.pTip = NULL; BufferID = (sBFormInit2.id - IDTRANS_STATSTART) * 2 + 1; ASSERT(BufferID < NUM_OBJECTBUFFERS, "BufferID > NUM_OBJECTBUFFERS"); ClearObjectButtonBuffer(BufferID); RENDERBUTTON_INUSE(&ObjectBuffers[BufferID]); sBFormInit2.pUserData = &ObjectBuffers[BufferID]; sBFormInit2.pDisplay = intDisplayStatusButton; if (!widgAddForm(psWScreen, &sBFormInit2)) { return false; } /* Update the init struct for the next buttons */ sBFormInit.id += 1; ASSERT(sBFormInit.id < IDTRANS_END, "Too many Transporter buttons"); sBFormInit.x += OBJ_BUTWIDTH + OBJ_GAP; if (sBFormInit.x + OBJ_BUTWIDTH + OBJ_GAP > OBJ_WIDTH) { sBFormInit.x = OBJ_STARTX; sBFormInit.majorID += 1; } sBFormInit2.id += 1; ASSERT(sBFormInit2.id < IDTRANS_STATEND, "Too many Transporter status buttons"); sBFormInit2.x += OBJ_BUTWIDTH + OBJ_GAP; if (sBFormInit2.x + OBJ_BUTWIDTH + OBJ_GAP > OBJ_WIDTH) { sBFormInit2.x = OBJ_STARTX; sBFormInit2.majorID += 1; } } } return true; }
/* deal with the actual button press - proxMsg is set to true if a proximity button has been pressed */ void intIntelButtonPressed(BOOL proxMsg, UDWORD id) { MESSAGE *psMessage; UDWORD currID;//, i; RESEARCH *psResearch; ASSERT( proxMsg != true, "intIntelButtonPressed: Shouldn't be able to get a proximity message!" ); if(id == 0) { intRemoveIntelMap(); return; } /* message button has been pressed - clear the old button and messageView*/ if (messageID != 0) { widgSetButtonState(psWScreen, messageID, 0); intRemoveMessageView(false); psCurrentMsg = NULL; } /* Lock the new button */ // This means we can't click on the same movie button twice. widgSetButtonState(psWScreen, id, WBUT_CLICKLOCK); messageID = id; //Find the message for the new button */ currID = IDINTMAP_MSGSTART; for(psMessage = apsMessages[selectedPlayer]; psMessage; psMessage = psMessage->psNext) { if (psMessage->type != MSG_PROXIMITY) { if (currID == id) { break; } currID++; } } //deal with the message if one if (psMessage) { //set the current message psCurrentMsg = psMessage; //set the read flag psCurrentMsg->read = true; debug(LOG_GUI, "intIntelButtonPressed: Dealing with a new message type=%d", psMessage->type); //should never have a proximity message if (psMessage->type == MSG_PROXIMITY) { return; } // If its a video sequence then play it anyway if (((VIEWDATA *)psMessage->pViewData)->type == VIEW_RPL) { if (psMessage->pViewData) { intAddMessageView(psMessage); } StartMessageSequences(psMessage,true); } else if (((VIEWDATA *)psMessage->pViewData)->type == VIEW_RES) { psResearch = getResearchForMsg((VIEWDATA *)psMessage->pViewData); if (psResearch != NULL) { static const float maxVolume = 1.f; static AUDIO_STREAM *playing = NULL; // only play the sample once, otherwise, they tend to overlap each other if (sound_isStreamPlaying(playing)) { sound_StopStream(playing); } switch(psResearch->iconID) { case IMAGE_RES_DROIDTECH: playing = audio_PlayStream("sequenceaudio/res_droid.ogg", maxVolume, NULL, NULL); break; case IMAGE_RES_WEAPONTECH: playing = audio_PlayStream("sequenceaudio/res_weapons.ogg", maxVolume, NULL, NULL); break; case IMAGE_RES_COMPUTERTECH: playing = audio_PlayStream("sequenceaudio/res_com.ogg", maxVolume, NULL, NULL); break; case IMAGE_RES_POWERTECH: playing = audio_PlayStream("sequenceaudio/res_pow.ogg", maxVolume, NULL, NULL); break; case IMAGE_RES_SYSTEMTECH: playing = audio_PlayStream("sequenceaudio/res_systech.ogg", maxVolume, NULL, NULL); break; case IMAGE_RES_STRUCTURETECH: playing = audio_PlayStream("sequenceaudio/res_strutech.ogg", maxVolume, NULL, NULL); break; case IMAGE_RES_CYBORGTECH: playing = audio_PlayStream("sequenceaudio/res_droid.ogg", maxVolume, NULL, NULL); break; case IMAGE_RES_DEFENCE: playing = audio_PlayStream("sequenceaudio/res_strutech.ogg", maxVolume, NULL, NULL); break; } } //and finally for the dumb? if (psMessage->pViewData) { intAddMessageView(psMessage); } } } }
/* Add the Message sub form */ static BOOL intAddMessageForm(BOOL playCurrent) { UDWORD numButtons, i; MESSAGE *psMessage; RESEARCH *psResearch; SDWORD BufferID; /* Add the Message form */ W_FORMINIT sFormInit; sFormInit.formID = IDINTMAP_FORM; sFormInit.id = IDINTMAP_MSGFORM; sFormInit.style = WFORM_TABBED; sFormInit.width = INTMAP_MSGWIDTH; sFormInit.height = INTMAP_MSGHEIGHT; sFormInit.x = INTMAP_MSGX; sFormInit.y = INTMAP_MSGY; sFormInit.majorPos = WFORM_TABTOP; sFormInit.minorPos = WFORM_TABNONE; sFormInit.majorSize = OBJ_TABWIDTH; sFormInit.majorOffset = OBJ_TABOFFSET; sFormInit.tabVertOffset = (OBJ_TABHEIGHT/2); sFormInit.tabMajorThickness = OBJ_TABHEIGHT; numButtons = 0; /*work out the number of buttons */ for(psMessage = apsMessages[selectedPlayer]; psMessage; psMessage = psMessage->psNext) { //ignore proximity messages here if (psMessage->type != MSG_PROXIMITY) { numButtons++; } // stop adding the buttons once max has been reached if (numButtons > (IDINTMAP_MSGEND - IDINTMAP_MSGSTART)) { break; } } //set the number of tabs required sFormInit.numMajor = numForms((OBJ_BUTWIDTH + OBJ_GAP) * numButtons, (OBJ_WIDTH - OBJ_GAP)*2); sFormInit.pUserData = &StandardTab; sFormInit.pTabDisplay = intDisplayTab; if (sFormInit.numMajor > MAX_TAB_STD_SHOWN) { // we do NOT use smallTab icons here, so be safe and only display max # of // standard sized tab icons. sFormInit.numMajor = MAX_TAB_STD_SHOWN; } //set minor tabs to 1 for (i=0; i< sFormInit.numMajor; i++) { sFormInit.aNumMinors[i] = 1; } if (!widgAddForm(psWScreen, &sFormInit)) { return false; } /* Add the message buttons */ W_FORMINIT sBFormInit; sBFormInit.formID = IDINTMAP_MSGFORM; sBFormInit.id = IDINTMAP_MSGSTART; sBFormInit.majorID = 0; sBFormInit.minorID = 0; sBFormInit.style = WFORM_CLICKABLE; sBFormInit.x = OBJ_STARTX; sBFormInit.y = OBJ_STATSTARTY; sBFormInit.width = OBJ_BUTWIDTH; sBFormInit.height = OBJ_BUTHEIGHT; ClearObjectBuffers(); //add each button messageID = 0; for(psMessage = apsMessages[selectedPlayer]; psMessage; psMessage = psMessage->psNext) { /*if (psMessage->type == MSG_TUTORIAL) { //tutorial cases should never happen ASSERT( false, "Tutorial message in Intelligence screen!" ); continue; }*/ if (psMessage->type == MSG_PROXIMITY) { //ignore proximity messages here continue; } /* Set the tip and add the button */ switch (psMessage->type) { case MSG_RESEARCH: psResearch = getResearchForMsg((VIEWDATA *)psMessage->pViewData); if (psResearch) { sBFormInit.pTip = getStatName(psResearch);; } else { sBFormInit.pTip = _("Research Update"); } break; case MSG_CAMPAIGN: sBFormInit.pTip = _("Project Goals"); break; case MSG_MISSION: sBFormInit.pTip = _("Current Objective"); break; default: break; } BufferID = GetObjectBuffer(); ASSERT( BufferID >= 0,"Unable to acquire object buffer." ); RENDERBUTTON_INUSE(&ObjectBuffers[BufferID]); ObjectBuffers[BufferID].Data = (void*)psMessage; sBFormInit.pUserData = &ObjectBuffers[BufferID]; sBFormInit.pDisplay = intDisplayMessageButton; if (!widgAddForm(psWScreen, &sBFormInit)) { return false; } /* if the current message matches psSelected lock the button */ if (psMessage == psCurrentMsg) { messageID = sBFormInit.id; widgSetButtonState(psWScreen, messageID, WBUT_LOCK); widgSetTabs(psWScreen, IDINTMAP_MSGFORM, sBFormInit.majorID, 0); } /* Update the init struct for the next button */ sBFormInit.id += 1; // stop adding the buttons when at max if (sBFormInit.id > IDINTMAP_MSGEND) { break; } ASSERT( sBFormInit.id < (IDINTMAP_MSGEND+1),"Too many message buttons" ); sBFormInit.x += OBJ_BUTWIDTH + OBJ_GAP; if (sBFormInit.x + OBJ_BUTWIDTH + OBJ_GAP > INTMAP_MSGWIDTH) { sBFormInit.x = OBJ_STARTX; sBFormInit.y += OBJ_BUTHEIGHT + OBJ_GAP; } if (sBFormInit.y + OBJ_BUTHEIGHT + OBJ_GAP > INTMAP_MSGHEIGHT) { sBFormInit.y = OBJ_STATSTARTY; sBFormInit.majorID += 1; } } //check to play current message instantly if (playCurrent) { //is it a proximity message? if (psCurrentMsg->type == MSG_PROXIMITY) { //intIntelButtonPressed(true, messageID); } else { intIntelButtonPressed(false, messageID); } } return true; }