ref: 63903f9aac430d321a3063fbc79d61ccae6db22e
parent: 4c4a67ef7ad1b53d5b13e37e2ff3744320a0f1ac
author: James Haley <[email protected]>
date: Sun Feb 13 21:21:42 EST 2011
Fix to HUlib_drawYellowText (more Hex-Rays code-skipping shenanigans), and finished ST_drawKeysPopup for drawing keys (TODO: in deathmatch it draws frags instead). Fix to buffer overflow in V_ScreenShot - *ATTN fraggle* - needs fix in trunk! Subversion-branch: /branches/strife-branch Subversion-revision: 2265
--- a/src/strife/hu_lib.c
+++ b/src/strife/hu_lib.c
@@ -47,7 +47,7 @@
//
// HUlib_drawYellowText
//
-// haleyjd 09/18/10: [STRIFE] New function.
+// haleyjd 20100918: [STRIFE] New function.
//
void HUlib_drawYellowText(int x, int y, char *text)
{
@@ -61,36 +61,42 @@
{
x = start_x;
y += 12;
+ continue;
}
- else if(c == '_' || c != ' ' || x != start_x)
+
+ // haleyjd 20110213: found MORE code ignored/misinterpreted by Hex-Rays:
+ // Underscores are replaced by spaces.
+ if(c == '_')
+ c = ' ';
+ else if (c == ' ' && x == start_x) // skip spaces at the start of a line
+ continue;
+
+ c = toupper(c) - HU_FONTSTART;
+
+ if(c >= 0 && c < HU_FONTSIZE)
{
- c = toupper(c) - HU_FONTSTART;
+ patch_t *patch = yfont[(int) c];
+ int width = SHORT(patch->width);
- if(c >= 0 && c < HU_FONTSIZE)
+ if(x + width <= (SCREENWIDTH - 20))
{
- patch_t *patch = yfont[(int) 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;
- }
+ // 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 += 4;
+ x = start_x;
+ --rover;
+ y += 12;
}
+ }
+ else
+ {
+ x += 4;
}
}
}
--- a/src/strife/st_stuff.c
+++ b/src/strife/st_stuff.c
@@ -76,7 +76,6 @@
// STATUS BAR DATA
//
-
// Palette indices.
// For damage/bonus red-/gold-shifts
#define STARTREDPALS 1
@@ -109,36 +108,13 @@
#define ST_HEALTHX 79
#define ST_HEALTHY 162
-// Weapon pos.
-#define ST_ARMSX 111
-#define ST_ARMSY 172
-#define ST_ARMSBGX 104
-#define ST_ARMSBGY 168
-#define ST_ARMSXSPACE 12
-#define ST_ARMSYSPACE 10
+// [STRIFE]
+// Removed:
+// * Weapon pos.
+// * Frags pos.
+// * ARMOR number pos.
+// * Key icon positions.
-// Frags pos.
-#define ST_FRAGSX 138
-#define ST_FRAGSY 171
-#define ST_FRAGSWIDTH 2
-
-// ARMOR number pos.
-#define ST_ARMORWIDTH 3
-#define ST_ARMORX 221
-#define ST_ARMORY 171
-
-// Key icon positions.
-#define ST_KEY0WIDTH 8
-#define ST_KEY0HEIGHT 5
-#define ST_KEY0X 239
-#define ST_KEY0Y 171
-#define ST_KEY1WIDTH ST_KEY0WIDTH
-#define ST_KEY1X 239
-#define ST_KEY1Y 181
-#define ST_KEY2WIDTH ST_KEY0WIDTH
-#define ST_KEY2X 239
-#define ST_KEY2Y 191
-
// Ammunition counter.
// haleyjd 20110213 [STRIFE]: ammo counters for the popup widget
#define ST_POPUPAMMOX 206
@@ -148,42 +124,15 @@
// Indicate maximum ammunition.
// Only needed because backpack exists.
// haleyjd 20110213 [STRIFE]: maxammo counters for the popup widget
-#define ST_POPUPMAXAMMOX 239
+#define ST_POPUPMAXAMMOX 239
-// pistol
-#define ST_WEAPON0X 110
-#define ST_WEAPON0Y 172
+// [STRIFE]
+// Removed:
+// * Doom weapon stuff
+// * DETH title (???)
-// shotgun
-#define ST_WEAPON1X 122
-#define ST_WEAPON1Y 172
-
-// chain gun
-#define ST_WEAPON2X 134
-#define ST_WEAPON2Y 172
-
-// missile launcher
-#define ST_WEAPON3X 110
-#define ST_WEAPON3Y 181
-
-// plasma gun
-#define ST_WEAPON4X 122
-#define ST_WEAPON4Y 181
-
- // bfg
-#define ST_WEAPON5X 134
-#define ST_WEAPON5Y 181
-
-// WPNS title
-#define ST_WPNSX 109
-#define ST_WPNSY 191
-
- // DETH title
-#define ST_DETHX 109
-#define ST_DETHY 191
-
// Dimensions given in characters.
-#define ST_MSGWIDTH 52
+#define ST_MSGWIDTH 52
// haleyjd 08/31/10: [STRIFE]
// * Removed faces.
@@ -332,7 +281,7 @@
void ST_Stop(void);
// [STRIFE]
-static char st_msgbuf[52];
+static char st_msgbuf[ST_MSGWIDTH];
// Respond to keyboard input events,
// intercept cheats.
@@ -1212,7 +1161,106 @@
HUlib_drawYellowText(x, y, string);
}
+#define ST_KEYSPERPAGE 10
+#define ST_KEYS_X 20
+#define ST_KEYS_Y 63
+#define ST_KEYNAME_X 17
+#define ST_KEYNAME_Y 4
+#define ST_KEYS_YSTEP 17
+#define ST_KEYS_NUMROWS 4
+#define ST_KEYS_COL2X 160
+
//
+// ST_drawKeysPopup
+//
+// haleyjd 20110213: [STRIFE] New function
+// This has taken the longest out of almost everything to get working properly.
+//
+static boolean ST_drawKeysPopup(void)
+{
+ int x, y, key, keycount;
+ mobjinfo_t *info;
+
+ V_DrawXlaPatch(0, 56, invpbak2);
+ V_DrawPatchDirect(0, 56, invpop2);
+
+ if(deathmatch)
+ {
+ // STRIFE-TODO: In deathmatch, the keys popup is replaced by a chart
+ // of frag counts
+ }
+ else
+ {
+ // Bounds-check page number
+ if(st_keypage < 0 || st_keypage > 2)
+ {
+ st_keypage = -1;
+ st_popupdisplaytics = 0;
+ st_displaypopup = false;
+
+ return false;
+ }
+
+ // Are there any keys to display on this page?
+ if(st_keypage > 0)
+ {
+ boolean haskeyinrange = false;
+
+ for(key = ST_KEYSPERPAGE * st_keypage, keycount = 0;
+ keycount < ST_KEYSPERPAGE && key < NUMCARDS;
+ ++key, ++keycount)
+ {
+ if(plyr->cards[key])
+ haskeyinrange = true;
+ }
+
+ if(!haskeyinrange)
+ {
+ st_displaypopup = false;
+ st_showkeys = false;
+ st_keypage = -1;
+
+ return false;
+ }
+ }
+
+ // Draw the keys for the current page
+ key = ST_KEYSPERPAGE * st_keypage;
+ keycount = 0;
+ x = ST_KEYS_X;
+ y = ST_KEYS_Y;
+ info = &mobjinfo[MT_KEY_BASE + key];
+
+ for(; keycount < ST_KEYSPERPAGE && key < NUMCARDS; ++key, ++keycount, ++info)
+ {
+ char sprname[8];
+ patch_t *patch;
+ memset(sprname, 0, sizeof(sprname));
+
+ if(plyr->cards[key])
+ {
+ // Get spawnstate sprite name and load corresponding icon
+ DEH_snprintf(sprname, sizeof(sprname), "I_%s",
+ sprnames[states[info->spawnstate].sprite]);
+ patch = W_CacheLumpName(sprname, PU_CACHE);
+ V_DrawPatchDirect(x, y, patch);
+ HUlib_drawYellowText(x + ST_KEYNAME_X, y + ST_KEYNAME_Y, info->name);
+ }
+
+ if(keycount != ST_KEYS_NUMROWS)
+ y += ST_KEYS_YSTEP;
+ else
+ {
+ x = ST_KEYS_COL2X;
+ y = ST_KEYS_Y;
+ }
+ }
+ }
+
+ return true;
+}
+
+//
// ST_DrawExternal
//
// haleyjd 09/01/10: [STRIFE] New function.
@@ -1254,10 +1302,9 @@
{
int keys = 0;
- // villsa [STRIFE] TODO
+ // villsa [STRIFE] keys popup
if(st_showkeys || st_popupdisplaytics)
- return true; // temp
- //return ST_drawKeysPopup();
+ return ST_drawKeysPopup();
V_DrawXlaPatch(0, 56, invpbak);
V_DrawPatchDirect(0, 56, invpop);
--- a/src/v_video.c
+++ b/src/v_video.c
@@ -653,7 +653,7 @@
void V_ScreenShot(char *format)
{
int i;
- char lbmname[12];
+ char lbmname[16]; // haleyjd 20110213: BUG FIX - 12 is too small!
// find a file name to save it to