static void displayLoadBanner(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, WZ_DECL_UNUSED PIELIGHT *pColours) { PIELIGHT col = WZCOL_GREEN; UDWORD x = xOffset + psWidget->x; UDWORD y = yOffset + psWidget->y; pie_BoxFill(x, y, x + psWidget->width, y + psWidget->height, col); pie_BoxFill(x + 2, y + 2, x + psWidget->width - 2, y + psWidget->height - 2, WZCOL_MENU_BACKGROUND); }
// //////////////////////////////////////////////////////////////////////////// static void displayLoadSaveEdit(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, WZ_DECL_UNUSED PIELIGHT *pColours) { UDWORD x = xOffset+psWidget->x; UDWORD y = yOffset+psWidget->y; UDWORD w = psWidget->width; UDWORD h = psWidget->height; pie_BoxFill(x, y, x + w, y + h, WZCOL_MENU_LOAD_BORDER); pie_BoxFill(x + 1, y + 1, x + w - 1, y + h - 1, WZCOL_MENU_BACKGROUND); }
/* Draw bottom tabs */ static void formDisplayBTabs(W_TABFORM *psForm,SDWORD x0, SDWORD y0, UDWORD width, UDWORD height, UDWORD number, UDWORD selected, UDWORD hilite, PIELIGHT *pColours,UDWORD TabType,UDWORD TabGap) { SDWORD x,x1, y1; UDWORD i; #if NO_DISPLAY_SINGLE_TABS if (number == 1) { /* Don't display single tabs */ return; } #endif x = x0 + 2; x1 = x + width - 2; y1 = y0 + height; for (i=0; i < number; i++) { if(psForm->pTabDisplay) { psForm->pTabDisplay((WIDGET*)psForm,TabType,WFORM_TABBOTTOM,i,i==selected,i==hilite,x,y0,width,height); } else { if (i == selected) { /* Fill in the tab */ pie_BoxFill(x + 1, y0, x1 - 1, y1 - 1, pColours[WCOL_BKGRND]); /* Draw the outline */ iV_Line(x,y0, x,y1-1, pColours[WCOL_LIGHT]); iV_Line(x,y1, x1-3,y1, pColours[WCOL_DARK]); iV_Line(x1-2,y1, x1,y1-2, pColours[WCOL_DARK]); iV_Line(x1,y1-3, x1,y0+1, pColours[WCOL_DARK]); } else { /* Fill in the tab */ pie_BoxFill(x + 1, y0 + 1, x1 - 1, y1 - 2, pColours[WCOL_BKGRND]); /* Draw the outline */ iV_Line(x,y0+1, x,y1-1, pColours[WCOL_LIGHT]); iV_Line(x+1,y1-1, x1-3,y1-1, pColours[WCOL_DARK]); iV_Line(x1-2,y1-1, x1,y1-3, pColours[WCOL_DARK]); iV_Line(x1,y1-4, x1,y0+1, pColours[WCOL_DARK]); } if (i == hilite) { /* Draw the hilite box */ iV_Box(x+2,y0+3, x1-3, y1-4, pColours[WCOL_HILITE]); } } x += width + TabGap; x1 += width + TabGap; } }
static void pie_DrawShadows(void) { const float width = pie_GetVideoBufferWidth(); const float height = pie_GetVideoBufferHeight(); pie_SetTexturePage(TEXPAGE_NONE); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glDepthFunc(GL_LESS); glDepthMask(GL_FALSE); glEnable(GL_STENCIL_TEST); ShadowStencilFunc(); glEnable(GL_CULL_FACE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glStencilMask(~0); glStencilFunc(GL_LESS, 0, ~0); glDisable(GL_DEPTH_TEST); PIELIGHT grey; grey.byte = { 0, 0, 0, 128 }; pie_BoxFill(0, 0, width, height, grey, REND_ALPHA); pie_SetRendMode(REND_OPAQUE); glDisable(GL_STENCIL_TEST); glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); scshapes.resize(0); }
/* Display a clickable form */ void formDisplayClickable(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, PIELIGHT *pColours) { UDWORD x0,y0,x1,y1; W_CLICKFORM *psForm; psForm = (W_CLICKFORM *)psWidget; x0 = psWidget->x + xOffset; y0 = psWidget->y + yOffset; x1 = x0 + psWidget->width; y1 = y0 + psWidget->height; /* Fill the background */ pie_BoxFill(x0 + 1, y0 + 1, x1 - 1, y1 - 1, pColours[WCOL_BKGRND]); /* Display the border */ if (psForm->state & (WCLICK_DOWN | WCLICK_LOCKED | WCLICK_CLICKLOCK)) { /* Form down */ iV_Line(x0,y1,x0,y0, pColours[WCOL_DARK]); iV_Line(x0,y0,x1,y0, pColours[WCOL_DARK]); iV_Line(x1,y0,x1,y1, pColours[WCOL_LIGHT]); iV_Line(x1,y1,x0,y1, pColours[WCOL_LIGHT]); } else { /* Form up */ iV_Line(x0,y1,x0,y0, pColours[WCOL_LIGHT]); iV_Line(x0,y0,x1,y0, pColours[WCOL_LIGHT]); iV_Line(x1,y0,x1,y1, pColours[WCOL_DARK]); iV_Line(x1,y1,x0,y1, pColours[WCOL_DARK]); } }
static void displayLoadBanner(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset) { PIELIGHT col; int x = xOffset + psWidget->x(); int y = yOffset + psWidget->y(); if(psWidget->pUserData) { col = WZCOL_GREEN; } else { col = WZCOL_MENU_LOAD_BORDER; } pie_BoxFill(x, y, x + psWidget->width(), y + psWidget->height(), col); pie_BoxFill(x + 2,y + 2, x + psWidget->width() - 2, y + psWidget->height() - 2, WZCOL_MENU_BACKGROUND); }
// //////////////////////////////////////////////////////////////////////////// // display a keymap on the interface. static void displayKeyMap(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, WZ_DECL_UNUSED PIELIGHT *pColours) { UDWORD x = xOffset+psWidget->x; UDWORD y = yOffset+psWidget->y; UDWORD w = psWidget->width; UDWORD h = psWidget->height; KEY_MAPPING *psMapping = (KEY_MAPPING*)psWidget->pUserData; char sKey[MAX_STR_LENGTH]; if(psMapping == selectedKeyMap) { pie_BoxFill(x, y, x + w, y + h, WZCOL_KEYMAP_ACTIVE); } else if(psMapping->status == KEYMAP_ALWAYS || psMapping->status == KEYMAP_ALWAYS_PROCESS) { // when user can't edit something... pie_BoxFill(x, y , x + w, y + h, WZCOL_KEYMAP_FIXED); } else { drawBlueBox(x,y,w,h); } // draw name iV_SetFont(font_regular); // font type iV_SetTextColour(WZCOL_FORM_TEXT); iV_DrawText(_(psMapping->pName), x + 2, y + (psWidget->height / 2) + 3); // draw binding keyMapToString(sKey, psMapping); // Check to see if key is on the numpad, if so tell user and change color if (psMapping->subKeyCode >= KEY_KP_0 && psMapping->subKeyCode <= KEY_KPENTER) { iV_SetTextColour(WZCOL_YELLOW); sstrcat(sKey, " (numpad)"); } iV_DrawText(sKey, x + 364, y + (psWidget->height / 2) + 3); }
/* Display a form */ void formDisplay(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, PIELIGHT *pColours) { UDWORD x0,y0,x1,y1; if (!(psWidget->style & WFORM_INVISIBLE)) { x0 = psWidget->x + xOffset; y0 = psWidget->y + yOffset; x1 = x0 + psWidget->width; y1 = y0 + psWidget->height; pie_BoxFill(x0 + 1, y0 + 1, x1 - 1, y1 - 1, pColours[WCOL_BKGRND]); iV_Line(x0,y1,x0,y0, pColours[WCOL_LIGHT]); iV_Line(x0,y0,x1,y0, pColours[WCOL_LIGHT]); iV_Line(x1,y0,x1,y1, pColours[WCOL_DARK]); iV_Line(x1,y1,x0,y1, pColours[WCOL_DARK]); } }
/* The slider display function */ void sliderDisplay(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, PIELIGHT *pColours) { W_SLIDER *psSlider; SWORD x0,y0, x1,y1; UWORD width = 0, height = 0; psSlider = (W_SLIDER *)psWidget; switch (psSlider->orientation) { case WSLD_LEFT: case WSLD_RIGHT: /* Draw the line */ x0 = (SWORD)(psSlider->x + xOffset + psSlider->barSize/(SWORD)2); y0 = (SWORD)(psSlider->y + yOffset + psSlider->height/(SWORD)2); x1 = (SWORD)(x0 + psSlider->width - psSlider->barSize); iV_Line(x0,y0, x1,y0, pColours[WCOL_DARK]); iV_Line(x0,y0+1, x1,y0+1, pColours[WCOL_LIGHT]); /* Now Draw the bar */ sliderGetBarBox(psSlider, &x0,&y0, &width,&height); x0 = (SWORD)(x0 + psSlider->x + xOffset); y0 = (SWORD)(y0 + psSlider->y + yOffset); x1 = (SWORD)(x0 + width); y1 = (SWORD)(y0 + height); pie_BoxFill(x0, y0, x1, y1, pColours[WCOL_BKGRND]); iV_Line(x0,y0, x1,y0, pColours[WCOL_LIGHT]); iV_Line(x0,y0, x0,y1, pColours[WCOL_LIGHT]); iV_Line(x1,y0, x1,y1, pColours[WCOL_DARK]); iV_Line(x0,y1, x1,y1, pColours[WCOL_DARK]); break; case WSLD_TOP: case WSLD_BOTTOM: /* Draw the line */ x0 = (SWORD)(psSlider->x + xOffset + psSlider->width/(SWORD)2); y0 = (SWORD)(psSlider->y + yOffset + psSlider->barSize/(SWORD)2); y1 = (SWORD)(y0 + psSlider->height - psSlider->barSize); iV_Line(x0,y0, x0,y1, pColours[WCOL_DARK]); iV_Line(x0+1,y0, x0+1,y1, pColours[WCOL_LIGHT]); /* Now Draw the bar */ sliderGetBarBox(psSlider, &x0,&y0, &width,&height); x0 = (SWORD)(x0 + psSlider->x + xOffset); y0 = (SWORD)(y0 + psSlider->y + yOffset); x1 = (SWORD)(x0 + width); y1 = (SWORD)(y0 + height); pie_BoxFill(x0, y0, x1, y1, pColours[WCOL_BKGRND]); iV_Line(x0,y0, x1,y0, pColours[WCOL_LIGHT]); iV_Line(x0,y0, x0,y1, pColours[WCOL_LIGHT]); iV_Line(x1,y0, x1,y1, pColours[WCOL_DARK]); iV_Line(x0,y1, x1,y1, pColours[WCOL_DARK]); break; } if (psSlider->state & SLD_HILITE) { x0 = (SWORD)(psWidget->x + xOffset - 2); y0 = (SWORD)(psWidget->y + yOffset - 2); x1 = (SWORD)(x0 + psWidget->width + 4); y1 = (SWORD)(y0 + psWidget->height + 4); iV_Line(x0,y0, x1,y0, pColours[WCOL_HILITE]); iV_Line(x1,y0, x1,y1, pColours[WCOL_HILITE]); iV_Line(x0,y1, x1,y1, pColours[WCOL_HILITE]); iV_Line(x0,y0, x0,y1, pColours[WCOL_HILITE]); } }
/* Display a button */ void buttonDisplay(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, PIELIGHT *pColours) { W_BUTTON *psButton; SDWORD x0,y0,x1,y1, fx,fy,fw; int CurrFontID; ASSERT(psWidget != NULL && pColours != NULL, "Invalid pointers"); if (!psWidget || !pColours) { return; } psButton = (W_BUTTON *)psWidget; CurrFontID = psButton->FontID; x0=psButton->x + xOffset; y0=psButton->y + yOffset; x1=x0 + psButton->width; y1=y0 + psButton->height; if (psButton->state & (WBUTS_DOWN | WBUTS_LOCKED | WBUTS_CLICKLOCK)) { /* Display the button down */ pie_BoxFill(x0, y0, x1, y1, pColours[WCOL_BKGRND]); iV_Line(x0,y0, x1,y0, pColours[WCOL_DARK]); iV_Line(x0,y0, x0,y1, pColours[WCOL_DARK]); iV_Line(x0,y1, x1,y1, pColours[WCOL_LIGHT]); iV_Line(x1,y1, x1,y0, pColours[WCOL_LIGHT]); if (psButton->pText) { iV_SetFont(psButton->FontID); iV_SetTextColour(pColours[WCOL_TEXT]); fw = iV_GetTextWidth(psButton->pText); if(psButton->style & WBUT_NOCLICKMOVE) { fx = x0 + (psButton->width - fw) / 2 + 1; fy = y0 + 1 + (psButton->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); } else { fx = x0 + (psButton->width - fw) / 2; fy = y0 + (psButton->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); } iV_DrawText(psButton->pText,fx,fy); } if (psButton->state & WBUTS_HILITE) { /* Display the button hilite */ iV_Line(x0+3,y0+3, x1-2,y0+3, pColours[WCOL_HILITE]); iV_Line(x0+3,y0+3, x0+3,y1-2, pColours[WCOL_HILITE]); iV_Line(x0+3,y1-2, x1-2,y1-2, pColours[WCOL_HILITE]); iV_Line(x1-2,y1-2, x1-2,y0+3, pColours[WCOL_HILITE]); } } else if (psButton->state & WBUTS_GREY) { /* Display the disabled button */ pie_BoxFill(x0, y0, x1, y1, pColours[WCOL_BKGRND]); iV_Line(x0,y0, x1,y0, pColours[WCOL_LIGHT]); iV_Line(x0,y0, x0,y1, pColours[WCOL_LIGHT]); iV_Line(x0,y1, x1,y1, pColours[WCOL_DARK]); iV_Line(x1,y1, x1,y0, pColours[WCOL_DARK]); if (psButton->pText) { iV_SetFont(psButton->FontID); fw = iV_GetTextWidth(psButton->pText); fx = x0 + (psButton->width - fw) / 2; fy = y0 + (psButton->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); iV_SetTextColour(pColours[WCOL_LIGHT]); iV_DrawText(psButton->pText, fx+1, fy+1); iV_SetTextColour(pColours[WCOL_DISABLE]); iV_DrawText(psButton->pText, fx, fy); } if (psButton->state & WBUTS_HILITE) { /* Display the button hilite */ iV_Line(x0+2,y0+2, x1-3,y0+2, pColours[WCOL_HILITE]); iV_Line(x0+2,y0+2, x0+2,y1-3, pColours[WCOL_HILITE]); iV_Line(x0+2,y1-3, x1-3,y1-3, pColours[WCOL_HILITE]); iV_Line(x1-3,y1-3, x1-3,y0+2, pColours[WCOL_HILITE]); } } else { /* Display the button up */ pie_BoxFill(x0, y0, x1, y1, pColours[WCOL_BKGRND]); iV_Line(x0,y0, x1,y0, pColours[WCOL_LIGHT]); iV_Line(x0,y0, x0,y1, pColours[WCOL_LIGHT]); iV_Line(x0,y1, x1,y1, pColours[WCOL_DARK]); iV_Line(x1,y1, x1,y0, pColours[WCOL_DARK]); if (psButton->pText) { iV_SetFont(psButton->FontID); iV_SetTextColour(pColours[WCOL_TEXT]); fw = iV_GetTextWidth(psButton->pText); fx = x0 + (psButton->width - fw) / 2; fy = y0 + (psButton->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); iV_DrawText(psButton->pText, fx, fy); } if (psButton->state & WBUTS_HILITE) { /* Display the button hilite */ iV_Line(x0+2,y0+2, x1-3,y0+2, pColours[WCOL_HILITE]); iV_Line(x0+2,y0+2, x0+2,y1-3, pColours[WCOL_HILITE]); iV_Line(x0+2,y1-3, x1-3,y1-3, pColours[WCOL_HILITE]); iV_Line(x1-3,y1-3, x1-3,y0+2, pColours[WCOL_HILITE]); } } }
/* The trough bar graph display function */ void barGraphDisplayTrough(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset) { SDWORD x0 = 0, y0 = 0, x1 = 0, y1 = 0; // Position of the bar SDWORD tx0 = 0, ty0 = 0, tx1 = 0, ty1 = 0; // Position of the trough bool showBar = true, showTrough = true; W_BARGRAPH *psBGraph = (W_BARGRAPH *)psWidget; /* figure out which way the bar graph fills */ switch (psBGraph->barPos) { case WBAR_LEFT: x0 = xOffset + psWidget->x(); y0 = yOffset + psWidget->y(); x1 = x0 + psWidget->width() * psBGraph->majorSize / WBAR_SCALE; y1 = y0 + psWidget->height(); if (x0 == x1) { showBar = false; } tx0 = x1 + 1; ty0 = y0; tx1 = x0 + psWidget->width(); ty1 = y1; if (tx0 >= tx1) { showTrough = false; } break; case WBAR_RIGHT: y0 = yOffset + psWidget->y(); x1 = xOffset + psWidget->x() + psWidget->width(); x0 = x1 - psWidget->width() * psBGraph->majorSize / WBAR_SCALE; y1 = y0 + psWidget->height(); if (x0 == x1) { showBar = false; } tx0 = xOffset + psWidget->x(); ty0 = y0; tx1 = x0 - 1; ty1 = y1; if (tx0 >= tx1) { showTrough = false; } break; case WBAR_TOP: x0 = xOffset + psWidget->x(); y0 = yOffset + psWidget->y(); x1 = x0 + psWidget->width(); y1 = y0 + psWidget->height() * psBGraph->majorSize / WBAR_SCALE; if (y0 == y1) { showBar = false; } tx0 = x0; ty0 = y1 + 1; tx1 = x1; ty1 = y0 + psWidget->height(); if (ty0 >= ty1) { showTrough = false; } break; case WBAR_BOTTOM: x0 = xOffset + psWidget->x(); x1 = x0 + psWidget->width(); y1 = yOffset + psWidget->y() + psWidget->height(); y0 = y1 - psWidget->height() * psBGraph->majorSize / WBAR_SCALE; if (y0 == y1) { showBar = false; } tx0 = x0; ty0 = yOffset + psWidget->y(); tx1 = x1; ty1 = y0 - 1; if (ty0 >= ty1) { showTrough = false; } break; } /* Now draw the graph */ if (showBar) { pie_BoxFill(x0, y0, x1, y1, psBGraph->majorCol); } if (showTrough) { iV_ShadowBox(tx0, ty0, tx1, ty1, 0, WZCOL_FORM_DARK, WZCOL_FORM_LIGHT, psBGraph->backgroundColour); } barGraphDisplayText(psBGraph, x0, tx1, ty1); }
void scoreDataToScreen(WIDGET *psWidget, ScoreDataToScreenCache& cache) { int index, x, y, width, height; bool bMoreBars; if (!bDispStarted) { bDispStarted = true; dispST = realTime; audio_PlayTrack(ID_SOUND_BUTTON_CLICK_5); } fillUpStats(); pie_UniTransBoxFill(16 + D_W, MT_Y_POS - 16, pie_GetVideoBufferWidth() - D_W - 16, MT_Y_POS + 256 + 16, WZCOL_SCORE_BOX); iV_Box(16 + D_W, MT_Y_POS - 16, pie_GetVideoBufferWidth() - D_W - 16, MT_Y_POS + 256 + 16, WZCOL_SCORE_BOX_BORDER); cache.wzLabelText_UnitLosses.setText(_("Unit Losses"), font_regular); cache.wzLabelText_UnitLosses.render(LC_X + D_W, 80 + 16 + D_H, WZCOL_FORM_TEXT); cache.wzLabelText_StructureLosses.setText(_("Structure Losses"), font_regular); cache.wzLabelText_StructureLosses.render(LC_X + D_W, 140 + 16 + D_H, WZCOL_FORM_TEXT); cache.wzLabelText_ForceInformation.setText(_("Force Information"), font_regular); cache.wzLabelText_ForceInformation.render(LC_X + D_W, 200 + 16 + D_H, WZCOL_FORM_TEXT); index = 0; bMoreBars = true; while (bMoreBars) { /* Is it time to display this bar? */ if (infoBars[index].bActive) { /* Has it been queued before? */ if (infoBars[index].bQueued == false) { /* Don't do this next time...! */ infoBars[index].bQueued = true; /* Play a sound */ audio_PlayTrack(ID_SOUND_BUTTON_CLICK_5); } x = infoBars[index].topX + D_W; y = infoBars[index].topY + D_H; width = infoBars[index].width; height = infoBars[index].height; iV_Box(x, y, x + width, y + height, WZCOL_BLACK); /* Draw the background border box */ pie_BoxFill(x - 1, y - 1, x + width + 1, y + height + 1, WZCOL_MENU_BACKGROUND); /* Draw the interior grey */ pie_BoxFill(x, y, x + width, y + height, WZCOL_MENU_SCORES_INTERIOR); if (((realTime - dispST) > infoBars[index].queTime)) { /* Now draw amount filled */ const float mul = (realTime - dispST < BAR_CRAWL_TIME) ? (float)(realTime - dispST) / (float)BAR_CRAWL_TIME : 1.f; const float length = (float)infoBars[index].percent / 100.f * (float)infoBars[index].width * mul; if ((int)length > 4) { /* Black shadow */ pie_BoxFill(x + 1, y + 3, x + length - 1, y + height - 1, WZCOL_MENU_SHADOW); /* Solid coloured bit */ pie_BoxFill(x + 1, y + 2, x + length - 4, y + height - 4, getColour(index)); } } /* Now render the text by the bar */ sprintf(text, getDescription((MR_STRING)infoBars[index].stringID), infoBars[index].number); if (index >= cache.wzInfoBarText.size()) { cache.wzInfoBarText.resize(index + 1); } cache.wzInfoBarText[index].setText(text, font_regular); cache.wzInfoBarText[index].render(x + width + 16, y + 12, WZCOL_FORM_TEXT); /* If we're beyond STAT_ROOKIE, then we're on rankings */ if (index >= STAT_GREEN && index <= STAT_ACE) { iV_DrawImage(IntImages, (UWORD)(IMAGE_LEV_0 + (index - STAT_GREEN)), x - 8, y + 2); } } /* Move onto the next bar */ index++; if ((index > STAT_ACE) || (infoBars[index].topX == 0 && infoBars[index].topY == 0)) { bMoreBars = false; } } /* We now need to display the mission time, game time, average unit experience level an number of artefacts found */ /* Firstly, top of the screen, number of artefacts found */ sprintf(text, _("ARTIFACTS RECOVERED: %d"), missionData.artefactsFound); cache.wzInfoText_ArtifactsFound.setText(text, font_regular); cache.wzInfoText_ArtifactsFound.render((pie_GetVideoBufferWidth() - cache.wzInfoText_ArtifactsFound.width()) / 2, 300 + D_H, WZCOL_FORM_TEXT); /* Get the mission result time in a string - and write it out */ getAsciiTime((char *)&text2, gameTime - missionData.missionStarted); sprintf(text, _("Mission Time - %s"), text2); cache.wzInfoText_MissionTime.setText(text, font_regular); cache.wzInfoText_MissionTime.render((pie_GetVideoBufferWidth() - cache.wzInfoText_MissionTime.width()) / 2, 320 + D_H, WZCOL_FORM_TEXT); /* Write out total game time so far */ getAsciiTime((char *)&text2, gameTime); sprintf(text, _("Total Game Time - %s"), text2); cache.wzInfoText_TotalGameTime.setText(text, font_regular); cache.wzInfoText_TotalGameTime.render((pie_GetVideoBufferWidth() - cache.wzInfoText_TotalGameTime.width()) / 2, 340 + D_H, WZCOL_FORM_TEXT); if (Cheated) { // A quick way to flash the text PIELIGHT cheatedTextColor = ((realTime / 250) % 2) ? WZCOL_RED : WZCOL_YELLOW; sprintf(text, "%s", _("You cheated!")); cache.wzInfoText_Cheated.setText(text, font_regular); cache.wzInfoText_Cheated.render((pie_GetVideoBufferWidth() - cache.wzInfoText_Cheated.width()) / 2, 360 + D_H, cheatedTextColor); } }
// ----------------------------------------------------------------------------------- static void drawStatBars(void) { UDWORD index; bool bMoreBars; UDWORD x,y; UDWORD width,height; if(!bDispStarted) { bDispStarted = true; dispST = gameTime2; audio_PlayTrack(ID_SOUND_BUTTON_CLICK_5); } fillUpStats(); pie_UniTransBoxFill(16 + D_W, MT_Y_POS - 16, pie_GetVideoBufferWidth() - D_W - 16, MT_Y_POS + 256+16, WZCOL_SCORE_BOX); iV_Box(16 + D_W, MT_Y_POS - 16, pie_GetVideoBufferWidth() - D_W - 16, MT_Y_POS + 256+16, WZCOL_SCORE_BOX_BORDER); iV_DrawText( _("Unit Losses"), LC_X + D_W, 80 + 16 + D_H ); iV_DrawText( _("Structure Losses"), LC_X + D_W, 140 + 16 + D_H ); iV_DrawText( _("Force Information"), LC_X + D_W, 200 + 16 + D_H ); index = 0; bMoreBars = true; while(bMoreBars) { /* Is it time to display this bar? */ if( infoBars[index].bActive) { /* Has it been queued before? */ if(infoBars[index].bQueued == false) { /* Don't do this next time...! */ infoBars[index].bQueued = true; /* Play a sound */ // audio_PlayTrack(ID_SOUND_BUTTON_CLICK_5); } x = infoBars[index].topX+D_W; y = infoBars[index].topY+D_H; width = infoBars[index].width; height = infoBars[index].height; iV_Box(x, y, x + width, y + height, WZCOL_BLACK); /* Draw the background border box */ pie_BoxFill(x - 1, y - 1, x + width + 1, y + height + 1, WZCOL_MENU_BACKGROUND); /* Draw the interior grey */ pie_BoxFill(x, y, x + width, y + height, WZCOL_MENU_SCORES_INTERIOR); if( ((gameTime2 - dispST) > infoBars[index].queTime) ) { /* Now draw amount filled */ const float mul = (gameTime2 - dispST < BAR_CRAWL_TIME) ? (float)(gameTime2 - dispST) / (float)BAR_CRAWL_TIME : 1.f; const float length = (float)infoBars[index].percent / 100.f * (float)infoBars[index].width * mul; if((int)length > 4) { /* Black shadow */ pie_BoxFill(x + 1, y + 3, x + length - 1, y + height - 1, WZCOL_MENU_SHADOW); /* Solid coloured bit */ pie_BoxFill(x + 1, y + 2, x + length - 4, y + height - 4, getColour(index)); } } /* Now render the text by the bar */ sprintf(text, getDescription((MR_STRING)infoBars[index].stringID), infoBars[index].number); iV_DrawText(text, x + width + 16, y + 12); /* If we're beyond STAT_ROOKIE, then we're on rankings */ if(index>=STAT_GREEN && index <= STAT_ACE) { iV_DrawImage(IntImages,(UWORD)(IMAGE_LEV_0 + (index - STAT_GREEN)),x-8,y+2); } } /* Move onto the next bar */ index++; if(infoBars[index].topX == 0 && infoBars[index].topY == 0) { bMoreBars = false; } } dispAdditionalInfo(); }
/* Draw top tabs */ static void formDisplayTTabs(W_TABFORM *psForm,SDWORD x0, SDWORD y0, UDWORD width, UDWORD height, UDWORD number, UDWORD selected, UDWORD hilite, PIELIGHT *pColours,UDWORD TabType,UDWORD TabGap) { SDWORD x,x1, y1; UDWORD i, drawnumber; #if NO_DISPLAY_SINGLE_TABS if (number == 1) { /* Don't display single tabs */ return; } #endif x = x0 + 2; x1 = x + width - 2; y1 = y0 + height; if (number > psForm->maxTabsShown) //we can display 8 tabs fine with no extra voodoo. { // We do NOT want to draw all the tabs once we have drawn 7 tabs // Both selected & hilite are converted from virtual tab range, to a range // that is seen on the form itself. This would be 0-6 (7 tabs) // We also fix drawnumber, so we don't display too many tabs since the pages // will be empty. drawnumber = (number - (( psForm->TabMultiplier -1) * psForm->maxTabsShown)); if (drawnumber > psForm->maxTabsShown) drawnumber = psForm->maxTabsShown ; selected = (selected % psForm->maxTabsShown); //Go from Virtual range, to our range if(hilite != 65535) //sigh. Don't blame me for this!It is THEIR 'hack'. hilite = hilite % psForm->maxTabsShown; //we want to hilite tab 0 - 6. } else { // normal draw drawnumber = number; } for (i=0; i < drawnumber; i++) { if(psForm->pTabDisplay) { psForm->pTabDisplay((WIDGET*)psForm,TabType,WFORM_TABTOP,i,i==selected,i==hilite,x,y0,width,height); } else { if (i == selected) { /* Fill in the tab */ pie_BoxFill(x + 1, y0 + 1, x1 - 1, y1, pColours[WCOL_BKGRND]); /* Draw the outline */ iV_Line(x,y0+2, x,y1-1, pColours[WCOL_LIGHT]); iV_Line(x,y0+2, x+2,y0, pColours[WCOL_LIGHT]); iV_Line(x+2,y0, x1-1,y0, pColours[WCOL_LIGHT]); iV_Line(x1,y0+1, x1,y1, pColours[WCOL_DARK]); } else { /* Fill in the tab */ pie_BoxFill(x + 1, y0 + 2, x1 - 1, y1 - 1, pColours[WCOL_BKGRND]); /* Draw the outline */ iV_Line(x,y0+3, x,y1-1, pColours[WCOL_LIGHT]); iV_Line(x,y0+3, x+2,y0+1, pColours[WCOL_LIGHT]); iV_Line(x+2,y0+1, x1-1,y0+1, pColours[WCOL_LIGHT]); iV_Line(x1,y0+2, x1,y1-1, pColours[WCOL_DARK]); } if (i == hilite) { /* Draw the hilite box */ iV_Box(x+2,y0+4, x1-3, y1-3, pColours[WCOL_HILITE]); } } x += width + TabGap; x1 += width + TabGap; } }
/* Update and possibly display the tip */ void tipDisplay() { SDWORD newMX, newMY; SDWORD currTime; SDWORD fw, topGap; switch (tipState) { case TIP_WAIT: /* See if the tip has to be shown */ newMX = mouseX(); newMY = mouseY(); currTime = wzGetTicks(); if (newMX == mx && newMY == my && (currTime - startTime > TIP_PAUSE)) { /* Activate the tip */ tipState = TIP_ACTIVE; /* Calculate the size of the tip box */ topGap = TIP_VGAP; iV_SetFont(FontID); lineHeight = iV_GetTextLineSize(); fw = 0; for (int n = 0; n < pTip.size(); ++n) { fw = std::max<int>(fw, iV_GetTextWidth(pTip[n].toUtf8().constData())); } tw = fw + TIP_HGAP * 2; th = topGap * 2 + lineHeight * pTip.size() + iV_GetTextBelowBase(); /* Position the tip box */ tx = clip(wx + ww / 2, 0, screenWidth - tw - 1); ty = std::max(wy + wh + TIP_VGAP, 0); if (ty + th >= (int)screenHeight) { /* Position the tip above the button */ ty = wy - th - TIP_VGAP; } /* Position the text */ fx = tx + TIP_HGAP; fy = ty + (th - lineHeight * pTip.size()) / 2 - iV_GetTextAboveBase(); /* Note the time */ startTime = wzGetTicks(); } else if (newMX != mx || newMY != my || mousePressed(MOUSE_LMB)) { mx = newMX; my = newMY; startTime = currTime; } break; case TIP_ACTIVE: /* Draw the tool tip */ pie_BoxFill(tx, ty, tx + tw, ty + th, WZCOL_FORM_TIP_BACKGROUND); iV_Line(tx + 1, ty + th - 2, tx + 1, ty + 1, WZCOL_FORM_DARK); iV_Line(tx + 2, ty + 1, tx + tw - 2, ty + 1, WZCOL_FORM_DARK); iV_Line(tx, ty + th, tx + tw, ty + th, WZCOL_FORM_DARK); iV_Line(tx + tw, ty + th - 1, tx + tw, ty, WZCOL_FORM_DARK); iV_Box(tx, ty, tx + tw - 1, ty + th - 1, WZCOL_FORM_LIGHT); iV_SetFont(FontID); iV_SetTextColour(TipColour); for (int n = 0; n < pTip.size(); ++n) { iV_DrawText(pTip[n].toUtf8().constData(), fx, fy + lineHeight * n); } break; default: break; } }
void drawBlueBox(UDWORD x,UDWORD y, UDWORD w, UDWORD h) { pie_BoxFill(x - 1, y - 1, x + w + 1, y + h + 1, WZCOL_MENU_BORDER); pie_BoxFill(x, y , x + w, y + h, WZCOL_MENU_BACKGROUND); }
/* The edit box display function */ void editBoxDisplay(WIDGET *psWidget, UDWORD xOffset, UDWORD yOffset, PIELIGHT *pColours) { W_EDITBOX *psEdBox; SDWORD x0,y0,x1,y1, fx,fy, cx,cy; enum iV_fonts CurrFontID; #if CURSOR_BLINK bool blink; #endif psEdBox = (W_EDITBOX *)psWidget; CurrFontID = psEdBox->FontID; x0=psEdBox->x + xOffset; y0=psEdBox->y + yOffset; x1=x0 + psEdBox->width; y1=y0 + psEdBox->height; if(psEdBox->pBoxDisplay) { psEdBox->pBoxDisplay((WIDGET *)psEdBox, xOffset, yOffset, pColours); } else { pie_BoxFill(x0, y0, x1, y1, pColours[WCOL_BKGRND]); iV_Line(x0,y0, x1,y0, pColours[WCOL_DARK]); iV_Line(x0,y0, x0,y1, pColours[WCOL_DARK]); iV_Line(x0,y1, x1,y1, pColours[WCOL_LIGHT]); iV_Line(x1,y1, x1,y0, pColours[WCOL_LIGHT]); } fx = x0 + WEDB_XGAP;// + (psEdBox->width - fw) / 2; iV_SetFont(CurrFontID); iV_SetTextColour(pColours[WCOL_TEXT]); fy = y0 + (psEdBox->height - iV_GetTextLineSize())/2 - iV_GetTextAboveBase(); /* If there is more text than will fit into the box, display the bit with the cursor in it */ QString tmp = psEdBox->aText; tmp.remove(0, psEdBox->printStart); // Erase anything there isn't room to display. tmp.remove(psEdBox->printChars, tmp.length()); // if(psEdBox->pFontDisplay) { // psEdBox->pFontDisplay(fx,fy, pPrint); // } else { iV_DrawText(tmp.toUtf8().constData(), fx, fy); // } // Display the cursor if editing #if CURSOR_BLINK blink = !(((wzGetTicks() - psEdBox->blinkOffset)/WEDB_BLINKRATE) % 2); if ((psEdBox->state & WEDBS_MASK) == WEDBS_INSERT && blink) #else if ((psEdBox->state & WEDBS_MASK) == WEDBS_INSERT) #endif { // insert mode QString tmp = psEdBox->aText; tmp.remove(psEdBox->insPos, tmp.length()); // Erase from the cursor on, to find where the cursor should be. tmp.remove(0, psEdBox->printStart); cx = x0 + WEDB_XGAP + iV_GetTextWidth(tmp.toUtf8().constData()); cx += iV_GetTextWidth("-"); cy = fy; iV_Line(cx, cy + iV_GetTextAboveBase(), cx, cy - iV_GetTextBelowBase(), pColours[WCOL_CURSOR]); } #if CURSOR_BLINK else if ((psEdBox->state & WEDBS_MASK) == WEDBS_OVER && blink) #else else if ((psEdBox->state & WEDBS_MASK) == WEDBS_OVER) #endif { // overwrite mode QString tmp = psEdBox->aText; tmp.remove(psEdBox->insPos, tmp.length()); // Erase from the cursor on, to find where the cursor should be. tmp.remove(0, psEdBox->printStart); cx = x0 + WEDB_XGAP + iV_GetTextWidth(tmp.toUtf8().constData()); cy = fy; iV_Line(cx, cy, cx + WEDB_CURSORSIZE, cy, pColours[WCOL_CURSOR]); } if(psEdBox->pBoxDisplay == NULL) { if (psEdBox->state & WEDBS_HILITE) { /* Display the button hilite */ iV_Line(x0-2,y0-2, x1+2,y0-2, pColours[WCOL_HILITE]); iV_Line(x0-2,y0-2, x0-2,y1+2, pColours[WCOL_HILITE]); iV_Line(x0-2,y1+2, x1+2,y1+2, pColours[WCOL_HILITE]); iV_Line(x1+2,y1+2, x1+2,y0-2, pColours[WCOL_HILITE]); } } }
// 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 ); } }