ref: 6ae54ada023321ec629a52cc4f91ccd8e3aa06ff
parent: 663e27b891c796a76dde61f8a7b195b6dd228511
author: James Haley <[email protected]>
date: Tue Sep 21 03:24:45 EDT 2010
Working health bars on the status bar, and numerous fixes to P_TouchSpecialThing. Subversion-branch: /branches/strife-branch Subversion-revision: 2127
--- a/src/strife/p_inter.c
+++ b/src/strife/p_inter.c
@@ -404,6 +404,8 @@
//
// P_TouchSpecialThing
//
+// [STRIFE] Rewritten for Strife collectables.
+//
void P_TouchSpecialThing(mobj_t* special, mobj_t* toucher)
{
player_t* player;
@@ -416,7 +418,6 @@
if(delta > toucher->height || delta < -8*FRACUNIT)
return; // out of reach
-
sound = sfx_itemup;
player = toucher->player;
@@ -425,11 +426,21 @@
if(toucher->health <= 0)
return;
- // villsa [STRIFE] damage toucher if special has spectral flag
- if(special->flags & MF_SPECTRAL)
+ // villsa [STRIFE] damage toucher if special is spectral
+ // haleyjd 09/21/10: corrected to test for SPECTRE thingtypes specifically
+ switch(special->type)
{
+ case MT_SPECTRE_A:
+ case MT_SPECTRE_B:
+ case MT_SPECTRE_C:
+ case MT_SPECTRE_D:
+ case MT_SPECTRE_E:
+ case MT_ENTITY:
+ case MT_SUBENTITY:
P_DamageMobj(toucher, NULL, NULL, 5);
return;
+ default:
+ break;
}
// villsa [STRIFE]
@@ -440,8 +451,8 @@
switch(special->sprite)
{
// bullets
- case SPR_BLIT:
- if(!P_GiveAmmo(player, am_bullets, 1))
+ case SPR_BLIT: // haleyjd: fixed missing MF_DROPPED check
+ if(!P_GiveAmmo(player, am_bullets, !(special->flags & MF_DROPPED)))
return;
break;
@@ -501,8 +512,9 @@
// rifle
case SPR_RIFL:
- if(!P_GiveWeapon(player, wp_rifle, special->flags&MF_DROPPED))
+ if(!P_GiveWeapon(player, wp_rifle, special->flags & MF_DROPPED))
return;
+ sound = sfx_wpnup; // haleyjd: SHK-CHK!
break;
// flame thrower
@@ -509,6 +521,9 @@
case SPR_FLAM:
if(!P_GiveWeapon(player, wp_flame, false))
return;
+ // haleyjd: gives extra ammo.
+ P_GiveAmmo(player, am_cell, 3);
+ sound = sfx_wpnup; // haleyjd: SHK-CHK!
break;
// missile launcher
@@ -515,12 +530,14 @@
case SPR_MMSL:
if(!P_GiveWeapon(player, wp_missile, false))
return;
+ sound = sfx_wpnup; // haleyjd: SHK-CHK!
break;
- // missile launcher
+ // grenade launcher
case SPR_GRND:
- if(!P_GiveWeapon(player, wp_hegrenade, special->flags&MF_DROPPED))
+ if(!P_GiveWeapon(player, wp_hegrenade, special->flags & MF_DROPPED))
return;
+ sound = sfx_wpnup; // haleyjd: SHK-CHK!
break;
// mauler
@@ -527,14 +544,34 @@
case SPR_TRPD:
if(!P_GiveWeapon(player, wp_mauler, false))
return;
+ sound = sfx_wpnup; // haleyjd: SHK-CHK!
break;
- // crossbow
+ // electric bolt crossbow
case SPR_CBOW:
- if(!P_GiveWeapon(player, wp_elecbow, special->flags&MF_DROPPED))
+ if(!P_GiveWeapon(player, wp_elecbow, special->flags & MF_DROPPED))
return;
+ sound = sfx_wpnup; // haleyjd: SHK-CHK!
break;
+ // haleyjd 09/21/10: missed case: THE SIGIL!
+ case SPR_SIGL:
+ if(!P_GiveWeapon(player, wp_sigil, special->flags & MF_DROPPED))
+ {
+ player->sigiltype = special->frame;
+ return;
+ }
+
+ if(netgame)
+ player->sigiltype = 4;
+
+ player->pendingweapon = wp_sigil;
+ player->st_update = true;
+ if(deathmatch)
+ return;
+ sound = sfx_wpnup;
+ break;
+
// backpack
case SPR_BKPK:
if(!player->backpack)
@@ -548,25 +585,40 @@
P_GiveAmmo(player, i, 1);
break;
+ // 1 Gold
case SPR_COIN:
P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
break;
+ // 10 Gold
case SPR_CRED:
for(i = 0; i < 10; i++)
P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
break;
+ // 25 Gold
case SPR_SACK:
- for(i = 0; i < 25; i++)
- P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+ // haleyjd 09/21/10: missed code: if a SPR_SACK object has negative
+ // health, it will give that much gold - STRIFE-TODO: verify
+ if(special->health < 0)
+ {
+ for(i = special->health; i != 0; i++)
+ P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+ }
+ else
+ {
+ for(i = 0; i < 25; i++)
+ P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+ }
break;
+ // 50 Gold
case SPR_CHST:
for(i = 0; i < 50; i++)
P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
break;
+ // Leather Armor
case SPR_ARM1:
if(!P_GiveArmor(player, -2))
if(!P_GiveInventoryItem(player, special->sprite, special->type))
@@ -573,6 +625,7 @@
pickupmsg[0] = '!';
break;
+ // Metal Armor
case SPR_ARM2:
if(!P_GiveArmor(player, -1))
if(!P_GiveInventoryItem(player, special->sprite, special->type))
@@ -579,12 +632,15 @@
pickupmsg[0] = '!';
break;
+ // All-map powerup
case SPR_PMAP:
if(!P_GivePower(player, pw_allmap))
return;
- sound = sfx_yeah;
+ sound = sfx_yeah;
break;
+ // The Comm Unit - because you need Blackbird whining in your ear the
+ // whole time and telling you how lost she is :P
case SPR_COMM:
if(!P_GivePower(player, pw_communicator))
return;
@@ -591,19 +647,30 @@
sound = sfx_yeah;
break;
+ // haleyjd 09/21/10: missed case - Shadow Armor; though, I do not know why
+ // this has a case distinct from generic inventory items... Maybe it started
+ // out as an auto-use-if-possible item much like regular armor...
+ case SPR_SHD1:
+ if(!P_GiveInventoryItem(player, SPR_SHD1, special->type))
+ pickupmsg[0] = '!';
+ break;
+
// villsa [STRIFE] check default items
case SPR_TOKN:
default:
if(special->type >= MT_KEY_BASE && special->type <= MT_NEWKEY5)
{
+ // haleyjd 09/21/10: Strife player still picks up keys that
+ // he has already found. (break, not return)
if(!P_GiveCard(player, special->type - MT_KEY_BASE))
- return;
+ break;
}
else
{
if(!P_GiveInventoryItem(player, special->sprite, special->type))
- pickupmsg[0] = '!';
+ pickupmsg[0] = '!';
}
+ break;
}
// villsa [STRIFE] set message
--- a/src/strife/st_stuff.c
+++ b/src/strife/st_stuff.c
@@ -315,9 +315,6 @@
//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
@@ -324,97 +321,13 @@
//
void ST_Stop(void);
-//
-// ST_refreshBackground
-//
-// [STRIFE] Completely overhauled.
-//
+
+// [STRIFE] Unused.
+/*
void ST_refreshBackground(void)
{
- if (st_statusbaron)
- {
- int firstinventory, icon_x, num_x, i, numdrawn;
-
- // haleyjd 09/19/10: No backscreen caching in Strife.
- //V_UseBuffer(st_backing_screen);
-
- // TODO: only sometimes drawing?
-
- plyr->st_update = false;
-
- // cache data
- st_lastcursorpos = plyr->inventorycursor;
- st_lastammo = weaponinfo[plyr->readyweapon].ammo;
- st_lastarmortype = plyr->armortype;
- st_lasthealth = plyr->health;
- st_firsttime = 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: Draw sigil icon
- if(plyr->weaponowned[wp_sigil])
- V_DrawPatch(253, 175, invsigil[plyr->sigiltype]);
-
- // haleyjd 09/19/10: Draw ammo
- if(st_lastammo < NUMAMMO)
- V_DrawPatch(290, 180, invammo[st_lastammo]);
-
- // haleyjd 09/19/10: Draw armor
- if(plyr->armortype)
- {
- V_DrawPatch(2, 177, invarmor[plyr->armortype - 1]);
- ST_drawNumFontY(20, 191, plyr->armorpoints);
- }
-
- // STRIFE-TODO: health bars
-
- // 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];
@@ -921,12 +834,161 @@
}
}
-void ST_doRefresh(void)
+//
+// ST_drawLine
+//
+// haleyjd 09/20/10: [STRIFE] New function
+// Basic horizontal line drawing routine used for the health bars.
+//
+void ST_drawLine(int x, int y, int len, int color)
{
- st_firsttime = false;
+ byte putcolor = (byte)(color);
+ byte *drawpos = I_VideoBuffer + y * SCREENWIDTH + x;
+ int i = 0;
+ while(i < len)
+ {
+ *drawpos++ = putcolor;
+ ++i;
+ }
+}
+
+//
+// ST_doRefresh
+//
+// haleyjd 09/20/10: Evidence more than suggests that Rogue moved all status bar
+// drawing down to this function.
+//
+void ST_doRefresh(void)
+{
// draw status bar background to off-screen buff
- ST_refreshBackground();
+ if (st_statusbaron)
+ {
+ int firstinventory, icon_x, num_x, i, numdrawn;
+
+ // haleyjd 09/19/10: No backscreen caching in Strife.
+ //V_UseBuffer(st_backing_screen);
+
+ // TODO: only sometimes drawing?
+
+ plyr->st_update = false;
+
+ // cache data
+ st_lastcursorpos = plyr->inventorycursor;
+ st_lastammo = weaponinfo[plyr->readyweapon].ammo;
+ st_lastarmortype = plyr->armortype;
+ st_lasthealth = plyr->health;
+ st_firsttime = 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: Draw sigil icon
+ if(plyr->weaponowned[wp_sigil])
+ V_DrawPatch(253, 175, invsigil[plyr->sigiltype]);
+
+ // haleyjd 09/19/10: Draw ammo
+ if(st_lastammo < NUMAMMO)
+ V_DrawPatch(290, 180, invammo[st_lastammo]);
+
+ // haleyjd 09/19/10: Draw armor
+ if(plyr->armortype)
+ {
+ V_DrawPatch(2, 177, invarmor[plyr->armortype - 1]);
+ ST_drawNumFontY(20, 191, plyr->armorpoints);
+ }
+
+ // haleyjd 09/20/10: Draw life bars.
+ {
+ int barlength;
+ int lifecolor1;
+ int lifecolor2;
+
+ barlength = plyr->health;
+ if(barlength > 100)
+ barlength = 200 - plyr->health;
+ barlength *= 2;
+
+ if(plyr->health < 11) // Danger, Will Robinson!
+ lifecolor1 = 64;
+ else if(plyr->health < 21) // Caution
+ lifecolor1 = 80;
+ else // All is well.
+ lifecolor1 = 96;
+
+ if(plyr->cheats & CF_GODMODE) // Gold, probably a throwback to DOOM.
+ lifecolor1 = 226;
+
+ lifecolor2 = lifecolor1 + 3;
+
+ // Draw the normal health bars
+ ST_drawLine(49, 172, barlength, lifecolor1);
+ ST_drawLine(49, 173, barlength, lifecolor2);
+ ST_drawLine(49, 175, barlength, lifecolor1);
+ ST_drawLine(49, 176, barlength, lifecolor2);
+
+ // Draw the > 100 health lines
+ if(plyr->health > 100)
+ {
+ int oldbarlength = barlength;
+ lifecolor1 = 112; // Shades of blue
+ lifecolor2 = lifecolor1 + 3;
+
+ // take up the difference not drawn by the first (<= 100) bar
+ barlength = 200 - barlength;
+
+ ST_drawLine(49 + oldbarlength, 172, barlength, lifecolor1);
+ ST_drawLine(49 + oldbarlength, 173, barlength, lifecolor2);
+ ST_drawLine(49 + oldbarlength, 175, barlength, lifecolor1);
+ ST_drawLine(49 + oldbarlength, 176, barlength, lifecolor2);
+ }
+ } // end local-scope block
+
+ // 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);
+ }
}
void ST_diffDraw(void)
@@ -945,9 +1007,9 @@
// haleyjd 09/01/10: STRIFE-TODO: work out statbar details
// If just after ST_Start(), refresh all
- /*if (st_firsttime)*/ ST_doRefresh();
+ ST_doRefresh();
// Otherwise, update as little as possible
- /*else*/ ST_diffDraw();
+ ST_diffDraw();
}
//