/** * Display map completion time and par, or "sucks" message if overflow. */ static void drawTime(int x, int y, int t) { patchinfo_t info; if(t < 0) return; if(t <= 61 * 59) { int seconds = t % 60, minutes = t / 60 % 60; char buf[20]; x -= 22; FR_DrawCharXY3(':', x, y, ALIGN_TOPLEFT, DTF_NO_TYPEIN); if(minutes > 0) { dd_snprintf(buf, 20, "%d", minutes); FR_DrawTextXY3(buf, x, y, ALIGN_TOPRIGHT, DTF_NO_TYPEIN); } dd_snprintf(buf, 20, "%02d", seconds); FR_DrawTextXY3(buf, x+FR_CharWidth(':'), y, ALIGN_TOPLEFT, DTF_NO_TYPEIN); return; } // "sucks" if(!R_GetPatchInfo(pSucks, &info)) return; WI_DrawPatchXY3(pSucks, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pSucks), x - info.geometry.size.width, y, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); }
static void drawLocationMarks(void) { if((gameModeBits & GM_ANY_DOOM) && wbs->episode < 3) { DGL_Enable(DGL_TEXTURE_2D); DGL_Color4f(1, 1, 1, 1); FR_SetFont(FID(GF_FONTB)); FR_LoadDefaultAttrib(); // Draw a splat on taken cities. { int i, last = (wbs->currentMap == 8) ? wbs->nextMap-1 : wbs->currentMap; for(i = 0; i <= last; ++i) { drawPatchIfFits(pSplat, &locations[wbs->episode][i]); }} // Splat the secret map? if(wbs->didSecret) { drawPatchIfFits(pSplat, &locations[wbs->episode][8]); } if(drawYouAreHere) { const Point2Raw* origin = &locations[wbs->episode][wbs->nextMap]; patchid_t patchId = chooseYouAreHerePatch(origin); if(0 != patchId) { WI_DrawPatch3(patchId, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, patchId), origin, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); } } DGL_Disable(DGL_TEXTURE_2D); } }
static void drawBackground(void) { DGL_Enable(DGL_TEXTURE_2D); DGL_Color4f(1, 1, 1, 1); GL_DrawPatchXY3(pBackground, 0, 0, ALIGN_TOPLEFT, DPF_NO_OFFSET); if(!(gameModeBits & GM_ANY_DOOM2) && wbs->episode < 3) { patchid_t patchId; int i; FR_SetFont(FID(GF_FONTB)); FR_LoadDefaultAttrib(); for(i = 0; i < animCounts[wbs->episode]; ++i) { wianimdef_t const *def = &animDefs[wbs->episode][i]; wianimstate_t *state = &animStates[i]; // Has the animation begun yet? if(state->frame < 0) continue; patchId = state->patches[state->frame]; WI_DrawPatch3(patchId, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, patchId), &def->origin, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); } } DGL_Disable(DGL_TEXTURE_2D); }
static void drawEnteringTitle(void) { int x = SCREENWIDTH/2, y = WI_TITLEY; char* mapName = NULL; uint mapNum; ddmapinfo_t minfo; patchid_t patchId; patchinfo_t info; AutoStr* mapPath; Uri* mapUri; /// @kludge We need to properly externalize the map progression. if((gameModeBits & (GM_DOOM2|GM_DOOM2_PLUT|GM_DOOM2_TNT)) && wbs->nextMap == 30) { return; } /// kludge end. // See if there is a map name. mapUri = G_ComposeMapUri(wbs->episode, wbs->nextMap); mapPath = Uri_Compose(mapUri); if(Def_Get(DD_DEF_MAP_INFO, Str_Text(mapPath), &minfo) && minfo.name) { if(Def_Get(DD_DEF_TEXT, minfo.name, &mapName) == -1) mapName = minfo.name; } Uri_Delete(mapUri); // Skip the E#M# or Map #. if(mapName) { char* ptr = strchr(mapName, ':'); if(ptr) { mapName = M_SkipWhite(ptr + 1); } } DGL_Enable(DGL_TEXTURE_2D); DGL_Color4f(1, 1, 1, 1); FR_SetFont(FID(GF_FONTB)); FR_LoadDefaultAttrib(); FR_SetColorAndAlpha(defFontRGB2[CR], defFontRGB2[CG], defFontRGB2[CB], 1); // Draw "Entering" WI_DrawPatchXY3(pEntering, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pEntering), x, y, ALIGN_TOP, 0, DTF_NO_TYPEIN); if(R_GetPatchInfo(pMapNames[wbs->nextMap], &info)) y += (5 * info.geometry.size.height) / 4; // Draw map. mapNum = (wbs->episode * 9) + wbs->nextMap; patchId = (mapNum < pMapNamesSize? pMapNames[mapNum] : 0); FR_SetColorAndAlpha(defFontRGB[CR], defFontRGB[CG], defFontRGB[CB], 1); WI_DrawPatchXY3(patchId, Hu_ChoosePatchReplacement2(cfg.inludePatchReplaceMode, patchId, mapName), x, y, ALIGN_TOP, 0, DTF_NO_TYPEIN); DGL_Disable(DGL_TEXTURE_2D); }
static void drawPatchIfFits(patchid_t patchId, const Point2Raw* origin) { assert(origin); if(patchFits(patchId, origin->x, origin->y)) { WI_DrawPatch3(patchId, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, patchId), origin, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); } }
static void drawSinglePlayerStats(void) { int lh; lh = (3 * FR_CharHeight('0')) / 2; // Line height. DGL_Enable(DGL_TEXTURE_2D); DGL_Color4f(1, 1, 1, 1); FR_SetFont(FID(GF_FONTB)); FR_LoadDefaultAttrib(); FR_SetColorAndAlpha(defFontRGB2[CR], defFontRGB2[CG], defFontRGB2[CB], 1); WI_DrawPatchXY3(pKills, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pKills), SP_STATSX, SP_STATSY, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); WI_DrawPatchXY3(pItems, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pItems), SP_STATSX, SP_STATSY + lh, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); WI_DrawPatchXY3(pSecretSP, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pSecretSP), SP_STATSX, SP_STATSY + 2 * lh, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); WI_DrawPatchXY3(pTime, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pTime), SP_TIMEX, SP_TIMEY, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); if(wbs->parTime != -1) { WI_DrawPatchXY3(pPar, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pPar), SCREENWIDTH / 2 + SP_TIMEX, SP_TIMEY, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); } FR_SetFont(FID(GF_SMALL)); drawPercent(SCREENWIDTH - SP_STATSX, SP_STATSY, cntKills[0]); drawPercent(SCREENWIDTH - SP_STATSX, SP_STATSY + lh, cntItems[0]); drawPercent(SCREENWIDTH - SP_STATSX, SP_STATSY + 2 * lh, cntSecret[0]); if(cntTime >= 0) { drawTime(SCREENWIDTH / 2 - SP_TIMEX, SP_TIMEY, cntTime / TICRATE); } if(wbs->parTime != -1 && cntPar >= 0) { drawTime(SCREENWIDTH - SP_TIMEX, SP_TIMEY, cntPar / TICRATE); } DGL_Disable(DGL_TEXTURE_2D); }
void LabelWidget::draw() const { fontid_t fontId = mnRendState->textFonts[font()]; Vector4f const &textColor = mnRendState->textColors[color()]; // float t = (isFocused()? 1 : 0); // // Flash if focused. // if(isFocused() && cfg.common.menuTextFlashSpeed > 0) // { // float const speed = cfg.common.menuTextFlashSpeed / 2.f; // t = (1 + sin(page().timer() / (float)TICSPERSEC * speed * DD_PI)) / 2; // } // Vector4f const color = de::lerp(textColor, Vector4f(Vector3f(cfg.common.menuTextFlashColor), textColor.w), t); const Vector4f color = selectionFlashColor(textColor); const float fadeout = scrollingFadeout(); if (fadeout < .001f) return; DGL_Color4f(1, 1, 1, color.w * fadeout); FR_SetFont(fontId); FR_SetColorAndAlpha(color.x, color.y, color.z, color.w * fadeout); if (d->patch) { String replacement; if(!(d->flags & MNTEXT_NO_ALTTEXT)) { replacement = Hu_ChoosePatchReplacement(patchreplacemode_t(cfg.common.menuPatchReplaceMode), *d->patch, d->text); } DGL_Enable(DGL_TEXTURE_2D); WI_DrawPatch(*d->patch, replacement, geometry().topLeft, ALIGN_TOPLEFT, 0, Hu_MenuMergeEffectWithDrawTextFlags(0)); DGL_Disable(DGL_TEXTURE_2D); return; } DGL_Enable(DGL_TEXTURE_2D); FR_DrawTextXY3(d->text.toUtf8().constData(), geometry().topLeft.x, geometry().topLeft.y, ALIGN_TOPLEFT, Hu_MenuMergeEffectWithDrawTextFlags(0)); DGL_Disable(DGL_TEXTURE_2D); }
static void drawFinishedTitle(void) { int x = SCREENWIDTH/2, y = WI_TITLEY; patchid_t patchId; patchinfo_t info; char *mapName; uint mapNum; if(gameModeBits & (GM_ANY_DOOM2|GM_DOOM_CHEX)) mapNum = wbs->currentMap; else mapNum = (wbs->episode * 9) + wbs->currentMap; mapName = (char *) DD_GetVariable(DD_MAP_NAME); // Skip the E#M# or Map #. if(mapName) { char* ptr = strchr(mapName, ':'); if(ptr) { mapName = M_SkipWhite(ptr + 1); } } DGL_Enable(DGL_TEXTURE_2D); DGL_Color4f(1, 1, 1, 1); FR_SetFont(FID(GF_FONTB)); FR_LoadDefaultAttrib(); FR_SetColorAndAlpha(defFontRGB[CR], defFontRGB[CG], defFontRGB[CB], 1); // Draw <MapName> patchId = (mapNum < pMapNamesSize? pMapNames[mapNum] : 0); WI_DrawPatchXY3(patchId, Hu_ChoosePatchReplacement2(cfg.inludePatchReplaceMode, patchId, mapName), x, y, ALIGN_TOP, 0, DTF_NO_TYPEIN); if(R_GetPatchInfo(patchId, &info)) y += (5 * info.geometry.size.height) / 4; // Draw "Finished!" FR_SetColorAndAlpha(defFontRGB2[CR], defFontRGB2[CG], defFontRGB2[CB], 1); WI_DrawPatchXY3(pFinished, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pFinished), x, y, ALIGN_TOP, 0, DTF_NO_TYPEIN); DGL_Disable(DGL_TEXTURE_2D); }
static void drawNetgameStats(void) { #define ORIGINX (NG_STATSX + starWidth/2 + NG_STATSX*!doFrags) int i, x, y, starWidth, pwidth; patchinfo_t info; DGL_Enable(DGL_TEXTURE_2D); DGL_Color4f(1, 1, 1, 1); FR_SetFont(FID(GF_FONTB)); FR_LoadDefaultAttrib(); FR_SetColorAndAlpha(defFontRGB2[CR], defFontRGB2[CG], defFontRGB2[CB], 1); pwidth = FR_CharWidth('%'); R_GetPatchInfo(pFaceAlive, &info); starWidth = info.geometry.size.width; // Draw stat titles (top line). R_GetPatchInfo(pKills, &info); WI_DrawPatchXY3(pKills, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pKills), ORIGINX + NG_SPACINGX, NG_STATSY, ALIGN_TOPRIGHT, 0, DTF_NO_TYPEIN); y = NG_STATSY + info.geometry.size.height; WI_DrawPatchXY3(pItems, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pItems), ORIGINX + 2 * NG_SPACINGX, NG_STATSY, ALIGN_TOPRIGHT, 0, DTF_NO_TYPEIN); WI_DrawPatchXY3(pSecret, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pSecret), ORIGINX + 3 * NG_SPACINGX, NG_STATSY, ALIGN_TOPRIGHT, 0, DTF_NO_TYPEIN); if(doFrags) { WI_DrawPatchXY3(pFrags, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pFrags), ORIGINX + 4 * NG_SPACINGX, NG_STATSY, ALIGN_TOPRIGHT, 0, DTF_NO_TYPEIN); } // Draw stats. for(i = 0; i < NUMTEAMS; ++i) { patchinfo_t info; if(0 == teamInfo[i].playerCount) continue; FR_SetFont(FID(GF_FONTA)); FR_SetColorAndAlpha(1, 1, 1, 1); x = ORIGINX; R_GetPatchInfo(pTeamBackgrounds[i], &info); WI_DrawPatchXY3(pTeamBackgrounds[i], Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pTeamBackgrounds[i]), x - info.geometry.size.width, y, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); // If more than 1 member, show the member count. if(1 != teamInfo[i].playerCount) { char tmp[40]; sprintf(tmp, "%i", teamInfo[i].playerCount); FR_DrawTextXY3(tmp, x - info.geometry.size.width + 1, y + info.geometry.size.height - 8, ALIGN_TOPLEFT, DTF_NO_TYPEIN); } FR_SetColorAndAlpha(defFontRGB2[CR], defFontRGB2[CG], defFontRGB2[CB], 1); if(i == inPlayerTeam) WI_DrawPatchXY3(pFaceAlive, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pFaceAlive), x - info.geometry.size.width, y, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); x += NG_SPACINGX; FR_SetFont(FID(GF_SMALL)); drawPercent(x - pwidth, y + 10, cntKills[i]); x += NG_SPACINGX; drawPercent(x - pwidth, y + 10, cntItems[i]); x += NG_SPACINGX; drawPercent(x - pwidth, y + 10, cntSecret[i]); x += NG_SPACINGX; if(doFrags) { char buf[20]; dd_snprintf(buf, 20, "%i", cntFrags[i]); FR_DrawTextXY3(buf, x, y + 10, ALIGN_TOPRIGHT, DTF_NO_TYPEIN); } y += WI_SPACINGY; } DGL_Disable(DGL_TEXTURE_2D); #undef ORIGINX }
static void drawDeathmatchStats(void) { int i, j, x, y, w;// lh = WI_SPACINGY; // Line height. DGL_Enable(DGL_TEXTURE_2D); DGL_Color4f(1, 1, 1, 1); FR_SetFont(FID(GF_FONTB)); FR_LoadDefaultAttrib(); FR_SetColorAndAlpha(defFontRGB2[CR], defFontRGB2[CG], defFontRGB2[CB], 1); // Draw stat titles (top line). { patchinfo_t info; if(R_GetPatchInfo(pTotal, &info)) WI_DrawPatchXY3(pTotal, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pTotal), DM_TOTALSX - info.geometry.size.width / 2, DM_MATRIXY - WI_SPACINGY + 10, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); } WI_DrawPatchXY3(pKillers, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pKillers), DM_KILLERSX, DM_KILLERSY, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); WI_DrawPatchXY3(pVictims, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pVictims), DM_VICTIMSX, DM_VICTIMSY, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); x = DM_MATRIXX + DM_SPACINGX; y = DM_MATRIXY; for(i = 0; i < NUMTEAMS; ++i) { if(teamInfo[i].playerCount > 0) { patchid_t patchId = pTeamBackgrounds[i]; const char* replacement; patchinfo_t info; FR_SetColorAndAlpha(defFontRGB2[CR], defFontRGB2[CG], defFontRGB2[CB], 1); R_GetPatchInfo(patchId, &info); replacement = Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, patchId); WI_DrawPatchXY3(patchId, replacement, x - info.geometry.size.width / 2, DM_MATRIXY - WI_SPACINGY, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); WI_DrawPatchXY3(patchId, replacement, DM_MATRIXX - info.geometry.size.width / 2, y, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); if(i == inPlayerTeam) { WI_DrawPatchXY3(pFaceDead, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pFaceDead), x - info.geometry.size.width / 2, DM_MATRIXY - WI_SPACINGY, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); WI_DrawPatchXY3(pFaceAlive, Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, pFaceAlive), DM_MATRIXX - info.geometry.size.width / 2, y, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); } // If more than 1 member, show the member count. if(1 > teamInfo[i].playerCount) { char tmp[20]; sprintf(tmp, "%i", teamInfo[i].playerCount); FR_SetFont(FID(GF_FONTA)); FR_DrawTextXY3(tmp, x - info.geometry.size.width / 2 + 1, DM_MATRIXY - WI_SPACINGY + info.geometry.size.height - 8, ALIGN_TOPLEFT, DTF_NO_TYPEIN); FR_DrawTextXY3(tmp, DM_MATRIXX - info.geometry.size.width / 2 + 1, y + info.geometry.size.height - 8, ALIGN_TOPLEFT, DTF_NO_TYPEIN); } } else { patchid_t patchId = pTeamIcons[i]; const char* replacement = Hu_ChoosePatchReplacement(cfg.inludePatchReplaceMode, patchId); patchinfo_t info; FR_SetColorAndAlpha(defFontRGB[CR], defFontRGB[CG], defFontRGB[CB], 1); R_GetPatchInfo(patchId, &info); WI_DrawPatchXY3(patchId, replacement, x - info.geometry.size.width / 2, DM_MATRIXY - WI_SPACINGY + 10, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); WI_DrawPatchXY3(patchId, replacement, DM_MATRIXX - info.geometry.size.width / 2, y + 10, ALIGN_TOPLEFT, 0, DTF_NO_TYPEIN); } x += DM_SPACINGX; y += WI_SPACINGY; } // Draw stats. y = DM_MATRIXY + 10; FR_SetFont(FID(GF_SMALL)); FR_SetColorAndAlpha(defFontRGB2[CR], defFontRGB2[CG], defFontRGB2[CB], 1); w = FR_CharWidth('0'); for(i = 0; i < NUMTEAMS; ++i) { x = DM_MATRIXX + DM_SPACINGX; if(teamInfo[i].playerCount > 0) { char buf[20]; for(j = 0; j < NUMTEAMS; ++j) { if(teamInfo[j].playerCount > 0) { dd_snprintf(buf, 20, "%i", dmFrags[i][j]); FR_DrawTextXY3(buf, x + w, y, ALIGN_TOPRIGHT, DTF_NO_TYPEIN); } x += DM_SPACINGX; } dd_snprintf(buf, 20, "%i", dmTotals[i]); FR_DrawTextXY3(buf, DM_TOTALSX + w, y, ALIGN_TOPRIGHT, DTF_NO_TYPEIN); } y += WI_SPACINGY; } DGL_Disable(DGL_TEXTURE_2D); }