ref: d48b48bd9a0657b81af7769dbf364dcac69eb783
parent: ffb95c420a3037021f352fa35268a9750bed37f5
author: James Haley <haleyjd@hotmail.com>
date: Sun Sep 19 17:46:22 EDT 2010
Functional inventory status bar cursor and item rendering. Fix for P_GiveInventoryItem to return proper value at end of function. Subversion-branch: /branches/strife-branch Subversion-revision: 2124
--- a/src/strife/p_dialog.c
+++ b/src/strife/p_dialog.c
@@ -686,7 +686,7 @@
else
ok = false;
- return true;
+ return ok;
}
//
--- a/src/strife/st_stuff.c
+++ b/src/strife/st_stuff.c
@@ -57,6 +57,7 @@
// Needs access to LFB.
#include "v_video.h"
+#include "i_swap.h"
// State.
#include "doomstat.h"
@@ -64,6 +65,7 @@
// Data.
#include "dstrings.h"
#include "sounds.h"
+#include "m_controls.h"
//
// STATUS BAR DATA
@@ -82,8 +84,6 @@
// Location of status bar
#define ST_X 0
-#define ST_FX 143
-
// Location and size of statistics,
// justified according to widget type.
// Problem is, within which space? STbar? Screen?
@@ -210,8 +210,8 @@
// * Removed more faces, keyboxes, st_randomnumber
// graphics are drawn to a backing screen and blitted to the real screen
-byte *st_backing_screen;
-
+//byte *st_backing_screen; - [STRIFE]: Unused.
+
// main player in game
static player_t* plyr;
@@ -233,12 +233,14 @@
// haleyjd 09/01/10: [STRIFE] sbar -> invback
// main inventory background and other bits
-static patch_t* invback; // main bar
-static patch_t* invtop; // top bit
-static patch_t* invpop; // popup frame with text
-static patch_t* invpop2; // plain popup frame
-static patch_t* invpbak; // popup background w/details
-static patch_t* invpbak2; // plain popup background
+static patch_t* invback; // main bar
+static patch_t* stback; // multiplayer background
+static patch_t* invtop; // top bit
+static patch_t* invpop; // popup frame with text
+static patch_t* invpop2; // plain popup frame
+static patch_t* invpbak; // popup background w/details
+static patch_t* invpbak2; // plain popup background
+static patch_t* invcursor; // cursor
// haleyjd 09/01/10: [STRIFE] Replaced tallnum, shortnum w/inv fonts
// 0-9, green numbers
@@ -289,6 +291,9 @@
//cheatseq_t cheat_choppers = CHEAT("idchoppers", 0); [STRIFE] no such thing
+// Forward declarations:
+void ST_drawNumFontY(int x, int y, int num);
+void ST_drawNumFontY2(int x, int y, int num);
//
// STATUS BAR CODE
@@ -299,21 +304,67 @@
{
if (st_statusbaron)
{
- V_UseBuffer(st_backing_screen);
+ int firstinventory, icon_x, num_x, i, numdrawn;
- V_DrawPatch(ST_X, 0, invback);
+ // haleyjd 09/19/10: No backscreen caching in Strife.
+ //V_UseBuffer(st_backing_screen);
- // haleyjd 09/01/10: STRIFE-TODO: status bar stuff
- /*
- if (netgame)
- V_DrawPatch(ST_FX, 0, faceback);
- */
- V_RestoreBuffer();
+ // TODO: only sometimes drawing?
- V_CopyRect(ST_X, 0, st_backing_screen, ST_WIDTH, ST_HEIGHT, ST_X, ST_Y);
+ plyr->st_update = false;
+
+ // draw main status bar
+ V_DrawPatch(ST_X, ST_Y, invback);
+
+ // draw multiplayer armor backdrop if netgame
+ if(netgame)
+ V_DrawPatch(ST_X, 173, stback);
+
+ if(plyr->inventorycursor >= 6)
+ firstinventory = plyr->inventorycursor - 5;
+ else
+ firstinventory = 0;
+
+ // Draw cursor.
+ if(plyr->numinventory)
+ {
+ V_DrawPatch(35 * (plyr->inventorycursor - firstinventory) + 42,
+ 180, invcursor);
+ }
+
+ // Draw inventory bar
+ for(num_x = 68, icon_x = 48, i = firstinventory, numdrawn = 0;
+ num_x < 278;
+ num_x += 35, icon_x += 35, i++, numdrawn++)
+ {
+ int lumpnum;
+ patch_t *patch;
+ char iconname[8];
+
+ if(plyr->numinventory <= numdrawn)
+ break;
+
+ DEH_snprintf(iconname, sizeof(iconname), "I_%s",
+ DEH_String(sprnames[plyr->inventory[i].sprite]));
+
+ lumpnum = W_CheckNumForName(iconname);
+ if(lumpnum == -1)
+ patch = W_CacheLumpName(DEH_String("STCFN063"), PU_CACHE);
+ else
+ patch = W_CacheLumpNum(lumpnum, PU_STATIC);
+
+ V_DrawPatch(icon_x, 182, patch);
+ ST_drawNumFontY(num_x, 191, plyr->inventory[i].amount);
+ }
+
+ // haleyjd 09/19/10: nope, not in Strife.
+ //V_RestoreBuffer();
+ //V_CopyRect(ST_X, 0, st_backing_screen, ST_WIDTH, ST_HEIGHT, ST_X, ST_Y);
}
}
+// [STRIFE]
+static char st_msgbuf[52];
// Respond to keyboard input events,
// intercept cheats.
@@ -347,6 +398,47 @@
if(ev->type != ev_keydown)
return false;
+ // keydown events
+ if(ev->data2 == key_invquery) // inventory query
+ {
+ inventory_t *inv = &(plyr->inventory[plyr->inventorycursor]);
+ if(inv->amount)
+ {
+ DEH_snprintf(st_msgbuf, sizeof(st_msgbuf), "%d %s",
+ inv->amount,
+ DEH_String(mobjinfo[inv->type].name));
+ plyr->message = st_msgbuf;
+ }
+ }
+
+ // TODO: popup stuff here
+
+ if(ev->data2 == key_invleft) // inventory move left
+ {
+ if(plyr->inventorycursor > 0)
+ plyr->inventorycursor--;
+ return true;
+ }
+ else if(ev->data2 == key_invright)
+ {
+ if(plyr->inventorycursor < plyr->numinventory - 1)
+ plyr->inventorycursor++;
+ return true;
+ }
+ else if(ev->data2 == key_invhome)
+ {
+ plyr->inventorycursor = 0;
+ return true;
+ }
+ else if(ev->data2 == key_invend)
+ {
+ if(plyr->numinventory)
+ plyr->inventorycursor = plyr->numinventory - 1;
+ else
+ plyr->inventorycursor = 0;
+ return true;
+ }
+
//
// [STRIFE] Cheats which are allowed in netgames/demos:
//
@@ -735,6 +827,47 @@
}
*/
+//
+// ST_drawNumFontY
+//
+// haleyjd 09/19/10: [STRIFE] New function
+// Draws a small yellow number for inventory etc.
+//
+void ST_drawNumFontY(int x, int y, int num)
+{
+ if(!num)
+ V_DrawPatch(x, y, invfonty[0]);
+
+ while(num)
+ {
+ V_DrawPatch(x, y, invfonty[num % 10]);
+ x -= SHORT(invfonty[0]->width) + 1;
+ num /= 10;
+ }
+}
+
+//
+// ST_drawNumFontY2
+//
+// haleyjd 09/19/10: [STRIFE] New function
+// As above, but turns negative numbers into zero.
+//
+void ST_drawNumFontY2(int x, int y, int num)
+{
+ if(!num)
+ V_DrawPatch(x, y, invfonty[0]);
+
+ if(num < 0)
+ num = 0;
+
+ while(num)
+ {
+ V_DrawPatchDirect(x, y, invfonty[num % 10]);
+ x -= SHORT(invfonty[0]->width) + 1;
+ num /= 10;
+ }
+}
+
void ST_doRefresh(void)
{
st_firsttime = false;
@@ -759,9 +892,9 @@
// haleyjd 09/01/10: STRIFE-TODO: work out statbar details
// If just after ST_Start(), refresh all
- if (st_firsttime) ST_doRefresh();
+ /*if (st_firsttime)*/ ST_doRefresh();
// Otherwise, update as little as possible
- else ST_diffDraw();
+ /*else*/ ST_diffDraw();
}
//
@@ -780,11 +913,12 @@
}
else
{
- // STRIFE-TODO:
- // ST_drawNumFontY2(15, 194, plyr->health);
- // v5 = weaponinfo[plyr->readyweapon].ammo;
- // if (v5 != am_noammo)
- // ST_drawNumFontY2(310, 194, plyr->ammo[v5]);
+ ammotype_t ammo;
+
+ ST_drawNumFontY2(15, 194, plyr->health);
+ ammo = weaponinfo[plyr->readyweapon].ammo;
+ if (ammo != am_noammo)
+ ST_drawNumFontY2(310, 194, plyr->ammo[ammo]);
}
if(!st_displaypopup)
@@ -822,8 +956,12 @@
callback(namebuf, &invfonty[i]);
}
- // haleyjd 08/31/10: [STRIFE]
- // * No face - STRIFE-TODO: but there are similar color patches, which appear behind the armor in deathmatch...
+ // haleyjd 09/19/10: [STRIFE]
+ // * No face, but there is this patch, which appears behind the armor
+ DEH_snprintf(namebuf, 9, "STBACK0%d", consoleplayer + 1);
+ if(netgame)
+ callback(namebuf, &stback);
+
// 09/01/10:
// * Removed all unused DOOM stuff (arms, numbers, %, etc).
@@ -835,6 +973,7 @@
callback(DEH_String("INVPOP2"), &invpop2);
callback(DEH_String("INVPBAK"), &invpbak);
callback(DEH_String("INVPBAK2"), &invpbak2);
+ callback(DEH_String("INVCURS"), &invcursor);
}
static void ST_loadCallback(char *lumpname, patch_t **variable)
@@ -1003,7 +1142,7 @@
void ST_Stop (void)
{
if (st_stopped)
- return;
+ return;
I_SetPalette (W_CacheLumpNum (lu_palette, PU_CACHE));
@@ -1013,6 +1152,8 @@
void ST_Init (void)
{
ST_loadData();
- st_backing_screen = (byte *) Z_Malloc(ST_WIDTH * ST_HEIGHT, PU_STATIC, 0);
+
+ // haleyjd 09/19/10: This is not used by Strife. More memory for voices!
+ //st_backing_screen = (byte *) Z_Malloc(ST_WIDTH * ST_HEIGHT, PU_STATIC, 0);
}