void addFEAISlider(UDWORD id, UDWORD parent, UDWORD x, UDWORD y, UDWORD stops, UDWORD pos) { W_SLDINIT sSldInit; sSldInit.formID = parent; sSldInit.id = id; sSldInit.x = (short)x; sSldInit.y = (short)y; sSldInit.width = iV_GetImageWidth(IntImages,IMAGE_SLIDER_BIG); sSldInit.height = iV_GetImageHeight(IntImages,IMAGE_SLIDER_BIG); sSldInit.numStops = (UBYTE) stops; sSldInit.barSize = iV_GetImageHeight(IntImages,IMAGE_SLIDER_BIG); sSldInit.pos = (UBYTE) pos; sSldInit.pDisplay = displayAISlider; sSldInit.pCallback = intUpdateQuantitySlider; widgAddSlider(psWScreen, &sSldInit); }
// //////////////////////////////////////////////////////////////////////////// bool startKeyMapEditor(bool first) { addBackdrop(); addSideText(FRONTEND_SIDETEXT, KM_SX, KM_Y, _("KEY MAPPING")); if (first) { loadKeyMap(); // get the current mappings. } WIDGET *parent = widgGetFromID(psWScreen, FRONTEND_BACKDROP); IntFormAnimated *kmForm = new IntFormAnimated(parent, false); kmForm->id = KM_FORM; kmForm->setGeometry(KM_X, KM_Y, KM_W, KM_H); addMultiBut(psWScreen, KM_FORM, KM_RETURN, // return button. 8, 5, iV_GetImageWidth(FrontImages, IMAGE_RETURN), iV_GetImageHeight(FrontImages, IMAGE_RETURN), _("Return To Previous Screen"), IMAGE_RETURN, IMAGE_RETURN_HI, IMAGE_RETURN_HI); addMultiBut(psWScreen, KM_FORM, KM_DEFAULT, 11, 45, iV_GetImageWidth(FrontImages, IMAGE_KEYMAP_DEFAULT), iV_GetImageWidth(FrontImages, IMAGE_KEYMAP_DEFAULT), _("Select Default"), IMAGE_KEYMAP_DEFAULT, IMAGE_KEYMAP_DEFAULT_HI, IMAGE_KEYMAP_DEFAULT_HI); // default. // add tab form.. IntListTabWidget *kmList = new IntListTabWidget(kmForm); kmList->setChildSize(KM_ENTRYW, KM_ENTRYH); kmList->setChildSpacing(3, 3); kmList->setGeometry(52, 10, KM_ENTRYW, KM_H - 10 - 25); //Put the buttons on it std::vector<KEY_MAPPING *> mappings; for (KEY_MAPPING *m = keyMappings; m != nullptr; m = m->psNext) { if (m->status != KEYMAP__DEBUG && m->status != KEYMAP___HIDE) // if it's not a debug mapping.. { mappings.push_back(m); } } std::sort(mappings.begin(), mappings.end(), keyMappingSort); /* Add our first mapping to the form */ /* Now add the others... */ for (std::vector<KEY_MAPPING *>::const_iterator i = mappings.begin(); i != mappings.end(); ++i) { W_BUTTON *button = new W_BUTTON(kmList); button->id = KM_START + (i - mappings.begin()); button->pUserData = *i; button->displayFunction = displayKeyMap; kmList->addWidgetToLayout(button); } /* Stop when the right number or when aphabetically last - not sure...! */ /* Go home... */ return true; }
static UDWORD GetImageHeight(IMAGEFILE *ImageFile, UDWORD ImageID) { return iV_GetImageHeight(ImageFile, (UWORD)ImageID); }
// Render a window frame. // void RenderWindowFrame(FRAMETYPE frame, UDWORD x, UDWORD y, UDWORD Width, UDWORD Height, const glm::mat4 &modelViewProjectionMatrix) { SWORD WTopRight = 0; SWORD WTopLeft = 0; SWORD WBottomRight = 0; SWORD WBottomLeft = 0; SWORD HTopRight = 0; SWORD HTopLeft = 0; SWORD HBottomRight = 0; SWORD HBottomLeft = 0; UWORD RectI; const FRAMERECT *Rect; const IMAGEFRAME *Frame = (frame == FRAME_NORMAL) ? &FrameNormal : &FrameRadar; x += Frame->OffsetX0; y += Frame->OffsetY0; Width -= Frame->OffsetX1 + Frame->OffsetX0; Height -= Frame->OffsetY1 + Frame->OffsetY0; for (RectI = 0; RectI < 5; RectI++) { Rect = &Frame->FRect[RectI]; switch (Rect->Type) { case FR_FRAME: iV_TransBoxFill(x + Rect->TLXOffset, y + Rect->TLYOffset, x + Width - INCEND + Rect->BRXOffset, y + Height - INCEND + Rect->BRYOffset); break; case FR_LEFT: iV_TransBoxFill(x + Rect->TLXOffset, y + Rect->TLYOffset, x + Rect->BRXOffset, y + Height - INCEND + Rect->BRYOffset); break; case FR_RIGHT: iV_TransBoxFill(x + Width - INCEND + Rect->TLXOffset, y + Rect->TLYOffset, x + Width - INCEND + Rect->BRXOffset, y + Height - INCEND + Rect->BRYOffset); break; case FR_TOP: iV_TransBoxFill(x + Rect->TLXOffset, y + Rect->TLYOffset, x + Width - INCEND + Rect->BRXOffset, y + Rect->BRYOffset); break; case FR_BOTTOM: iV_TransBoxFill(x + Rect->TLXOffset, y + Height - INCEND + Rect->TLYOffset, x + Width - INCEND + Rect->BRXOffset, y + Height - INCEND + Rect->BRYOffset); break; case FR_IGNORE: break; // ignored } } if (Frame->TopLeft >= 0) { WTopLeft = (SWORD)iV_GetImageWidth(IntImages, Frame->TopLeft); HTopLeft = (SWORD)iV_GetImageHeight(IntImages, Frame->TopLeft); iV_DrawImage(IntImages, Frame->TopLeft, x, y); } if (Frame->TopRight >= 0) { WTopRight = (SWORD)iV_GetImageWidth(IntImages, Frame->TopRight); HTopRight = (SWORD)iV_GetImageHeight(IntImages, Frame->TopRight); iV_DrawImage(IntImages, Frame->TopRight, x + Width - WTopRight, y); } if (Frame->BottomRight >= 0) { WBottomRight = (SWORD)iV_GetImageWidth(IntImages, Frame->BottomRight); HBottomRight = (SWORD)iV_GetImageHeight(IntImages, Frame->BottomRight); iV_DrawImage(IntImages, Frame->BottomRight, x + Width - WBottomRight, y + Height - HBottomRight); } if (Frame->BottomLeft >= 0) { WBottomLeft = (SWORD)iV_GetImageWidth(IntImages, Frame->BottomLeft); HBottomLeft = (SWORD)iV_GetImageHeight(IntImages, Frame->BottomLeft); iV_DrawImage(IntImages, Frame->BottomLeft, x, y + Height - HBottomLeft); } if (Frame->TopEdge >= 0) { iV_DrawImageRepeatX(IntImages, Frame->TopEdge, x + iV_GetImageWidth(IntImages, Frame->TopLeft), y, Width - WTopLeft - WTopRight, modelViewProjectionMatrix); } if (Frame->BottomEdge >= 0) { iV_DrawImageRepeatX(IntImages, Frame->BottomEdge, x + WBottomLeft, y + Height - iV_GetImageHeight(IntImages, Frame->BottomEdge), Width - WBottomLeft - WBottomRight, modelViewProjectionMatrix); } if (Frame->LeftEdge >= 0) { iV_DrawImageRepeatY(IntImages, Frame->LeftEdge, x, y + HTopLeft, Height - HTopLeft - HBottomLeft, modelViewProjectionMatrix); } if (Frame->RightEdge >= 0) { iV_DrawImageRepeatY(IntImages, Frame->RightEdge, x + Width - iV_GetImageWidth(IntImages, Frame->RightEdge), y + HTopRight, Height - HTopRight - HBottomRight, modelViewProjectionMatrix); } }
// //////////////////////////////////////////////////////////////////////////// bool startKeyMapEditor(bool first) { KEY_MAPPING *psMapping; UDWORD i,mapcount =0; UDWORD bubbleCount; bool bAtEnd,bGotOne; KEY_MAPPING *psPresent = NULL, *psNext; char test[255]; addBackdrop(); addSideText(FRONTEND_SIDETEXT, KM_SX, KM_Y, _("KEY MAPPING")); if (first) { loadKeyMap(); // get the current mappings. } W_FORMINIT sFormInit; sFormInit.formID = FRONTEND_BACKDROP; sFormInit.id = KM_FORM; sFormInit.style = WFORM_PLAIN; sFormInit.x = KM_X; sFormInit.y = KM_Y; sFormInit.width = KM_W; sFormInit.height = KM_H; sFormInit.pDisplay = intDisplayPlainForm; widgAddForm(psWScreen, &sFormInit); addMultiBut(psWScreen,KM_FORM,KM_RETURN, // return button. 8,5, iV_GetImageWidth(FrontImages,IMAGE_RETURN), iV_GetImageHeight(FrontImages,IMAGE_RETURN), _("Return To Previous Screen"), IMAGE_RETURN, IMAGE_RETURN_HI, IMAGE_RETURN_HI); addMultiBut(psWScreen,KM_FORM,KM_DEFAULT, 11,45, 56,38, _("Select Default"), IMAGE_KEYMAP_DEFAULT, IMAGE_KEYMAP_DEFAULT_HI, IMAGE_KEYMAP_DEFAULT_HI); // default. /* Better be none that come after this...! */ sstrcpy(test, "zzzzzzzzzzzzzzzzzzzzz"); psMapping = NULL; //count mappings required. for(psMapping = keyMappings; psMapping; psMapping = psMapping->psNext) { if( (psMapping->status!=KEYMAP__DEBUG)&&(psMapping->status!=KEYMAP___HIDE)) // if it's not a debug mapping.. { mapcount++; if(strcmp(psMapping->pName,test) < 0) { /* Best one found so far */ sstrcpy(test, psMapping->pName); psPresent = psMapping; } } } // add tab form.. sFormInit = W_FORMINIT(); sFormInit.formID = KM_FORM; sFormInit.id = KM_FORM_TABS; sFormInit.style = WFORM_TABBED; sFormInit.x = 50; sFormInit.y = 10; sFormInit.width = KM_W- 100; sFormInit.height = KM_H- 4; sFormInit.numMajor = numForms(mapcount, BUTTONSPERKEYMAPPAGE); sFormInit.majorPos = WFORM_TABTOP; sFormInit.minorPos = WFORM_TABNONE; sFormInit.majorSize = OBJ_TABWIDTH+3; sFormInit.majorOffset = OBJ_TABOFFSET; sFormInit.tabVertOffset = (OBJ_TABHEIGHT/2); sFormInit.tabMajorThickness = OBJ_TABHEIGHT; sFormInit.pUserData = &StandardTab; sFormInit.pTabDisplay = intDisplayTab; // TABFIXME: Special case for tabs, since this one has whole screen to itself. No need to modify(?) for (i=0; i< sFormInit.numMajor; i++) { sFormInit.aNumMinors[i] = 1; } widgAddForm(psWScreen, &sFormInit); //Put the buttons on it W_BUTINIT sButInit; sButInit.formID = KM_FORM_TABS; sButInit.width = KM_ENTRYW; sButInit.height = KM_ENTRYH; sButInit.pDisplay = displayKeyMap; sButInit.x = 2; sButInit.y = 16; sButInit.id = KM_START; /* Add our first mapping to the form */ sButInit.pUserData= psPresent; widgAddButton(psWScreen, &sButInit); sButInit.id++; sButInit.y += KM_ENTRYH +3; /* Now add the others... */ bubbleCount = 0; bAtEnd = false; /* Stop when the right number or when aphabetically last - not sure...! */ while(bubbleCount<mapcount-1 && !bAtEnd) { /* Same test as before for upper limit */ sstrcpy(test, "zzzzzzzzzzzzzzzzzzzzz"); for(psMapping = keyMappings,psNext = NULL,bGotOne = false; psMapping; psMapping = psMapping->psNext) { /* Only certain mappings get displayed */ if( (psMapping->status!=KEYMAP__DEBUG)&&(psMapping->status!=KEYMAP___HIDE)) // if it's not a debug mapping.. { /* If it's alphabetically good but better then next one */ if(strcmp(psMapping->pName,test) < 0 && strcmp(psMapping->pName,psPresent->pName) > 0) { /* Keep a record of it */ sstrcpy(test, psMapping->pName); psNext = psMapping; bGotOne = true; } } } /* We found one matching criteria */ if(bGotOne) { psPresent = psNext; bubbleCount++; sButInit.pUserData= psNext; widgAddButton(psWScreen, &sButInit); // move on.. sButInit.id++; /* Might be no more room on the page */ if ( (sButInit.y + KM_ENTRYH+5 ) > (3+ (BUTTONSPERKEYMAPPAGE*(KM_ENTRYH+3)))) { sButInit.y = 16; sButInit.majorID += 1; } else { sButInit.y += KM_ENTRYH +3; } } else { /* The previous one we found was alphabetically last - time to stop */ bAtEnd = true; } } /* Go home... */ 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; }
// Render a window frame. // static void RenderWindow(FRAMETYPE frame, UDWORD x, UDWORD y, UDWORD Width, UDWORD Height, bool Opaque) { SWORD WTopRight = 0; SWORD WTopLeft = 0; SWORD WBottomRight = 0; SWORD WBottomLeft = 0; SWORD HTopRight = 0; SWORD HTopLeft = 0; SWORD HBottomRight = 0; SWORD HBottomLeft = 0; UWORD RectI; FRAMERECT *Rect; bool Masked = false; IMAGEFRAME *Frame; if (frame == 0) { Frame = &FrameNormal; } else { Frame = &FrameRadar; } x += Frame->OffsetX0; y += Frame->OffsetY0; Width -= Frame->OffsetX1+Frame->OffsetX0; Height -= Frame->OffsetY1+Frame->OffsetY0; for(RectI=0; RectI<5; RectI++) { Rect = &Frame->FRect[RectI]; switch(Rect->Type) { case FR_FRAME: if(Opaque==false) { if(Masked == false) { Width &= 0xfffc; // Software transboxfill needs to be a multiple of 4 pixels. Masked = true; } iV_TransBoxFill( x+Rect->TLXOffset, y+Rect->TLYOffset, x+Width-INCEND+Rect->BRXOffset, y+Height-INCEND+Rect->BRYOffset); } else { pie_BoxFill(x + Rect->TLXOffset, y + Rect->TLYOffset, x + Width - INCEND + Rect->BRXOffset, y + Height - INCEND + Rect->BRYOffset, psPalette[Rect->ColourIndex]); } break; case FR_LEFT: if(Opaque==false) { if(Masked == false) { Width &= 0xfffc; // Software transboxfill needs to be a multiple of 4 pixels. Masked = true; } iV_TransBoxFill( x+Rect->TLXOffset, y+Rect->TLYOffset, x+Rect->BRXOffset, y+Height-INCEND+Rect->BRYOffset); } else { pie_BoxFill(x + Rect->TLXOffset, y + Rect->TLYOffset, x + Rect->BRXOffset, y + Height - INCEND + Rect->BRYOffset, psPalette[Rect->ColourIndex]); } break; case FR_RIGHT: if(Opaque==false) { if(Masked == false) { Width &= 0xfffc; // Software transboxfill needs to be a multiple of 4 pixels. Masked = true; } iV_TransBoxFill( x+Width-INCEND+Rect->TLXOffset, y+Rect->TLYOffset, x+Width-INCEND+Rect->BRXOffset, y+Height-INCEND+Rect->BRYOffset); } else { pie_BoxFill(x + Width - INCEND + Rect->TLXOffset, y + Rect->TLYOffset, x + Width - INCEND + Rect->BRXOffset, y + Height - INCEND + Rect->BRYOffset, psPalette[Rect->ColourIndex]); } break; case FR_TOP: if(Opaque==false) { if(Masked == false) { Width &= 0xfffc; // Software transboxfill needs to be a multiple of 4 pixels. Masked = true; } iV_TransBoxFill( x+Rect->TLXOffset, y+Rect->TLYOffset, x+Width-INCEND+Rect->BRXOffset, y+Rect->BRYOffset); } else { pie_BoxFill(x + Rect->TLXOffset, y + Rect->TLYOffset, x + Width - INCEND + Rect->BRXOffset, y + Rect->BRYOffset, psPalette[Rect->ColourIndex]); } break; case FR_BOTTOM: if(Opaque==false) { if(Masked == false) { Width &= 0xfffc; // Software transboxfill needs to be a multiple of 4 pixels. Masked = true; } iV_TransBoxFill( x+Rect->TLXOffset, y+Height-INCEND+Rect->TLYOffset, x+Width-INCEND+Rect->BRXOffset, y+Height-INCEND+Rect->BRYOffset); } else { pie_BoxFill(x + Rect->TLXOffset, y + Height - INCEND + Rect->TLYOffset, x + Width - INCEND + Rect->BRXOffset, y + Height - INCEND + Rect->BRYOffset, psPalette[Rect->ColourIndex]); } break; case FR_IGNORE: break; // ignored } } if(Frame->TopLeft >= 0) { WTopLeft = (SWORD)iV_GetImageWidth(IntImages,Frame->TopLeft); HTopLeft = (SWORD)iV_GetImageHeight(IntImages,Frame->TopLeft); iV_DrawImage(IntImages,Frame->TopLeft,x,y); } if(Frame->TopRight >= 0) { WTopRight = (SWORD)iV_GetImageWidth(IntImages,Frame->TopRight); HTopRight = (SWORD)iV_GetImageHeight(IntImages,Frame->TopRight); iV_DrawImage(IntImages,Frame->TopRight,x+Width-WTopRight, y); } if(Frame->BottomRight >= 0) { WBottomRight = (SWORD)iV_GetImageWidth(IntImages,Frame->BottomRight); HBottomRight = (SWORD)iV_GetImageHeight(IntImages,Frame->BottomRight); iV_DrawImage(IntImages,Frame->BottomRight,x+Width-WBottomRight,y+Height-HBottomRight); } if(Frame->BottomLeft >= 0) { WBottomLeft = (SWORD)iV_GetImageWidth(IntImages,Frame->BottomLeft); HBottomLeft = (SWORD)iV_GetImageHeight(IntImages,Frame->BottomLeft); iV_DrawImage(IntImages,Frame->BottomLeft,x,y+Height-HBottomLeft); } if(Frame->TopEdge >= 0) { iV_DrawImageRect( IntImages, Frame->TopEdge, x + iV_GetImageWidth(IntImages, Frame->TopLeft), y, Width - WTopLeft - WTopRight, iV_GetImageHeight(IntImages, Frame->TopEdge) ); } if(Frame->BottomEdge >= 0) { iV_DrawImageRect( IntImages, Frame->BottomEdge, x + WBottomLeft, y + Height - iV_GetImageHeight(IntImages, Frame->BottomEdge), Width - WBottomLeft - WBottomRight, iV_GetImageHeight(IntImages, Frame->BottomEdge) ); } if(Frame->LeftEdge >= 0) { iV_DrawImageRect( IntImages, Frame->LeftEdge, x, y + HTopLeft, iV_GetImageWidth(IntImages, Frame->LeftEdge), Height - HTopLeft - HBottomLeft ); } if(Frame->RightEdge >= 0) { iV_DrawImageRect( IntImages, Frame->RightEdge, x + Width - iV_GetImageWidth(IntImages, Frame->RightEdge), y + HTopRight, iV_GetImageWidth(IntImages, Frame->RightEdge), Height - HTopRight - HBottomRight ); } }
// //////////////////////////////////////////////////////////////////////////// bool startLimitScreen(void) { addBackdrop();//background // load stats... if(!bLimiterLoaded) { initLoadingScreen(true); if (!resLoad("wrf/limiter_tex.wrf", 501)) { return false; } if (!resLoad("wrf/piestats.wrf", 502)) { return false; } if (!resLoad("wrf/limiter_data.wrf", 503)) { return false; } bLimiterLoaded = true; closeLoadingScreen(); } if (challengeActive) { // reset the sliders.. // it's a HACK since the actual limiter structure was cleared in the startMultiOptions function for (unsigned i = 0; i < numStructureStats; ++i) { asStructLimits[0][i].limit = asStructLimits[0][i].globalLimit; } // turn off the sliders sliderEnableDrag(false); } else { //enable the sliders sliderEnableDrag(true); } addSideText(FRONTEND_SIDETEXT1,LIMITSX-2,LIMITSY,"LIMITS"); // draw sidetext... WIDGET *parent = widgGetFromID(psWScreen, FRONTEND_BACKDROP); IntFormAnimated *limitsForm = new IntFormAnimated(parent, false); limitsForm->id = IDLIMITS; limitsForm->setGeometry(LIMITSX, LIMITSY, LIMITSW, LIMITSH); // return button. addMultiBut(psWScreen,IDLIMITS,IDLIMITS_RETURN, LIMITS_OKX-40,LIMITS_OKY, iV_GetImageWidth(FrontImages, IMAGE_NO), iV_GetImageHeight(FrontImages, IMAGE_NO), _("Apply Defaults and Return To Previous Screen"),IMAGE_NO,IMAGE_NO,true); // ok button addMultiBut(psWScreen,IDLIMITS,IDLIMITS_OK, LIMITS_OKX,LIMITS_OKY, iV_GetImageWidth(FrontImages,IMAGE_OK), iV_GetImageHeight(FrontImages,IMAGE_OK), _("Accept Settings"),IMAGE_OK,IMAGE_OK,true); // add tab form.. IntListTabWidget *limitsList = new IntListTabWidget(limitsForm); limitsList->setChildSize(BARWIDTH, BARHEIGHT); limitsList->setChildSpacing(5, 5); limitsList->setGeometry(50, 10, BARWIDTH, 370); //Put the buttons on it int limitsButtonId = IDLIMITS_ENTRIES_START; for (unsigned i = 0; i < numStructureStats; ++i) { if (asStructLimits[0][i].globalLimit != LOTS_OF) { W_FORM *button = new W_FORM(limitsList); button->id = limitsButtonId; button->displayFunction = displayStructureBar; button->UserData = i; limitsList->addWidgetToLayout(button); ++limitsButtonId; addFESlider(limitsButtonId, limitsButtonId - 1, 290, 11, asStructLimits[0][i].globalLimit, asStructLimits[0][i].limit); ++limitsButtonId; } } return true; }
// Add the main Transporter Contents Interface bool intAddTransporterContents(void) { bool Animate = true; // Is the form already up? if (widgGetFromID(psWScreen, IDTRANS_CONTENTFORM) != NULL) { intRemoveTransContentNoAnim(); Animate = false; } if (intIsRefreshing()) { Animate = false; } WIDGET *parent = psWScreen->psForm; IntFormAnimated *transContentForm = new IntFormAnimated(parent, Animate); // Do not animate the opening, if the window was already open. transContentForm->id = IDTRANS_CONTENTFORM; transContentForm->setGeometry(TRANSCONT_X, TRANSCONT_Y, TRANSCONT_WIDTH, TRANSCONT_HEIGHT); /* Add the close button */ W_BUTINIT sButInit; sButInit.formID = IDTRANS_CONTENTFORM; sButInit.id = IDTRANS_CONTCLOSE; sButInit.x = STAT_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; } if (bMultiPlayer) { //add the capacity label W_LABINIT sLabInit; sLabInit.formID = IDTRANS_CONTENTFORM; sLabInit.id = IDTRANS_CAPACITY; sLabInit.x = (SWORD)sButInit.x - 40; sLabInit.y = 0; sLabInit.width = 16; sLabInit.height = 16; sLabInit.pText = "00/10"; sLabInit.pCallback = intUpdateTransCapacity; if (!widgAddLabel(psWScreen, &sLabInit)) { return false; } } //add the Launch button if on a mission if (onMission) { W_FORMINIT sButFInit; sButFInit.formID = IDTRANS_CONTENTFORM; sButFInit.id = IDTRANS_LAUNCH; sButFInit.style = WFORM_CLICKABLE | WFORM_NOCLICKMOVE; sButFInit.x = OBJ_STARTX; sButFInit.y = (UWORD)(STAT_SLDY - 1); sButFInit.width = iV_GetImageWidth(IntImages, IMAGE_LAUNCHUP); sButFInit.height = iV_GetImageHeight(IntImages, IMAGE_LAUNCHUP); sButFInit.pTip = _("Launch Transport"); sButFInit.pDisplay = intDisplayImageHilight; sButFInit.UserData = PACKDWORD_TRI(0, IMAGE_LAUNCHDOWN, IMAGE_LAUNCHUP); if (!widgAddForm(psWScreen, &sButFInit)) { return false; } } if (!intAddTransContentsForm()) { return false; } return true; }
/*This is used to display the transporter button and capacity when at the home base ONLY*/ bool intAddTransporterLaunch(DROID *psDroid) { UDWORD capacity; DROID *psCurr, *psNext; if (bMultiPlayer) { return true; } //do this first so that if the interface is already up it syncs with this transporter //set up the static transporter psCurrTransporter = psDroid; //check the button is not already up if (widgGetFromID(psWScreen, IDTRANS_LAUNCH) != NULL) { return true; } W_FORMINIT sButInit; //needs to be a clickable form now sButInit.formID = 0; sButInit.id = IDTRANS_LAUNCH; sButInit.style = WFORM_CLICKABLE | WFORM_NOCLICKMOVE; sButInit.x = RET_X; sButInit.y = (SWORD)TIMER_Y; sButInit.width = (UWORD)(10 + iV_GetImageWidth(IntImages, IMAGE_LAUNCHUP)); sButInit.height = iV_GetImageHeight(IntImages, IMAGE_LAUNCHUP); sButInit.pTip = _("Launch Transport"); sButInit.pDisplay = intDisplayImageHilight; sButInit.UserData = PACKDWORD_TRI(0, IMAGE_LAUNCHDOWN, IMAGE_LAUNCHUP); if (!widgAddForm(psWScreen, &sButInit)) { return false; } //add the capacity label W_LABINIT sLabInit; sLabInit.formID = IDTRANS_LAUNCH; sLabInit.id = IDTRANS_CAPACITY; sLabInit.x = (SWORD)(sButInit.x + 20); sLabInit.y = 0; sLabInit.width = 16; sLabInit.height = 16; sLabInit.pText = "00/10"; sLabInit.pCallback = intUpdateTransCapacity; if (!widgAddLabel(psWScreen, &sLabInit)) { return false; } //when full flash the transporter button if (psCurrTransporter && psCurrTransporter->psGroup) { capacity = TRANSPORTER_CAPACITY; for (psCurr = psCurrTransporter->psGroup->psList; psCurr != NULL; psCurr = psNext) { psNext = psCurr->psGrpNext; if (psCurr != psCurrTransporter) { capacity -= transporterSpaceRequired(psCurr); } } if (capacity <= 0) { flashMissionButton(IDTRANS_LAUNCH); } } return true; }
// Add the main Transporter Contents Interface bool intAddTransporterContents(void) { bool Animate = true; // Is the form already up? if (widgGetFromID(psWScreen, IDTRANS_CONTENTFORM) != NULL) { intRemoveTransContentNoAnim(); Animate = false; } if (intIsRefreshing()) { Animate = false; } W_FORMINIT sFormInit; sFormInit.formID = 0; sFormInit.id = IDTRANS_CONTENTFORM; sFormInit.style = WFORM_PLAIN; sFormInit.x = (SWORD)TRANSCONT_X; sFormInit.y = (SWORD)TRANSCONT_Y; sFormInit.width = TRANSCONT_WIDTH; sFormInit.height = TRANSCONT_HEIGHT; // If the window was closed then do open animation. if (Animate) { sFormInit.pDisplay = intOpenPlainForm; sFormInit.disableChildren = true; } else { // otherwise just recreate it. sFormInit.pDisplay = intDisplayPlainForm; } if (!widgAddForm(psWScreen, &sFormInit)) { return false; } /* Add the close button */ W_BUTINIT sButInit; sButInit.formID = IDTRANS_CONTENTFORM; sButInit.id = IDTRANS_CONTCLOSE; sButInit.x = STAT_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; } if (bMultiPlayer) { //add the capacity label W_LABINIT sLabInit; sLabInit.formID = IDTRANS_CONTENTFORM; sLabInit.id = IDTRANS_CAPACITY; sLabInit.x = (SWORD)sButInit.x - 40; sLabInit.y = 0; sLabInit.width = 16; sLabInit.height = 16; sLabInit.pText = "00/10"; sLabInit.pCallback = intUpdateTransCapacity; if (!widgAddLabel(psWScreen, &sLabInit)) { return false; } } //add the Launch button if on a mission if (onMission) { W_FORMINIT sButFInit; sButFInit.formID = IDTRANS_CONTENTFORM; sButFInit.id = IDTRANS_LAUNCH; sButFInit.style = WFORM_CLICKABLE | WFORM_NOCLICKMOVE; sButFInit.x = OBJ_STARTX; sButFInit.y = (UWORD)(STAT_SLDY - 1); sButFInit.width = iV_GetImageWidth(IntImages, IMAGE_LAUNCHUP); sButFInit.height = iV_GetImageHeight(IntImages, IMAGE_LAUNCHUP); sButFInit.pTip = _("Launch Transport"); //sButInit.pText = "Launch"; sButFInit.pDisplay = intDisplayImageHilight; sButFInit.UserData = PACKDWORD_TRI(0, IMAGE_LAUNCHDOWN, IMAGE_LAUNCHUP); if (!widgAddForm(psWScreen, &sButFInit)) { return false; } } if (!intAddTransContentsForm()) { return false; } return true; }
// //////////////////////////////////////////////////////////////////////////// bool startLimitScreen(void) { UDWORD numButtons = 0; UDWORD i; addBackdrop();//background // load stats... if(!bLimiterLoaded) { initLoadingScreen(true); if (!resLoad("wrf/limiter_tex.wrf", 501)) { return false; } if (!resLoad("wrf/piestats.wrf", 502)) { return false; } if (!resLoad("wrf/limiter_data.wrf", 503)) { return false; } bLimiterLoaded = true; closeLoadingScreen(); } if (challengeActive) { // reset the sliders.. // it's a HACK since the actual limiter structure was cleared in the startMultiOptions function for (i = 0; i < numStructureStats ; ++i) { asStructLimits[0][i].limit = asStructLimits[0][i].globalLimit; } // turn off the sliders sliderEnableDrag(false); } else { //enable the sliders sliderEnableDrag(true); } addSideText(FRONTEND_SIDETEXT1,LIMITSX-2,LIMITSY,"LIMITS"); // draw sidetext... W_FORMINIT sFormInit; sFormInit.formID = FRONTEND_BACKDROP; sFormInit.id = IDLIMITS; sFormInit.style = WFORM_PLAIN; sFormInit.x = LIMITSX; sFormInit.y = LIMITSY; sFormInit.width = LIMITSW; sFormInit.height = LIMITSH; sFormInit.pDisplay = intDisplayPlainForm; widgAddForm(psWScreen, &sFormInit); // return button. addMultiBut(psWScreen,IDLIMITS,IDLIMITS_RETURN, LIMITS_OKX-40,LIMITS_OKY, iV_GetImageWidth(FrontImages,IMAGE_RETURN), iV_GetImageHeight(FrontImages,IMAGE_RETURN), _("Apply Defaults and Return To Previous Screen"),IMAGE_NO,IMAGE_NO,true); // ok button addMultiBut(psWScreen,IDLIMITS,IDLIMITS_OK, LIMITS_OKX,LIMITS_OKY, iV_GetImageWidth(FrontImages,IMAGE_OK), iV_GetImageHeight(FrontImages,IMAGE_OK), _("Accept Settings"),IMAGE_OK,IMAGE_OK,true); // Count the number of minor tabs needed numButtons = 0; for(i=0; i<numStructureStats; i++ ) { if(useStruct(numButtons,i)) { numButtons++; } } if(numButtons >(4*BUTPERFORM)) numButtons =(4*BUTPERFORM); // add tab form.. sFormInit = W_FORMINIT(); sFormInit.formID = IDLIMITS; sFormInit.id = IDLIMITS_TABS; sFormInit.style = WFORM_TABBED; sFormInit.x = 50; sFormInit.y = 10; sFormInit.width = LIMITSW - 100; sFormInit.height =LIMITSH - 4; sFormInit.numMajor = numForms(numButtons, BUTPERFORM); sFormInit.majorPos = WFORM_TABTOP; sFormInit.minorPos = WFORM_TABNONE; sFormInit.majorSize = OBJ_TABWIDTH+3; //!! sFormInit.majorOffset = OBJ_TABOFFSET; sFormInit.tabVertOffset = (OBJ_TABHEIGHT/2); //(DES_TAB_HEIGHT/2)+2; sFormInit.tabMajorThickness = OBJ_TABHEIGHT; sFormInit.pUserData = &StandardTab; sFormInit.pTabDisplay = intDisplayTab; // TABFIXME --unsure if needs fixing yet. for (i=0; i< sFormInit.numMajor; i++) { sFormInit.aNumMinors[i] = 1; } widgAddForm(psWScreen, &sFormInit); //Put the buttons on it W_FORMINIT sButInit; sButInit.formID = IDLIMITS_TABS;//IDLIMITS; sButInit.style = WFORM_PLAIN; sButInit.width = BARWIDTH; sButInit.height = BARHEIGHT; sButInit.pDisplay = displayStructureBar; sButInit.x = 2; sButInit.y = 5; sButInit.id = IDLIMITS_ENTRIES_START; numButtons =0; for(i=0; i<numStructureStats ; i++) { if(useStruct(numButtons,i)) { numButtons++; sButInit.UserData= i; widgAddForm(psWScreen, &sButInit); sButInit.id ++; addFESlider(sButInit.id,sButInit.id-1, 290,11, asStructLimits[0][i].globalLimit, asStructLimits[0][i].limit); sButInit.id ++; if (sButInit.y + BARHEIGHT + 2 > (BUTPERFORM*(BARHEIGHT+2) - 4) ) { sButInit.y = 5; sButInit.majorID += 1; } else { sButInit.y += BARHEIGHT +5; } } } return true; }
static void displayMultiPlayer(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset) { char str[128]; int x = xOffset + psWidget->x(); int y = yOffset + psWidget->y(); unsigned player = psWidget->UserData; // Get the in game player number. if (responsibleFor(player, 0)) { displayExtraGubbins(widgGetFromID(psWScreen,MULTIMENU_FORM)->height()); } iV_SetFont(font_regular); // font iV_SetTextColour(WZCOL_TEXT_BRIGHT); const bool isHuman = isHumanPlayer(player); const bool isAlly = aiCheckAlliances(selectedPlayer, player); const bool isSelectedPlayer = player == selectedPlayer; SetPlayerTextColor(alliances[selectedPlayer][player], player); if (isHuman || (game.type == SKIRMISH && player<game.maxPlayers) ) { ssprintf(str, "%d: %s", NetPlay.players[player].position, getPlayerName(player)); while (iV_GetTextWidth(str) >= MULTIMENU_C0 - MULTIMENU_C2 - 10) { str[strlen(str) - 1] = '\0'; } iV_DrawText(str, x + MULTIMENU_C2, y + MULTIMENU_FONT_OSET); //c3-7 alliance //manage buttons by showing or hiding them. gifts only in campaign, if (alliancesCanGiveAnything(game.alliance)) { if (isAlly && !isSelectedPlayer && !giftsUp[player] ) { if (alliancesCanGiveResearchAndRadar(game.alliance)) { widgReveal(psWScreen, MULTIMENU_GIFT_RAD + player); widgReveal(psWScreen, MULTIMENU_GIFT_RES + player); } widgReveal(psWScreen, MULTIMENU_GIFT_DRO + player); widgReveal(psWScreen, MULTIMENU_GIFT_POW + player); giftsUp[player] = true; } else if (!isAlly && !isSelectedPlayer && giftsUp[player]) { if (alliancesCanGiveResearchAndRadar(game.alliance)) { widgHide(psWScreen, MULTIMENU_GIFT_RAD + player); widgHide(psWScreen, MULTIMENU_GIFT_RES + player); } widgHide(psWScreen, MULTIMENU_GIFT_DRO + player); widgHide(psWScreen, MULTIMENU_GIFT_POW + player); giftsUp[player] = false; } } } // Let's use the real score for MP games if (NetPlay.bComms) { //c8:score, if (Cheated) { sprintf(str, "(cheated)"); } else { sprintf(str, "%d", getMultiStats(player).recentScore); } iV_DrawText(str, x + MULTIMENU_C8, y + MULTIMENU_FONT_OSET); //c9:kills, sprintf(str, "%d", getMultiStats(player).recentKills); iV_DrawText(str, x + MULTIMENU_C9, y + MULTIMENU_FONT_OSET); } else { // estimate of score for skirmish games sprintf(str, "%d", ingame.skScores[player][0]); iV_DrawText(str, x + MULTIMENU_C8, y + MULTIMENU_FONT_OSET); // estimated kills sprintf(str, "%d", ingame.skScores[player][1]); iV_DrawText(str, x + MULTIMENU_C9, y + MULTIMENU_FONT_OSET); } //only show player's and allies' unit counts, and nobody elses. //c10:units if (isAlly || getDebugMappingStatus()) { sprintf(str, "%d", getNumDroids(player) + getNumTransporterDroids(player)); iV_DrawText(str, x + MULTIMENU_C10, y + MULTIMENU_FONT_OSET); } /* Display player power instead of number of played games * and number of units instead of ping when in debug mode */ if (getDebugMappingStatus()) //Won't pass this when in both release and multiplayer modes { //c11: Player power sprintf(str, "%u", (int)getPower(player)); iV_DrawText(str, MULTIMENU_FORM_X + MULTIMENU_C11, y + MULTIMENU_FONT_OSET); } else if (runningMultiplayer()) { //c11:ping if (!isSelectedPlayer && isHuman) { if (ingame.PingTimes[player] < PING_LIMIT) { sprintf(str, "%03d", ingame.PingTimes[player]); } else { sprintf(str, "∞"); } iV_DrawText(str, x + MULTIMENU_C11, y + MULTIMENU_FONT_OSET); } } else { //c11: Structures if (isAlly || getDebugMappingStatus()) { // NOTE, This tallys up *all* the structures you have. Test out via 'start with no base'. int num = 0; for (STRUCTURE *temp = apsStructLists[player]; temp != NULL; temp = temp->psNext) { ++num; } sprintf(str, "%d", num); iV_DrawText(str, x + MULTIMENU_C11, y + MULTIMENU_FONT_OSET); } } // a droid of theirs. DROID *displayDroid = apsDroidLists[player]; while (displayDroid != NULL && !displayDroid->visible[selectedPlayer]) { displayDroid = displayDroid->psNext; } if (displayDroid) { pie_SetGeometricOffset( MULTIMENU_FORM_X+MULTIMENU_C1 ,y+MULTIMENU_PLAYER_H); Vector3i rotation(-15, 45, 0); Position position(0, 0, BUTTON_DEPTH); // Scale them. if (displayDroid->droidType == DROID_SUPERTRANSPORTER) { position.z = 7850; } else if (displayDroid->droidType == DROID_TRANSPORTER) { position.z = 4100; } displayComponentButtonObject(displayDroid, &rotation, &position, false, 100); } else if (apsDroidLists[player]) { // Show that they have droids, but not which droids, since we can't see them. iV_DrawImageTc(IntImages, IMAGE_GENERIC_TANK, IMAGE_GENERIC_TANK_TC, MULTIMENU_FORM_X + MULTIMENU_C1 - iV_GetImageWidth(IntImages, IMAGE_GENERIC_TANK)/2, y + MULTIMENU_PLAYER_H - iV_GetImageHeight(IntImages, IMAGE_GENERIC_TANK), pal_GetTeamColour(getPlayerColour(player))); } // clean up widgets if player leaves while menu is up. if (!isHuman && !(game.type == SKIRMISH && player < game.maxPlayers)) { if (widgGetFromID(psWScreen, MULTIMENU_CHANNEL + player) != NULL) { widgDelete(psWScreen, MULTIMENU_CHANNEL + player); } if (widgGetFromID(psWScreen, MULTIMENU_ALLIANCE_BASE + player) != NULL) { widgDelete(psWScreen, MULTIMENU_ALLIANCE_BASE + player); widgDelete(psWScreen, MULTIMENU_GIFT_RAD + player); widgDelete(psWScreen, MULTIMENU_GIFT_RES + player); widgDelete(psWScreen, MULTIMENU_GIFT_DRO + player); widgDelete(psWScreen, MULTIMENU_GIFT_POW + player); giftsUp[player] = false; } } }
// //////////////////////////////////////////////////////////////////////////// bool addLoadSave(LOADSAVE_MODE savemode, const char *title) { bool bLoad = true; char NewSaveGamePath[PATH_MAX] = {'\0'}; bLoadSaveMode = savemode; UDWORD slotCount; static char sSlotCaps[totalslots][totalslotspace]; static char sSlotTips[totalslots][totalslotspace]; char **i, **files; switch(savemode) { case LOAD_FRONTEND_MISSION: case LOAD_INGAME_MISSION: case LOAD_MISSIONEND: ssprintf(NewSaveGamePath, "%s%s/", SaveGamePath, "campaign"); break; case LOAD_FRONTEND_SKIRMISH: case LOAD_INGAME_SKIRMISH: ssprintf(NewSaveGamePath, "%s%s/", SaveGamePath, "skirmish"); break; case SAVE_MISSIONEND: case SAVE_INGAME_MISSION: ssprintf(NewSaveGamePath, "%s%s/", SaveGamePath, "campaign"); bLoad = false; break; case SAVE_INGAME_SKIRMISH: ssprintf(NewSaveGamePath, "%s%s/", SaveGamePath, "skirmish"); bLoad = false; break; default: ASSERT("Invalid load/save mode!", "Invalid load/save mode!"); ssprintf(NewSaveGamePath, "%s%s/", SaveGamePath, "campaign"); break; } mode = bLoad; debug(LOG_SAVE, "called (%d, %s)", bLoad, title); if ((bLoadSaveMode == LOAD_INGAME_MISSION) || (bLoadSaveMode == SAVE_INGAME_MISSION) || (bLoadSaveMode == LOAD_INGAME_SKIRMISH) || (bLoadSaveMode == SAVE_INGAME_SKIRMISH)) { if (!bMultiPlayer || (NetPlay.bComms ==0)) { gameTimeStop(); if(GetGameMode() == GS_NORMAL) { bool radOnScreen = radarOnScreen; // Only do this in main game. bRender3DOnly = true; radarOnScreen = false; displayWorld(); // Just display the 3d, no interface radarOnScreen = radOnScreen; bRender3DOnly = false; } setGamePauseStatus( true ); setGameUpdatePause(true); setScriptPause(true); setScrollPause(true); setConsolePause(true); } forceHidePowerBar(); intRemoveReticule(); } psRequestScreen = new W_SCREEN; WIDGET *parent = psRequestScreen->psForm; /* add a form to place the tabbed form on */ // we need the form to be long enough for all resolutions, so we take the total number of items * height // and * the gaps, add the banner, and finally, the fudge factor ;) IntFormAnimated *loadSaveForm = new IntFormAnimated(parent); loadSaveForm->id = LOADSAVE_FORM; loadSaveForm->setGeometry(LOADSAVE_X, LOADSAVE_Y, LOADSAVE_W, slotsInColumn*(LOADENTRY_H + LOADSAVE_HGAP) + LOADSAVE_BANNER_DEPTH + 20); // Add Banner W_FORMINIT sFormInit; sFormInit.formID = LOADSAVE_FORM; sFormInit.id = LOADSAVE_BANNER; sFormInit.x = LOADSAVE_HGAP; sFormInit.y = LOADSAVE_VGAP; sFormInit.width = LOADSAVE_W-(2*LOADSAVE_HGAP); sFormInit.height = LOADSAVE_BANNER_DEPTH; sFormInit.pDisplay = displayLoadBanner; sFormInit.UserData = bLoad; widgAddForm(psRequestScreen, &sFormInit); // Add Banner Label W_LABINIT sLabInit; sLabInit.formID = LOADSAVE_BANNER; sLabInit.FontID = font_large; sLabInit.id = LOADSAVE_LABEL; sLabInit.style = WLAB_ALIGNCENTRE; sLabInit.x = 0; sLabInit.y = 0; sLabInit.width = LOADSAVE_W-(2*LOADSAVE_HGAP); //LOADSAVE_W; sLabInit.height = LOADSAVE_BANNER_DEPTH; //This looks right -Q sLabInit.pText = title; widgAddLabel(psRequestScreen, &sLabInit); // add cancel. W_BUTINIT sButInit; sButInit.formID = LOADSAVE_BANNER; sButInit.x = 8; sButInit.y = 10; sButInit.width = iV_GetImageWidth(IntImages,IMAGE_NRUTER); sButInit.height = iV_GetImageHeight(IntImages,IMAGE_NRUTER); sButInit.UserData = PACKDWORD_TRI(0,IMAGE_NRUTER , IMAGE_NRUTER); sButInit.id = LOADSAVE_CANCEL; sButInit.style = WBUT_PLAIN; sButInit.pTip = _("Close"); sButInit.pDisplay = intDisplayImageHilight; widgAddButton(psRequestScreen, &sButInit); // add slots sButInit = W_BUTINIT(); sButInit.formID = LOADSAVE_FORM; sButInit.style = WBUT_PLAIN; sButInit.width = LOADENTRY_W; sButInit.height = LOADENTRY_H; sButInit.pDisplay = displayLoadSlot; for(slotCount = 0; slotCount< totalslots; slotCount++) { sButInit.id = slotCount+LOADENTRY_START; if(slotCount < slotsInColumn) { sButInit.x = 22 + LOADSAVE_HGAP; sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2*LOADSAVE_VGAP)) + ( slotCount*(LOADSAVE_VGAP+LOADENTRY_H))); } else if (slotCount >= slotsInColumn && (slotCount < (slotsInColumn *2))) { sButInit.x = 22 + (2*LOADSAVE_HGAP + LOADENTRY_W); sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2* LOADSAVE_VGAP)) + ( (slotCount % slotsInColumn)*(LOADSAVE_VGAP+LOADENTRY_H))); } else { sButInit.x = 22 + (3*LOADSAVE_HGAP + (2*LOADENTRY_W)); sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2* LOADSAVE_VGAP)) + ( (slotCount % slotsInColumn)*(LOADSAVE_VGAP+LOADENTRY_H))); } widgAddButton(psRequestScreen, &sButInit); } // fill slots. slotCount = 0; debug(LOG_SAVE, "Searching \"%s\" for savegames", NewSaveGamePath); // add savegame filenames minus extensions to buttons files = PHYSFS_enumerateFiles(NewSaveGamePath); for (i = files; *i != NULL; ++i) { W_BUTTON *button; char savefile[256]; time_t savetime; struct tm *timeinfo; // See if this filename contains the extension we're looking for if (!strstr(*i, sExt)) { // If it doesn't, move on to the next filename continue; } button = (W_BUTTON*)widgGetFromID(psRequestScreen, LOADENTRY_START + slotCount); debug(LOG_SAVE, "We found [%s]", *i); /* Figure save-time */ snprintf(savefile, sizeof(savefile), "%s/%s", NewSaveGamePath, *i); savetime = PHYSFS_getLastModTime(savefile); timeinfo = localtime(&savetime); strftime(sSlotTips[slotCount], sizeof(sSlotTips[slotCount]), "%x %X", timeinfo); /* Set the button-text */ (*i)[strlen(*i) - 4] = '\0'; // remove .gam extension sstrcpy(sSlotCaps[slotCount], *i); //store it! /* Add button */ button->pTip = sSlotTips[slotCount]; button->pText = sSlotCaps[slotCount]; slotCount++; // goto next but... if (slotCount == totalslots) { break; } } PHYSFS_freeList(files); bLoadSaveUp = true; return true; }
static void displayMultiPlayer(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, PIELIGHT *pColours) { char str[128]; UDWORD x = xOffset+psWidget->x; UDWORD y = yOffset+psWidget->y; UDWORD player = psWidget->UserData; //get the in game player number. Position position; Vector3i rotation; if( responsibleFor(player,0) ) { displayExtraGubbins(widgGetFromID(psWScreen,MULTIMENU_FORM)->height); } iV_SetFont(font_regular); // font iV_SetTextColour(WZCOL_TEXT_BRIGHT); if(isHumanPlayer(player) || (game.type == SKIRMISH && player<game.maxPlayers) ) { ssprintf(str, "%d: %s", NetPlay.players[player].position, getPlayerName(player)); if (isHumanPlayer(player)) { SetPlayerTextColor(alliances[selectedPlayer][player], player); } else { SetPlayerTextColor(alliances[selectedPlayer][player], player); } while(iV_GetTextWidth(str) >= (MULTIMENU_C0-MULTIMENU_C2-10) ) { str[strlen(str)-1]='\0'; } iV_DrawText(str, x+MULTIMENU_C2, y+MULTIMENU_FONT_OSET); //c3-7 alliance //manage buttons by showing or hiding them. gifts only in campaign, { if(game.alliance != NO_ALLIANCES) { if(alliances[selectedPlayer][player] == ALLIANCE_FORMED) { if(player != selectedPlayer && !giftsUp[player] ) { if (game.alliance != ALLIANCES_TEAMS) { widgReveal(psWScreen,MULTIMENU_GIFT_RAD+ player); widgReveal(psWScreen,MULTIMENU_GIFT_RES+ player); } widgReveal(psWScreen,MULTIMENU_GIFT_DRO+ player); widgReveal(psWScreen,MULTIMENU_GIFT_POW+ player); giftsUp[player] = true; } } else { if(player != selectedPlayer && giftsUp[player]) { if (game.alliance != ALLIANCES_TEAMS) { widgHide(psWScreen,MULTIMENU_GIFT_RAD+ player); widgHide(psWScreen,MULTIMENU_GIFT_RES+ player); } widgHide(psWScreen,MULTIMENU_GIFT_DRO+ player); widgHide(psWScreen,MULTIMENU_GIFT_POW+ player); giftsUp[player] = false; } } } } } if(isHumanPlayer(player)) { SetPlayerTextColor(alliances[selectedPlayer][player], player); // Let's use the real score for MP games if (NetPlay.bComms) { //c8:score, if (Cheated) { sprintf(str,"(cheated)"); } else { sprintf(str,"%d",getMultiStats(player).recentScore); } iV_DrawText(str, x+MULTIMENU_C8, y+MULTIMENU_FONT_OSET); //c9:kills, sprintf(str,"%d",getMultiStats(player).recentKills); iV_DrawText(str, x+MULTIMENU_C9, y+MULTIMENU_FONT_OSET); } else { // estimate of score for skirmish games sprintf(str,"%d",ingame.skScores[player][0]); iV_DrawText(str, x+MULTIMENU_C8, y+MULTIMENU_FONT_OSET); // estimated kills sprintf(str,"%d",ingame.skScores[player][1]); iV_DrawText(str, x+MULTIMENU_C9, y+MULTIMENU_FONT_OSET); } if(!getDebugMappingStatus()) { //only show player's units, and nobody elses. //c10:units if (myResponsibility(player)) { SetPlayerTextColor(alliances[selectedPlayer][player], player); sprintf(str, "%d", getNumDroids(player) + getNumTransporterDroids(player)); iV_DrawText(str, x+MULTIMENU_C10, y+MULTIMENU_FONT_OSET); } if (runningMultiplayer()) { //c11:ping if (player != selectedPlayer) { if (ingame.PingTimes[player] >= 2000) { sprintf(str,"???"); } else { sprintf(str, "%d", ingame.PingTimes[player]); } iV_DrawText(str, x+MULTIMENU_C11, y+MULTIMENU_FONT_OSET); } } else { int num; STRUCTURE *temp; // NOTE, This tallys up *all* the structures you have. Test out via 'start with no base'. for (num = 0, temp = apsStructLists[player]; temp != NULL;num++,temp = temp->psNext) {} //c11: Structures sprintf(str, "%d", num); iV_DrawText(str, x+MULTIMENU_C11, y+MULTIMENU_FONT_OSET); } } } else { SetPlayerTextColor(alliances[selectedPlayer][player], player); // Let's use the real score for MP games if (NetPlay.bComms) { //c8:score, if (Cheated) { sprintf(str,"(cheated)"); } else { sprintf(str,"%d",getMultiStats(player).recentScore); } iV_DrawText(str, x+MULTIMENU_C8, y+MULTIMENU_FONT_OSET); //c9:kills, sprintf(str,"%d",getMultiStats(player).recentKills); iV_DrawText(str, x+MULTIMENU_C9, y+MULTIMENU_FONT_OSET); } else { // estimate of score for skirmish games sprintf(str,"%d",ingame.skScores[player][0]); iV_DrawText(str, x+MULTIMENU_C8, y+MULTIMENU_FONT_OSET); // estimated kills sprintf(str,"%d",ingame.skScores[player][1]); iV_DrawText(str, x+MULTIMENU_C9, y+MULTIMENU_FONT_OSET); } } /* Display player power instead of number of played games * and number of units instead of ping when in debug mode */ if(getDebugMappingStatus()) //Won't pass this when in both release and multiplayer modes { //c10: Total number of player units in possession sprintf(str,"%d",getNumDroids(player) + getNumTransporterDroids(player)); iV_DrawText(str, x+MULTIMENU_C10, y+MULTIMENU_FONT_OSET); //c11: Player power sprintf(str, "%u", (int)getPower(player)); iV_DrawText(str, MULTIMENU_FORM_X+MULTIMENU_C11, y+MULTIMENU_FONT_OSET); } // a droid of theirs. DROID *displayDroid = apsDroidLists[player]; while (displayDroid != NULL && !displayDroid->visible[selectedPlayer]) { displayDroid = displayDroid->psNext; } if (displayDroid) { pie_SetGeometricOffset( MULTIMENU_FORM_X+MULTIMENU_C1 ,y+MULTIMENU_PLAYER_H); rotation.x = -15; rotation.y = 45; rotation.z = 0; position.x = 0; position.y = 0; position.z = 2000; //scale them! displayComponentButtonObject(displayDroid, &rotation, &position, false, 100); } else if(apsDroidLists[player]) { // Show that they have droids, but not which droids, since we can't see them. iV_DrawImageTc(IntImages, IMAGE_GENERIC_TANK, IMAGE_GENERIC_TANK_TC, MULTIMENU_FORM_X + MULTIMENU_C1 - iV_GetImageWidth(IntImages, IMAGE_GENERIC_TANK)/2, y + MULTIMENU_PLAYER_H - iV_GetImageHeight(IntImages, IMAGE_GENERIC_TANK), pal_GetTeamColour(getPlayerColour(player))); } // clean up widgets if player leaves while menu is up. if(!isHumanPlayer(player) && !(game.type == SKIRMISH && player<game.maxPlayers)) { if(widgGetFromID(psWScreen,MULTIMENU_CHANNEL+player)) { widgDelete(psWScreen,MULTIMENU_CHANNEL+ player); } if(widgGetFromID(psWScreen,MULTIMENU_ALLIANCE_BASE+player) ) { widgDelete(psWScreen,MULTIMENU_ALLIANCE_BASE+ player); widgDelete(psWScreen,MULTIMENU_GIFT_RAD+ player); widgDelete(psWScreen,MULTIMENU_GIFT_RES+ player); widgDelete(psWScreen,MULTIMENU_GIFT_DRO+ player); widgDelete(psWScreen,MULTIMENU_GIFT_POW+ player); giftsUp[player] = false; } } }
// //////////////////////////////////////////////////// static BOOL _addLoadSave(BOOL bLoad,CHAR *sSearchPath,CHAR *sExtension, CHAR *title) { W_FORMINIT sFormInit; W_BUTINIT sButInit; W_LABINIT sLabInit; UDWORD slotCount; static STRING sSlots[10][64]; STRING sTemp[255]; WIN32_FIND_DATA found; HANDLE dir; mode = bLoad; if(GetCurrentDirectory(255,(char*)&sTemp) == 0) { return FALSE; // failed, directory probably didn't exist. } if ((bLoadSaveMode == LOAD_INGAME) || (bLoadSaveMode == SAVE_INGAME)) { if (!bMultiPlayer || (NetPlay.bComms ==0)) { gameTimeStop(); if(GetGameMode() == GS_NORMAL) { BOOL radOnScreen = radarOnScreen; // Only do this in main game. bRender3DOnly = TRUE; radarOnScreen = FALSE; displayWorld(); // Just display the 3d, no interface pie_UploadDisplayBuffer(DisplayBuffer); // Upload the current display back buffer into system memory. iV_ScaleBitmapRGB(DisplayBuffer,iV_GetDisplayWidth(), iV_GetDisplayHeight(),2,2,2); // Make it darker. radarOnScreen = radOnScreen; bRender3DOnly = FALSE; } setGamePauseStatus( TRUE ); setGameUpdatePause(TRUE); setScriptPause(TRUE); setScrollPause(TRUE); setConsolePause(TRUE); } forceHidePowerBar(); intRemoveReticule(); } CreateDirectory(sSearchPath,NULL); // create the directory required... fails if already there, so no problem. widgCreateScreen(&psRequestScreen); // init the screen. widgSetTipFont(psRequestScreen,WFont); /* add a form to place the tabbed form on */ memset(&sFormInit, 0, sizeof(W_FORMINIT)); sFormInit.formID = 0; sFormInit.id = LOADSAVE_FORM; sFormInit.style = WFORM_PLAIN; sFormInit.x = (SWORD)(LOADSAVE_X); sFormInit.y = (SWORD)(LOADSAVE_Y); sFormInit.width = LOADSAVE_W; sFormInit.height = LOADSAVE_H; sFormInit.disableChildren = TRUE; sFormInit.pDisplay = intOpenPlainForm; widgAddForm(psRequestScreen, &sFormInit); // Add Banner sFormInit.formID = LOADSAVE_FORM; sFormInit.id = LOADSAVE_BANNER; sFormInit.x = LOADSAVE_HGAP; sFormInit.y = LOADSAVE_VGAP; sFormInit.width = LOADSAVE_W-(2*LOADSAVE_HGAP); sFormInit.height = LOADSAVE_BANNER_DEPTH; sFormInit.disableChildren = FALSE; sFormInit.pDisplay = displayLoadBanner; sFormInit.pUserData = (VOID *)bLoad; widgAddForm(psRequestScreen, &sFormInit); // Add Banner Label memset(&sLabInit, 0, sizeof(W_LABINIT)); sLabInit.formID = LOADSAVE_BANNER; sLabInit.id = LOADSAVE_LABEL; sLabInit.style = WLAB_ALIGNCENTRE; sLabInit.x = 0; sLabInit.y = 4; sLabInit.width = LOADSAVE_W-(2*LOADSAVE_HGAP); //LOADSAVE_W; sLabInit.height = 20; sLabInit.pText = title; sLabInit.FontID = WFont; widgAddLabel(psRequestScreen, &sLabInit); // add cancel. memset(&sButInit, 0, sizeof(W_BUTINIT)); sButInit.formID = LOADSAVE_BANNER; sButInit.x = 4; sButInit.y = 3; sButInit.width = iV_GetImageWidth(IntImages,IMAGE_NRUTER); sButInit.height = iV_GetImageHeight(IntImages,IMAGE_NRUTER); sButInit.pUserData = (void*)PACKDWORD_TRI(0,IMAGE_NRUTER , IMAGE_NRUTER); sButInit.id = LOADSAVE_CANCEL; sButInit.style = WBUT_PLAIN; sButInit.pTip = strresGetString(psStringRes, STR_MISC_CLOSE); sButInit.FontID = WFont; sButInit.pDisplay = intDisplayImageHilight; widgAddButton(psRequestScreen, &sButInit); // add slots memset(&sButInit, 0, sizeof(W_BUTINIT)); sButInit.formID = LOADSAVE_FORM; sButInit.style = WBUT_PLAIN; sButInit.width = LOADENTRY_W; sButInit.height = LOADENTRY_H; sButInit.pDisplay = displayLoadSlot; sButInit.FontID = WFont; for(slotCount = 0; slotCount< 10 ; slotCount++) { sButInit.id = slotCount+LOADENTRY_START; if(slotCount<5) { sButInit.x = LOADSAVE_HGAP; sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2*LOADSAVE_VGAP)) + ( slotCount*(LOADSAVE_VGAP+LOADENTRY_H))); } else { sButInit.x = (2*LOADSAVE_HGAP)+LOADENTRY_W; sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2* LOADSAVE_VGAP)) + ( (slotCount-5) *(LOADSAVE_VGAP+LOADENTRY_H))); } widgAddButton(psRequestScreen, &sButInit); } // fill slots. slotCount = 0; sprintf(sTemp,"%s*.%s",sSearchPath,sExtension); // form search string. strcpy(sPath,sSearchPath); // setup locals. strcpy(sExt,sExtension); dir =FindFirstFile(sTemp,&found); if(dir != INVALID_HANDLE_VALUE) { while( TRUE ) { /* Set the tip and add the button */ found.cFileName[strlen(found.cFileName) -4 ] = '\0'; // chop extension strcpy(sSlots[slotCount],found.cFileName); //store it! ((W_BUTTON *)widgGetFromID(psRequestScreen,LOADENTRY_START+slotCount))->pTip = sSlots[slotCount]; ((W_BUTTON *)widgGetFromID(psRequestScreen,LOADENTRY_START+slotCount))->pText = sSlots[slotCount]; slotCount++; // goto next but. if(!FindNextFile(dir,&found ) || slotCount == 10 )// only show upto 10 entrys. { break; } } } FindClose(dir); bLoadSaveUp = TRUE; return TRUE; }
//**************************************************************************************** // Load menu/save menu? //***************************************************************************************** static BOOL _addLoadSave(BOOL bLoad, const char *sSearchPath, const char *sExtension, const char *title) { W_FORMINIT sFormInit; W_BUTINIT sButInit; W_LABINIT sLabInit; UDWORD slotCount; // removed hardcoded values! change with the defines above! -Q static char sSlotCaps[totalslots][totalslotspace]; static char sSlotTips[totalslots][totalslotspace]; char **i, **files; const char* checkExtension; mode = bLoad; debug(LOG_SAVE, "called (%d, %s, %s, %s)", bLoad, sSearchPath, sExtension, title); if ((bLoadSaveMode == LOAD_INGAME) || (bLoadSaveMode == SAVE_INGAME)) { if (!bMultiPlayer || (NetPlay.bComms ==0)) { gameTimeStop(); if(GetGameMode() == GS_NORMAL) { BOOL radOnScreen = radarOnScreen; // Only do this in main game. bRender3DOnly = true; radarOnScreen = false; displayWorld(); // Just display the 3d, no interface pie_UploadDisplayBuffer(); // Upload the current display back buffer into system memory. radarOnScreen = radOnScreen; bRender3DOnly = false; } setGamePauseStatus( true ); setGameUpdatePause(true); setScriptPause(true); setScrollPause(true); setConsolePause(true); } forceHidePowerBar(); intRemoveReticule(); } (void) PHYSFS_mkdir(sSearchPath); // just in case psRequestScreen = widgCreateScreen(); // init the screen widgSetTipFont(psRequestScreen,font_regular); /* add a form to place the tabbed form on */ memset(&sFormInit, 0, sizeof(W_FORMINIT)); sFormInit.formID = 0; //this adds the blue background, and the "box" behind the buttons -Q sFormInit.id = LOADSAVE_FORM; sFormInit.style = WFORM_PLAIN; sFormInit.x = (SWORD) LOADSAVE_X; sFormInit.y = (SWORD) LOADSAVE_Y; sFormInit.width = LOADSAVE_W; // we need the form to be long enough for all resolutions, so we take the total number of items * height // and * the gaps, add the banner, and finally, the fudge factor ;) sFormInit.height = (slotsInColumn * LOADENTRY_H + LOADSAVE_HGAP* slotsInColumn)+ LOADSAVE_BANNER_DEPTH+20; sFormInit.disableChildren = true; sFormInit.pDisplay = intOpenPlainForm; widgAddForm(psRequestScreen, &sFormInit); // Add Banner sFormInit.formID = LOADSAVE_FORM; sFormInit.id = LOADSAVE_BANNER; sFormInit.x = LOADSAVE_HGAP; sFormInit.y = LOADSAVE_VGAP; sFormInit.width = LOADSAVE_W-(2*LOADSAVE_HGAP); sFormInit.height = LOADSAVE_BANNER_DEPTH; sFormInit.disableChildren = false; sFormInit.pDisplay = displayLoadBanner; sFormInit.UserData = bLoad; widgAddForm(psRequestScreen, &sFormInit); // Add Banner Label memset(&sLabInit, 0, sizeof(W_LABINIT)); sLabInit.formID = LOADSAVE_BANNER; sLabInit.id = LOADSAVE_LABEL; sLabInit.style = WLAB_ALIGNCENTRE; sLabInit.x = 0; sLabInit.y = 3; sLabInit.width = LOADSAVE_W-(2*LOADSAVE_HGAP); //LOADSAVE_W; sLabInit.height = LOADSAVE_BANNER_DEPTH; //This looks right -Q sLabInit.pText = title; sLabInit.FontID = font_regular; widgAddLabel(psRequestScreen, &sLabInit); // add cancel. memset(&sButInit, 0, sizeof(W_BUTINIT)); sButInit.formID = LOADSAVE_BANNER; sButInit.x = 8; sButInit.y = 8; sButInit.width = iV_GetImageWidth(IntImages,IMAGE_NRUTER); sButInit.height = iV_GetImageHeight(IntImages,IMAGE_NRUTER); sButInit.UserData = PACKDWORD_TRI(0,IMAGE_NRUTER , IMAGE_NRUTER); sButInit.id = LOADSAVE_CANCEL; sButInit.style = WBUT_PLAIN; sButInit.pTip = _("Close"); sButInit.FontID = font_regular; sButInit.pDisplay = intDisplayImageHilight; widgAddButton(psRequestScreen, &sButInit); // add slots memset(&sButInit, 0, sizeof(W_BUTINIT)); sButInit.formID = LOADSAVE_FORM; sButInit.style = WBUT_PLAIN; sButInit.width = LOADENTRY_W; sButInit.height = LOADENTRY_H; sButInit.pDisplay = displayLoadSlot; sButInit.FontID = font_regular; for(slotCount = 0; slotCount< totalslots; slotCount++) { sButInit.id = slotCount+LOADENTRY_START; if(slotCount < slotsInColumn) { sButInit.x = 22 + LOADSAVE_HGAP; sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2*LOADSAVE_VGAP)) + ( slotCount*(LOADSAVE_VGAP+LOADENTRY_H))); } else if (slotCount >= slotsInColumn && (slotCount < (slotsInColumn *2))) { sButInit.x = 22 + (2*LOADSAVE_HGAP + LOADENTRY_W); sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2* LOADSAVE_VGAP)) + ( (slotCount % slotsInColumn)*(LOADSAVE_VGAP+LOADENTRY_H))); } else { sButInit.x = 22 + (3*LOADSAVE_HGAP + (2*LOADENTRY_W)); sButInit.y = (SWORD)((LOADSAVE_BANNER_DEPTH +(2* LOADSAVE_VGAP)) + ( (slotCount % slotsInColumn)*(LOADSAVE_VGAP+LOADENTRY_H))); } widgAddButton(psRequestScreen, &sButInit); } // fill slots. slotCount = 0; sstrcpy(sPath, sSearchPath); // setup locals. sstrcpy(sExt, sExtension); debug(LOG_SAVE, "Searching \"%s\" for savegames", sSearchPath); // Check for an extension like ".ext", not "ext" sasprintf((char**)&checkExtension, ".%s", sExtension); // add savegame filenames minus extensions to buttons files = PHYSFS_enumerateFiles(sSearchPath); for (i = files; *i != NULL; ++i) { W_BUTTON *button; char savefile[256]; time_t savetime; // See if this filename contains the extension we're looking for if (!strstr(*i, checkExtension)) { // If it doesn't, move on to the next filename continue; } button = (W_BUTTON*)widgGetFromID(psRequestScreen, LOADENTRY_START + slotCount); debug(LOG_SAVE, "We found [%s]", *i); /* Figure save-time */ snprintf(savefile, sizeof(savefile), "%s/%s", sSearchPath, *i); savetime = PHYSFS_getLastModTime(savefile); sstrcpy(sSlotTips[slotCount], ctime(&savetime)); /* Set the button-text */ (*i)[strlen(*i) - 4] = '\0'; // remove .gam extension sstrcpy(sSlotCaps[slotCount], *i); //store it! /* Add button */ button->pTip = sSlotTips[slotCount]; button->pText = sSlotCaps[slotCount]; slotCount++; // goto next but... if (slotCount == totalslots) { break; } } PHYSFS_freeList(files); bLoadSaveUp = true; return true; }
//**************************************************************************************** // Challenge menu //***************************************************************************************** bool addChallenges() { char sPath[PATH_MAX]; const char *sSearchPath = "challenges"; UDWORD slotCount; static char sSlotCaps[totalslots][totalslotspace]; static char sSlotTips[totalslots][totalslotspace]; static char sSlotFile[totalslots][totalslotspace]; char **i, **files; (void) PHYSFS_mkdir(sSearchPath); // just in case psRequestScreen = widgCreateScreen(); // init the screen widgSetTipFont(psRequestScreen, font_regular); /* add a form to place the tabbed form on */ W_FORMINIT sFormInit; sFormInit.formID = 0; //this adds the blue background, and the "box" behind the buttons -Q sFormInit.id = CHALLENGE_FORM; sFormInit.style = WFORM_PLAIN; sFormInit.x = (SWORD) CHALLENGE_X; sFormInit.y = (SWORD) CHALLENGE_Y; sFormInit.width = CHALLENGE_W; // we need the form to be long enough for all resolutions, so we take the total number of items * height // and * the gaps, add the banner, and finally, the fudge factor ;) sFormInit.height = (slotsInColumn * CHALLENGE_ENTRY_H + CHALLENGE_HGAP * slotsInColumn) + CHALLENGE_BANNER_DEPTH + 20; sFormInit.disableChildren = true; sFormInit.pDisplay = intOpenPlainForm; widgAddForm(psRequestScreen, &sFormInit); // Add Banner sFormInit.formID = CHALLENGE_FORM; sFormInit.id = CHALLENGE_BANNER; sFormInit.x = CHALLENGE_HGAP; sFormInit.y = CHALLENGE_VGAP; sFormInit.width = CHALLENGE_W - (2 * CHALLENGE_HGAP); sFormInit.height = CHALLENGE_BANNER_DEPTH; sFormInit.disableChildren = false; sFormInit.pDisplay = displayLoadBanner; sFormInit.UserData = 0; widgAddForm(psRequestScreen, &sFormInit); // Add Banner Label W_LABINIT sLabInit; sLabInit.formID = CHALLENGE_BANNER; sLabInit.id = CHALLENGE_LABEL; sLabInit.style = WLAB_ALIGNCENTRE; sLabInit.x = 0; sLabInit.y = 3; sLabInit.width = CHALLENGE_W - (2 * CHALLENGE_HGAP); //CHALLENGE_W; sLabInit.height = CHALLENGE_BANNER_DEPTH; //This looks right -Q sLabInit.pText = "Challenge"; widgAddLabel(psRequestScreen, &sLabInit); // add cancel. W_BUTINIT sButInit; sButInit.formID = CHALLENGE_BANNER; sButInit.x = 8; sButInit.y = 8; sButInit.width = iV_GetImageWidth(IntImages, IMAGE_NRUTER); sButInit.height = iV_GetImageHeight(IntImages, IMAGE_NRUTER); sButInit.UserData = PACKDWORD_TRI(0, IMAGE_NRUTER , IMAGE_NRUTER); sButInit.id = CHALLENGE_CANCEL; sButInit.pTip = _("Close"); sButInit.pDisplay = intDisplayImageHilight; widgAddButton(psRequestScreen, &sButInit); // add slots sButInit = W_BUTINIT(); sButInit.formID = CHALLENGE_FORM; sButInit.width = CHALLENGE_ENTRY_W; sButInit.height = CHALLENGE_ENTRY_H; sButInit.pDisplay = displayLoadSlot; for (slotCount = 0; slotCount < totalslots; slotCount++) { sButInit.id = slotCount + CHALLENGE_ENTRY_START; if (slotCount < slotsInColumn) { sButInit.x = 22 + CHALLENGE_HGAP; sButInit.y = (SWORD)((CHALLENGE_BANNER_DEPTH + (2 * CHALLENGE_VGAP)) + ( slotCount * (CHALLENGE_VGAP + CHALLENGE_ENTRY_H))); } else if (slotCount >= slotsInColumn && (slotCount < (slotsInColumn *2))) { sButInit.x = 22 + (2 * CHALLENGE_HGAP + CHALLENGE_ENTRY_W); sButInit.y = (SWORD)((CHALLENGE_BANNER_DEPTH + (2 * CHALLENGE_VGAP)) + ( (slotCount % slotsInColumn) * (CHALLENGE_VGAP + CHALLENGE_ENTRY_H))); } else { sButInit.x = 22 + (3 * CHALLENGE_HGAP + (2 * CHALLENGE_ENTRY_W)); sButInit.y = (SWORD)((CHALLENGE_BANNER_DEPTH + (2 * CHALLENGE_VGAP)) + ( (slotCount % slotsInColumn) * (CHALLENGE_VGAP + CHALLENGE_ENTRY_H))); } widgAddButton(psRequestScreen, &sButInit); } // fill slots. slotCount = 0; sstrcpy(sPath, sSearchPath); sstrcat(sPath, "/*.ini"); debug(LOG_SAVE, "Searching \"%s\" for challenges", sPath); // add challenges to buttons files = PHYSFS_enumerateFiles(sSearchPath); for (i = files; *i != NULL; ++i) { W_BUTTON *button; char description[totalslotspace]; char highscore[totalslotspace]; const char *name, *difficulty, *map, *givendescription; inifile *inif; // See if this filename contains the extension we're looking for if (!strstr(*i, ".ini")) { // If it doesn't, move on to the next filename continue; } /* First grab any high score associated with this challenge */ inif = inifile_load(CHALLENGE_SCORES); sstrcpy(sPath, *i); sPath[strlen(sPath) - 4] = '\0'; // remove .ini sstrcpy(highscore, "no score"); if (inif) { char key[64]; bool victory; int seconds; ssprintf(key, "%s:Player", sPath); name = inifile_get(inif, key, "NO NAME"); ssprintf(key, "%s:Victory", sPath); victory = inifile_get_as_bool(inif, key, false); ssprintf(key, "%s:Seconds", sPath); seconds = inifile_get_as_int(inif, key, -1); if (seconds > 0) { getAsciiTime(key, seconds * GAME_TICKS_PER_SEC); ssprintf(highscore, "%s by %s (%s)", key, name, victory ? "Victory" : "Survived"); } inifile_delete(inif); } ssprintf(sPath, "%s/%s", sSearchPath, *i); inif = inifile_load(sPath); inifile_set_current_section(inif, "challenge"); if (!inif) { debug(LOG_ERROR, "Could not open \"%s\"", sPath); continue; } name = inifile_get(inif, "Name", "BAD NAME"); map = inifile_get(inif, "Map", "BAD MAP"); difficulty = inifile_get(inif, "difficulty", "BAD DIFFICULTY"); givendescription = inifile_get(inif, "description", ""); ssprintf(description, "%s, %s, %s. %s", map, difficulty, highscore, givendescription); button = (W_BUTTON*)widgGetFromID(psRequestScreen, CHALLENGE_ENTRY_START + slotCount); debug(LOG_SAVE, "We found [%s]", *i); /* Set the button-text */ sstrcpy(sSlotCaps[slotCount], name); // store it! sstrcpy(sSlotTips[slotCount], description); // store it, too! sstrcpy(sSlotFile[slotCount], sPath); // store filename inifile_delete(inif); /* Add button */ button->pTip = sSlotTips[slotCount]; button->pText = sSlotCaps[slotCount]; button->pUserData = (void *)sSlotFile[slotCount]; slotCount++; // go to next button... if (slotCount == totalslots) { break; } } PHYSFS_freeList(files); challengesUp = true; return true; }
// //////////////////////////////////////////////////////////////////////////// BOOL startKeyMapEditor(BOOL first) { W_BUTINIT sButInit; W_FORMINIT sFormInit; KEY_MAPPING *psMapping; UDWORD i,mapcount =0; UDWORD bubbleCount; BOOL bAtEnd,bGotOne; KEY_MAPPING *psPresent,*psNext; char test[255]; addBackdrop(); addSideText (FRONTEND_SIDETEXT ,KM_X-2,KM_Y,strresGetString(psStringRes, STR_KM_KEYMAP_SIDE)); if(first) { loadKeyMap(); // get the current mappings. } memset(&sFormInit, 0, sizeof(W_FORMINIT)); // draw blue form... sFormInit.formID = FRONTEND_BACKDROP; sFormInit.id = KM_FORM; sFormInit.style = WFORM_PLAIN; sFormInit.x = KM_X; sFormInit.y = KM_Y; sFormInit.width = KM_W; sFormInit.height = KM_H; sFormInit.pDisplay = intDisplayPlainForm; widgAddForm(psWScreen, &sFormInit); addMultiBut(psWScreen,KM_FORM,KM_RETURN, // return button. 8,5, iV_GetImageWidth(FrontImages,IMAGE_RETURN), iV_GetImageHeight(FrontImages,IMAGE_RETURN), STR_MUL_CANCEL,IMAGE_RETURN,IMAGE_RETURN_HI,TRUE); addMultiBut(psWScreen,KM_FORM,KM_DEFAULT, 11,45, 56,38, STR_MUL_DEFAULT, IMAGE_KEYMAP_DEFAULT,IMAGE_KEYMAP_DEFAULT,TRUE); // default. /* Better be none that come after this...! */ strcpy(test,"zzzzzzzzzzzzzzzzzzzzz"); psMapping = NULL; //count mappings required. for(psMapping = keyMappings; psMapping; psMapping = psMapping->psNext) { if( (psMapping->status!=KEYMAP__DEBUG)&&(psMapping->status!=KEYMAP___HIDE)) // if it's not a debug mapping.. { mapcount++; if(strcmp(psMapping->pName,test) < 0) { /* Best one found so far */ strcpy(test,psMapping->pName); psPresent = psMapping; } } } // add tab form.. memset(&sFormInit, 0, sizeof(W_FORMINIT)); sFormInit.formID = KM_FORM; sFormInit.id = KM_FORM_TABS; sFormInit.style = WFORM_TABBED; sFormInit.x = 50; sFormInit.y = 10; sFormInit.width = KM_W- 100; sFormInit.height = KM_H- 4; sFormInit.numMajor = numForms(mapcount, BUTTONSPERKEYMAPPAGE); sFormInit.majorPos = WFORM_TABTOP; sFormInit.minorPos = WFORM_TABNONE; sFormInit.majorSize = OBJ_TABWIDTH+3; sFormInit.majorOffset = OBJ_TABOFFSET; sFormInit.tabVertOffset = (OBJ_TABHEIGHT/2); sFormInit.tabMajorThickness = OBJ_TABHEIGHT; sFormInit.pFormDisplay = intDisplayObjectForm; sFormInit.pUserData = (void*)&StandardTab; sFormInit.pTabDisplay = intDisplayTab; for (i=0; i< sFormInit.numMajor; i++) { sFormInit.aNumMinors[i] = 1; } widgAddForm(psWScreen, &sFormInit); //Put the buttons on it memset(&sButInit, 0, sizeof(W_BUTINIT)); sButInit.formID = KM_FORM_TABS; sButInit.style = WFORM_PLAIN; sButInit.width = KM_ENTRYW; sButInit.height = KM_ENTRYH; sButInit.pDisplay = displayKeyMap; sButInit.x = 2; sButInit.y = 16; sButInit.id = KM_START; /* Add our first mapping to the form */ sButInit.pUserData= (VOID*)psPresent; widgAddButton(psWScreen, &sButInit); sButInit.id++; /* Now add the others... */ bubbleCount = 0; bAtEnd = FALSE; /* Stop when the right number or when aphabetically last - not sure...! */ while(bubbleCount<mapcount-1 AND !bAtEnd) { /* Same test as before for upper limit */ strcpy(test,"zzzzzzzzzzzzzzzzzzzzz"); for(psMapping = keyMappings,psNext = NULL,bGotOne = FALSE; psMapping; psMapping = psMapping->psNext) { /* Only certain mappings get displayed */ if( (psMapping->status!=KEYMAP__DEBUG)&&(psMapping->status!=KEYMAP___HIDE)) // if it's not a debug mapping.. { /* If it's alphabetically good but better then next one */ if(strcmp(psMapping->pName,test) < 0 AND strcmp(psMapping->pName,psPresent->pName) > 0) { /* Keep a record of it */ strcpy(test,psMapping->pName); psNext = psMapping; bGotOne = TRUE; } } } /* We found one matching criteria */ if(bGotOne) { psPresent = psNext; bubbleCount++; sButInit.pUserData= (VOID*)psNext; widgAddButton(psWScreen, &sButInit); // move on.. sButInit.id++; /* Might be no more room on the page */ if ( (sButInit.y + KM_ENTRYH+5 ) > (3+ (BUTTONSPERKEYMAPPAGE*(KM_ENTRYH+3)))) { sButInit.y = 16; sButInit.majorID += 1; } else { sButInit.y += KM_ENTRYH +3; } } else { /* The previous one we found was alphabetically last - time to stop */ bAtEnd = TRUE; } } /* Go home... */ return TRUE; }