From 9e82bacdd27648d9494b8d1e13c3c7e7245ece8f Mon Sep 17 00:00:00 2001 From: James Haley Date: Sun, 19 Sep 2010 03:39:59 +0000 Subject: Massive work on the HUD. Multiline messages now work properly and are wrapped at or near the screen boundary. Subversion-branch: /branches/strife-branch Subversion-revision: 2113 --- src/strife/hu_lib.c | 367 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 245 insertions(+), 122 deletions(-) (limited to 'src/strife/hu_lib.c') diff --git a/src/strife/hu_lib.c b/src/strife/hu_lib.c index c7c62d06..dee1dbea 100644 --- a/src/strife/hu_lib.c +++ b/src/strife/hu_lib.c @@ -35,16 +35,82 @@ #include "hu_lib.h" #include "r_local.h" #include "r_draw.h" +#include "hu_stuff.h" // [STRIFE] // boolean : whether the screen is always erased #define noterased viewwindowx extern boolean automapactive; // in AM_map.c +extern boolean D_PatchClipCallback(patch_t *patch, int x, int y); // [STRIFE] + +extern patch_t* yfont[HU_FONTSIZE]; // haleyjd 09/18/10: [STRIFE] + +// +// HUlib_drawYellowText +// +// haleyjd 09/18/10: [STRIFE] New function. +// +void HUlib_drawYellowText(int x, int y, char *text) +{ + int start_x = x; + char *rover = text; + char c; + + while((c = *rover++)) + { + if(c == '\n') + { + x = start_x; + y += 12; + } + else if(c == '_' || c != ' ' || x != start_x) + { + c = toupper(c) - HU_FONTSTART; + + if(c >= 0 && c < HU_FONTSIZE) + { + patch_t *patch = yfont[c]; + int width = SHORT(patch->width); + + if(x + width <= (SCREENWIDTH - 20)) + { + // haleyjd: STRIFE-TODO: bit different than the exe... for now + if(!D_PatchClipCallback(patch, x + SHORT(patch->leftoffset), + y + SHORT(patch->topoffset))) + return; + V_DrawPatchDirect(x, y, patch); + x = x + width; + } + else + { + x = start_x; + --rover; + y += 12; + } + } + else + { + x += 4; + } + } + } +} + +// +// HUlib_init +// +// [STRIFE] Verified unmodified. +// void HUlib_init(void) { } +// +// HUlib_clearTextLine +// +// [STRIFE] Verified unmodified. +// void HUlib_clearTextLine(hu_textline_t* t) { t->len = 0; @@ -52,13 +118,18 @@ void HUlib_clearTextLine(hu_textline_t* t) t->needsupdate = true; } +// +// HUlib_initTextLine +// +// [STRIFE] Verified unmodified +// void HUlib_initTextLine -( hu_textline_t* t, - int x, - int y, - patch_t** f, - int sc ) +( hu_textline_t* t, + int x, + int y, + patch_t** f, + int sc ) { t->x = x; t->y = y; @@ -67,125 +138,142 @@ HUlib_initTextLine HUlib_clearTextLine(t); } +// +// HUlib_addCharToTextLine +// +// [STRIFE] Verified unmodified. +// boolean HUlib_addCharToTextLine -( hu_textline_t* t, - char ch ) +( hu_textline_t* t, + char ch ) { - if (t->len == HU_MAXLINELENGTH) - return false; + return false; else { - t->l[t->len++] = ch; - t->l[t->len] = 0; - t->needsupdate = 4; - return true; + t->l[t->len++] = ch; + t->l[t->len] = 0; + t->needsupdate = 4; + return true; } - } +// +// HUlib_delCharFromTextLine +// +// [STRIFE] Verified unmodified. +// boolean HUlib_delCharFromTextLine(hu_textline_t* t) { - if (!t->len) return false; else { - t->l[--t->len] = 0; - t->needsupdate = 4; - return true; + t->l[--t->len] = 0; + t->needsupdate = 4; + return true; } - } +// +// HUlib_drawTextLine +// +// haleyjd 09/18/10: [STRIFE] Modified to not draw underscores in text. +// void HUlib_drawTextLine -( hu_textline_t* l, - boolean drawcursor ) +( hu_textline_t* l, + boolean drawcursor ) { - - int i; - int w; - int x; - unsigned char c; + int i; + int w; + int x; + unsigned char c; // draw the new stuff x = l->x; - for (i=0;ilen;i++) + + for(i = 0; i < l->len; i++) { - c = toupper(l->l[i]); - if (c != ' ' - && c >= l->sc - && c <= '_') - { - w = SHORT(l->f[c - l->sc]->width); - if (x+w > SCREENWIDTH) - break; - V_DrawPatchDirect(x, l->y, l->f[c - l->sc]); - x += w; - } - else - { - x += 4; - if (x >= SCREENWIDTH) - break; - } + c = toupper(l->l[i]); + if (c != ' ' && c >= l->sc && c < '_') // [STRIFE]: Underscores excluded + { + w = SHORT(l->f[c - l->sc]->width); + if (x+w > SCREENWIDTH) + break; + V_DrawPatchDirect(x, l->y, l->f[c - l->sc]); + x += w; + } + else + { + x += 4; + if (x >= SCREENWIDTH) + break; + } } // draw the cursor if requested if (drawcursor - && x + SHORT(l->f['_' - l->sc]->width) <= SCREENWIDTH) + && x + SHORT(l->f['_' - l->sc]->width) <= SCREENWIDTH) { - V_DrawPatchDirect(x, l->y, l->f['_' - l->sc]); + V_DrawPatchDirect(x, l->y, l->f['_' - l->sc]); } } - +// +// HUlib_eraseTextLine +// // sorta called by HU_Erase and just better darn get things straight +// +// [STRIFE] Verified unmodified. +// void HUlib_eraseTextLine(hu_textline_t* l) { - int lh; - int y; - int yoffset; - static boolean lastautomapactive = true; + int lh; + int y; + int yoffset; + static boolean lastautomapactive = true; // Only erases when NOT in automap and the screen is reduced, // and the text must either need updating or refreshing // (because of a recent change back from the automap) if (!automapactive && - viewwindowx && l->needsupdate) + viewwindowx && l->needsupdate) { - lh = SHORT(l->f[0]->height) + 1; - for (y=l->y,yoffset=y*SCREENWIDTH ; yy+lh ; y++,yoffset+=SCREENWIDTH) - { - if (y < viewwindowy || y >= viewwindowy + viewheight) - R_VideoErase(yoffset, SCREENWIDTH); // erase entire line - else - { - R_VideoErase(yoffset, viewwindowx); // erase left border - R_VideoErase(yoffset + viewwindowx + viewwidth, viewwindowx); - // erase right border - } - } + lh = SHORT(l->f[0]->height) + 1; + for (y=l->y,yoffset=y*SCREENWIDTH ; yy+lh ; y++,yoffset+=SCREENWIDTH) + { + if (y < viewwindowy || y >= viewwindowy + viewheight) + R_VideoErase(yoffset, SCREENWIDTH); // erase entire line + else + { + R_VideoErase(yoffset, viewwindowx); // erase left border + R_VideoErase(yoffset + viewwindowx + viewwidth, viewwindowx); + // erase right border + } + } } lastautomapactive = automapactive; if (l->needsupdate) l->needsupdate--; - } +// +// HUlib_initSText +// +// [STRIFE] Verified unmodified. +// void HUlib_initSText -( hu_stext_t* s, - int x, - int y, - int h, - patch_t** font, - int startchar, - boolean* on ) +( hu_stext_t* s, + int x, + int y, + int h, + patch_t** font, + int startchar, + boolean* on ) { - int i; s->h = h; @@ -193,28 +281,37 @@ HUlib_initSText s->laston = true; s->cl = 0; for (i=0;il[i], - x, y - i*(SHORT(font[0]->height)+1), - font, startchar); - + { + HUlib_initTextLine(&s->l[i], + x, y - i*(SHORT(font[0]->height)+1), + font, startchar); + } } +// +// HUlib_addLineToSText +// +// [STRIFE] Verified unmodified. +// void HUlib_addLineToSText(hu_stext_t* s) { - int i; // add a clear line if (++s->cl == s->h) - s->cl = 0; + s->cl = 0; HUlib_clearTextLine(&s->l[s->cl]); // everything needs updating for (i=0 ; ih ; i++) - s->l[i].needsupdate = 4; - + s->l[i].needsupdate = 4; } +// +// HUlib_addMessageToSText +// +// [STRIFE] Verified unmodified. +// void HUlib_addMessageToSText ( hu_stext_t* s, @@ -223,59 +320,71 @@ HUlib_addMessageToSText { HUlib_addLineToSText(s); if (prefix) - while (*prefix) - HUlib_addCharToTextLine(&s->l[s->cl], *(prefix++)); + while (*prefix) + HUlib_addCharToTextLine(&s->l[s->cl], *(prefix++)); while (*msg) - HUlib_addCharToTextLine(&s->l[s->cl], *(msg++)); + HUlib_addCharToTextLine(&s->l[s->cl], *(msg++)); } +// +// HUlib_drawSText +// +// [STRIFE] Verified unmodified. +// void HUlib_drawSText(hu_stext_t* s) { int i, idx; hu_textline_t *l; if (!*s->on) - return; // if not on, don't draw + return; // if not on, don't draw // draw everything for (i=0 ; ih ; i++) { - idx = s->cl - i; - if (idx < 0) - idx += s->h; // handle queue of lines - - l = &s->l[idx]; - - // need a decision made here on whether to skip the draw - HUlib_drawTextLine(l, false); // no cursor, please - } + idx = s->cl - i; + if (idx < 0) + idx += s->h; // handle queue of lines + + l = &s->l[idx]; + // need a decision made here on whether to skip the draw + HUlib_drawTextLine(l, false); // no cursor, please + } } +// +// HUlib_eraseSText +// +// [STRIFE] Verified unmodified. +// void HUlib_eraseSText(hu_stext_t* s) { - int i; for (i=0 ; ih ; i++) { - if (s->laston && !*s->on) - s->l[i].needsupdate = 4; - HUlib_eraseTextLine(&s->l[i]); + if (s->laston && !*s->on) + s->l[i].needsupdate = 4; + HUlib_eraseTextLine(&s->l[i]); } s->laston = *s->on; - } +// +// HUlib_initIText +// +// [STRIFE] Verified unmodified. +// void HUlib_initIText -( hu_itext_t* it, - int x, - int y, - patch_t** font, - int startchar, - boolean* on ) +( hu_itext_t* it, + int x, + int y, + patch_t** font, + int startchar, + boolean* on ) { it->lm = 0; // default left margin is start of text it->on = on; @@ -285,37 +394,46 @@ HUlib_initIText // The following deletion routines adhere to the left margin restriction +// [STRIFE] Verified unmodified. void HUlib_delCharFromIText(hu_itext_t* it) { if (it->l.len != it->lm) - HUlib_delCharFromTextLine(&it->l); + HUlib_delCharFromTextLine(&it->l); } +// [STRIFE] Verified unmodified. void HUlib_eraseLineFromIText(hu_itext_t* it) { while (it->lm != it->l.len) - HUlib_delCharFromTextLine(&it->l); + HUlib_delCharFromTextLine(&it->l); } // Resets left margin as well +// [STRIFE] Verified unmodified. void HUlib_resetIText(hu_itext_t* it) { it->lm = 0; HUlib_clearTextLine(&it->l); } +// +// HUlib_addPrefixToIText +// +// [STRIFE] Verified unmodified. +// void HUlib_addPrefixToIText -( hu_itext_t* it, - char* str ) +( hu_itext_t* it, + char* str ) { while (*str) - HUlib_addCharToTextLine(&it->l, *(str++)); + HUlib_addCharToTextLine(&it->l, *(str++)); it->lm = it->l.len; } // wrapper function for handling general keyed input. // returns true if it ate the key +// [STRIFE] Verified unmodified. boolean HUlib_keyInIText ( hu_itext_t* it, @@ -324,33 +442,38 @@ HUlib_keyInIText ch = toupper(ch); if (ch >= ' ' && ch <= '_') - HUlib_addCharToTextLine(&it->l, (char) ch); - else - if (ch == KEY_BACKSPACE) - HUlib_delCharFromIText(it); - else - if (ch != KEY_ENTER) - return false; // did not eat key + HUlib_addCharToTextLine(&it->l, (char) ch); + else if (ch == KEY_BACKSPACE) + HUlib_delCharFromIText(it); + else if (ch != KEY_ENTER) + return false; // did not eat key return true; // ate the key - } +// +// HUlib_drawIText +// +// [STRIFE] Verified unmodified. +// void HUlib_drawIText(hu_itext_t* it) { - hu_textline_t *l = &it->l; if (!*it->on) - return; + return; HUlib_drawTextLine(l, true); // draw the line w/ cursor - } +// +// HUlib_eraseIText +// +// [STRIFE] Verified unmodified. +// void HUlib_eraseIText(hu_itext_t* it) { if (it->laston && !*it->on) - it->l.needsupdate = 4; + it->l.needsupdate = 4; HUlib_eraseTextLine(&it->l); it->laston = *it->on; } -- cgit v1.2.3