ref: 8bbfd5b68a289ddf933f78d369606f1f22dd91c6
parent: 3d8f10ef325d2d03f1f9535d9f201eca3d56d37f
author: James Haley <haleyjd@hotmail.com>
date: Wed Sep 22 04:07:35 EDT 2010
Rewrote P_GiveItemToPlayer to exactly match binary, particularly with treatment of SPR_TOKN objects, and playing proper sounds for different item types. Fixed most S_StartSound calls in the menu engine. Removed call to S_StopSound in S_StartSound, as Strife doesn't do it. Added call to P_DialogDoChoice(-1) in M_Responder when menuindialog is asserted and the menu exit key is pressed. Subversion-branch: /branches/strife-branch Subversion-revision: 2130
--- a/src/strife/m_menu.c
+++ b/src/strife/m_menu.c
@@ -64,6 +64,7 @@
#include "sounds.h"
#include "m_menu.h"
+#include "p_dialog.h"
extern void M_QuitStrife(int);
@@ -691,8 +692,8 @@
{
if (key == key_menu_confirm)
{
- M_DoSave(quickSaveSlot);
- S_StartSound(NULL,sfx_swish); // villsa [STRIFE] TODO - fix sounds
+ M_DoSave(quickSaveSlot);
+ S_StartSound(NULL, sfx_mtalht); // [STRIFE] sound
}
}
@@ -700,7 +701,7 @@
{
if (!usergame)
{
- S_StartSound(NULL,sfx_oof);
+ S_StartSound(NULL, sfx_oof);
return;
}
@@ -728,8 +729,8 @@
{
if (key == key_menu_confirm)
{
- M_LoadSelect(quickSaveSlot);
- S_StartSound(NULL,sfx_swish); // villsa [STRIFE] TODO - fix sounds
+ M_LoadSelect(quickSaveSlot);
+ S_StartSound(NULL, sfx_mtalht); // [STRIFE] sound
}
}
@@ -1685,7 +1686,7 @@
messageRoutine(key);
menuactive = false;
- S_StartSound(NULL,sfx_swish); // villsa [STRIFE] TODO - fix sounds
+ S_StartSound(NULL, sfx_mtalht); // [STRIFE] sound
return true;
}
@@ -1703,7 +1704,7 @@
if (automapactive || chat_on)
return false;
M_SizeDisplay(0);
- S_StartSound(NULL,sfx_stnmov);
+ S_StartSound(NULL, sfx_stnmov);
return true;
}
else if (key == key_menu_incscreen) // Screen size up
@@ -1711,7 +1712,7 @@
if (automapactive || chat_on)
return false;
M_SizeDisplay(1);
- S_StartSound(NULL,sfx_stnmov);
+ S_StartSound(NULL, sfx_stnmov);
return true;
}
else if (key == key_menu_help) // Help key
@@ -1721,13 +1722,13 @@
currentMenu = &ReadDef1;
itemOn = 0;
- S_StartSound(NULL,sfx_swtchn);
+ S_StartSound(NULL, sfx_swtchn);
return true;
}
else if (key == key_menu_save) // Save
{
M_StartControlPanel();
- S_StartSound(NULL,sfx_swtchn);
+ S_StartSound(NULL, sfx_swtchn);
M_SaveGame(0);
return true;
}
@@ -1734,7 +1735,7 @@
else if (key == key_menu_load) // Load
{
M_StartControlPanel();
- S_StartSound(NULL,sfx_swtchn);
+ S_StartSound(NULL, sfx_swtchn);
M_LoadGame(0);
return true;
}
@@ -1743,7 +1744,7 @@
M_StartControlPanel ();
currentMenu = &SoundDef;
itemOn = sfx_vol;
- S_StartSound(NULL,sfx_swtchn);
+ S_StartSound(NULL, sfx_swtchn);
return true;
}
/*
@@ -1756,13 +1757,13 @@
*/
else if (key == key_menu_qsave) // Quicksave
{
- S_StartSound(NULL,sfx_swtchn);
+ S_StartSound(NULL, sfx_swtchn);
M_QuickSave();
return true;
}
else if (key == key_menu_endgame) // End game
{
- S_StartSound(NULL,sfx_swtchn);
+ S_StartSound(NULL, sfx_swtchn);
M_EndGame(0);
return true;
}
@@ -1769,18 +1770,18 @@
else if (key == key_menu_messages) // Toggle messages
{
M_ChangeMessages(0);
- S_StartSound(NULL,sfx_swtchn);
+ S_StartSound(NULL, sfx_swtchn);
return true;
}
else if (key == key_menu_qload) // Quickload
{
- S_StartSound(NULL,sfx_swtchn);
+ S_StartSound(NULL, sfx_swtchn);
M_QuickLoad();
return true;
}
else if (key == key_menu_quit) // Quit DOOM
{
- S_StartSound(NULL,sfx_swtchn);
+ S_StartSound(NULL, sfx_swtchn);
M_QuitStrife(0);
return true;
}
@@ -1801,7 +1802,7 @@
if (key == key_menu_activate)
{
M_StartControlPanel ();
- S_StartSound(NULL,sfx_swtchn);
+ S_StartSound(NULL, sfx_swtchn);
return true;
}
return false;
@@ -1819,7 +1820,7 @@
if (itemOn+1 > currentMenu->numitems-1)
itemOn = 0;
else itemOn++;
- S_StartSound(NULL,sfx_pstop);
+ S_StartSound(NULL, sfx_pstop);
} while(currentMenu->menuitems[itemOn].status==-1);
return true;
@@ -1833,7 +1834,7 @@
if (!itemOn)
itemOn = currentMenu->numitems-1;
else itemOn--;
- S_StartSound(NULL,sfx_pstop);
+ S_StartSound(NULL, sfx_pstop);
} while(currentMenu->menuitems[itemOn].status==-1);
return true;
@@ -1845,7 +1846,7 @@
if (currentMenu->menuitems[itemOn].routine &&
currentMenu->menuitems[itemOn].status == 2)
{
- S_StartSound(NULL,sfx_stnmov);
+ S_StartSound(NULL, sfx_stnmov);
currentMenu->menuitems[itemOn].routine(0);
}
return true;
@@ -1857,7 +1858,7 @@
if (currentMenu->menuitems[itemOn].routine &&
currentMenu->menuitems[itemOn].status == 2)
{
- S_StartSound(NULL,sfx_stnmov);
+ S_StartSound(NULL, sfx_stnmov);
currentMenu->menuitems[itemOn].routine(1);
}
return true;
@@ -1873,12 +1874,12 @@
if (currentMenu->menuitems[itemOn].status == 2)
{
currentMenu->menuitems[itemOn].routine(1); // right arrow
- S_StartSound(NULL,sfx_stnmov);
+ S_StartSound(NULL, sfx_stnmov);
}
else
{
currentMenu->menuitems[itemOn].routine(itemOn);
- S_StartSound(NULL,sfx_swish); // villsa [STRIFE] TODO - fix sounds
+ //S_StartSound(NULL, sfx_swish); [STRIFE] No sound is played here.
}
}
return true;
@@ -1886,10 +1887,12 @@
else if (key == key_menu_activate)
{
// Deactivate menu
+ if(menuindialog) // [STRIFE] - Get out of dialog engine semi-gracefully
+ P_DialogDoChoice(-1);
currentMenu->lastOn = itemOn;
M_ClearMenus (0);
- S_StartSound(NULL,sfx_swish); // villsa [STRIFE] TODO - fix sounds
+ S_StartSound(NULL, sfx_mtalht); // villsa [STRIFE] TODO - fix sounds
return true;
}
else if (key == key_menu_back)
@@ -1901,7 +1904,7 @@
{
currentMenu = currentMenu->prevMenu;
itemOn = currentMenu->lastOn;
- S_StartSound(NULL,sfx_swtchn);
+ S_StartSound(NULL, sfx_swtchn);
}
return true;
}
@@ -1914,7 +1917,7 @@
if (currentMenu->menuitems[i].alphaKey == ch)
{
itemOn = i;
- S_StartSound(NULL,sfx_pstop);
+ S_StartSound(NULL, sfx_pstop);
return true;
}
}
@@ -1924,7 +1927,7 @@
if (currentMenu->menuitems[i].alphaKey == ch)
{
itemOn = i;
- S_StartSound(NULL,sfx_pstop);
+ S_StartSound(NULL, sfx_pstop);
return true;
}
}
--- a/src/strife/p_dialog.c
+++ b/src/strife/p_dialog.c
@@ -702,6 +702,7 @@
int i = 0;
line_t junk;
boolean ok = true;
+ int sound = sfx_itemup; // haleyjd 09/21/10: different sounds for items
// set quest if mf_givequest flag is set
if(mobjinfo[type].flags & MF_GIVEQUEST)
@@ -719,264 +720,327 @@
{
if(mobjinfo[type].name)
{
- strncpy(pickupstring, mobjinfo[type].name, 39);
+ strncpy(pickupstring, DEH_String(mobjinfo[type].name), 39);
player->message = pickupstring;
}
player->questflags |= 1 << (type - MT_TOKEN_QUEST1);
+
+ if(player == &players[consoleplayer])
+ S_StartSound(NULL, sound);
+ return true;
}
- // check for other types
- else switch(type)
+
+ // haleyjd 09/22/10: Refactored to give sprites higher priority than
+ // mobjtypes and to implement missing logic.
+ switch(sprnum)
{
- // severed hand
- case MT_KEY_HAND:
- P_GiveCard(player, key_SeveredHand);
+ case SPR_HELT: // STRIFE-TODO: verify - I believe this is related to a cheat
+ P_GiveInventoryItem(player, SPR_HELT, MT_TOKEN_TOUGHNESS);
+ P_GiveInventoryItem(player, SPR_GUNT, MT_TOKEN_ACCURACY);
+
+ // [STRIFE] Bizarre...
+ for(i = 0; i < 5 * player->accuracy + 300; i++)
+ P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
break;
- // 300 gold
- case MT_MONY_300:
- for(i = 0; i < 300; i++)
+ case SPR_ARM1: // Armor 1
+ if(!P_GiveArmor(player, -2))
+ P_GiveInventoryItem(player, sprnum, type);
+ break;
+
+ case SPR_ARM2: // Armor 2
+ if(!P_GiveArmor(player, -1))
+ P_GiveInventoryItem(player, sprnum, type);
+ break;
+
+ case SPR_COIN: // 1 Gold
+ P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+ break;
+
+ case SPR_CRED: // 10 Gold
+ for(i = 0; i < 10; i++)
P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
break;
- // ammo refill (at training)
- case MT_TOKEN_AMMO:
- if(player->ammo[am_bullets] >= 50)
- return false;
+ case SPR_SACK: // 25 gold
+ for(i = 0; i < 25; i++)
+ P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+ break;
- player->ammo[am_bullets] = 50;
+ case SPR_CHST: // 50 gold
+ for(i = 0; i < 50; i++)
+ P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+
+ case SPR_BBOX: // Box of Bullets
+ if(!P_GiveAmmo(player, am_bullets, 5))
+ return false;
break;
- // health refill (at front HQ)
- case MT_TOKEN_HEALTH:
- if(!P_GiveBody(player, healthamounts[gameskill]))
+ case SPR_BLIT: // Bullet Clip
+ if(!P_GiveAmmo(player, am_bullets, 1))
return false;
break;
- // alarm
- case MT_TOKEN_ALARM:
- P_NoiseAlert(player->mo, player->mo);
- A_AlertSpectreC(dialogtalker);
+ case SPR_PMAP: // Map powerup
+ if(!P_GivePower(player, pw_allmap))
+ return false;
+ sound = sfx_yeah; // bluh-doop!
break;
- // door special 1
- case MT_TOKEN_DOOR1:
- junk.tag = 222;
- EV_DoDoor(&junk, open);
+ case SPR_COMM: // Communicator
+ if(!P_GivePower(player, pw_communicator))
+ return false;
+ sound = sfx_yeah; // bluh-doop!
break;
- // door special 2
- case MT_TOKEN_PRISON_PASS:
- junk.tag = 223;
- EV_DoDoor(&junk, open);
- if(gamemap == 2)
- P_GiveInventoryItem(player, sprnum, type);
+ case SPR_MSSL: // Mini-missile
+ if(!P_GiveAmmo(player, am_missiles, 1))
+ return false;
break;
- // door special 3
- case MT_TOKEN_SHOPCLOSE:
- junk.tag = 222;
- EV_DoDoor(&junk, close);
+ case SPR_ROKT: // Crate of missiles
+ if(!P_GiveAmmo(player, am_missiles, 5))
+ return false;
break;
- // door special 4
- case MT_TOKEN_DOOR3:
- junk.tag = 224;
- EV_DoDoor(&junk, close);
+ case SPR_BRY1: // Battery cell
+ if(!P_GiveAmmo(player, am_cell, 1))
+ return false;
break;
- // stamina upgrade
- case MT_TOKEN_STAMINA:
- if(player->stamina >= 100)
+ case SPR_CPAC: // Cell pack
+ if(!P_GiveAmmo(player, am_cell, 5))
return false;
+ break;
- player->stamina += 10;
- P_GiveBody(player, 200);
+ case SPR_PQRL: // Poison bolts
+ if(!P_GiveAmmo(player, am_poisonbolts, 5))
+ return false;
break;
- // accuracy upgrade
- case MT_TOKEN_NEW_ACCURACY:
- if(player->accuracy >= 100)
+ case SPR_XQRL: // Electric bolts
+ if(!P_GiveAmmo(player, am_elecbolts, 5))
return false;
+ break;
- player->accuracy += 10;
+ case SPR_GRN1: // HE Grenades
+ if(!P_GiveAmmo(player, am_hegrenades, 1))
+ return false;
break;
- // slideshow
- case MT_SLIDESHOW:
- gameaction = ga_victory;
- if(gamemap == 10)
- P_GiveItemToPlayer(player, SPR_TOKN, MT_TOKEN_QUEST17);
+ case SPR_GRN2: // WP Grenades
+ if(!P_GiveAmmo(player, am_wpgrenades, 1))
+ return false;
break;
- default:
- // check for sprites if no specific type is found
- switch(sprnum)
+ case SPR_BKPK: // Backpack (aka Ammo Satchel)
+ if(!player->backpack)
{
- // bullets
- case SPR_BLIT:
- ok = P_GiveAmmo(player, am_bullets, 1);
- break;
+ for(i = 0; i < NUMAMMO; i++)
+ player->maxammo[i] *= 2;
- // box of bullets
- case SPR_BBOX:
- ok = P_GiveAmmo(player, am_bullets, 5);
- break;
+ player->backpack = true;
+ }
+ for(i = 0; i < NUMAMMO; i++)
+ P_GiveAmmo(player, i, 1);
+ break;
- // missile
- case SPR_MSSL:
- ok = P_GiveAmmo(player, am_missiles, 1);
- break;
+ case SPR_RIFL: // Assault Rifle
+ if(player->weaponowned[wp_rifle])
+ return false;
- // box of missiles
- case SPR_ROKT:
- ok = P_GiveAmmo(player, am_missiles, 5);
- break;
+ if(!P_GiveWeapon(player, wp_rifle, false))
+ return false;
+
+ sound = sfx_wpnup; // SHK-CHK!
+ break;
- // battery
- case SPR_BRY1:
- ok = P_GiveAmmo(player, am_cell, 1);
- break;
+ case SPR_FLAM: // Flamethrower
+ if(player->weaponowned[wp_flame])
+ return false;
- // cell pack
- case SPR_CPAC:
- ok = P_GiveAmmo(player, am_cell, 5);
- break;
+ if(!P_GiveWeapon(player, wp_flame, false))
+ return false;
- // poison bolts
- case SPR_PQRL:
- ok = P_GiveAmmo(player, am_poisonbolts, 5);
- break;
+ sound = sfx_wpnup; // SHK-CHK!
+ break;
- // electric bolts
- case SPR_XQRL:
- ok = P_GiveAmmo(player, am_elecbolts, 5);
- break;
+ case SPR_MMSL: // Mini-missile Launcher
+ if(player->weaponowned[wp_missile])
+ return false;
- // he grenades
- case SPR_GRN1:
- ok = P_GiveAmmo(player, am_hegrenades, 1);
- break;
+ if(!P_GiveWeapon(player, wp_missile, false))
+ return false;
- // wp grenades
- case SPR_GRN2:
- ok = P_GiveAmmo(player, am_wpgrenades, 1);
- break;
+ sound = sfx_wpnup; // SHK-CHK!
+ break;
- // backpack
- case SPR_BKPK:
- if(!player->backpack)
- {
- for(i = 0; i < NUMAMMO; i++)
- player->maxammo[i] *= 2;
+ case SPR_TRPD: // Mauler
+ if(player->weaponowned[wp_mauler])
+ return false;
- player->backpack = true;
- }
- for(i = 0; i < NUMAMMO; i++)
- P_GiveAmmo(player, i, 1);
- break;
+ if(!P_GiveWeapon(player, wp_mauler, false))
+ return false;
- // coin
- case SPR_COIN:
- P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+ sound = sfx_wpnup; // SHK-CHK!
+ break;
+
+ case SPR_CBOW: // Here's a crossbow. Just aim straight, and *SPLAT!*
+ if(player->weaponowned[wp_elecbow])
+ return false;
+
+ if(!P_GiveWeapon(player, wp_elecbow, false))
+ return false;
+
+ sound = sfx_wpnup; // SHK-CHK!
+ break;
+
+ case SPR_TOKN: // Miscellaneous items - These are determined by thingtype.
+ switch(type)
+ {
+ case MT_KEY_HAND: // Severed hand
+ P_GiveCard(player, key_SeveredHand);
break;
- // gold 10
- case SPR_CRED:
- for(i = 0; i < 10; i++)
+ case MT_MONY_300: // 300 Gold (this is the only way to get it, in fact)
+ for(i = 0; i < 300; i++)
P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
break;
- // gold 25
- case SPR_SACK:
- for(i = 0; i < 25; i++)
- P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+ case MT_TOKEN_AMMO: // Ammo token - you get this from the Weapons Trainer
+ if(player->ammo[am_bullets] >= 50)
+ return false;
+
+ player->ammo[am_bullets] = 50;
break;
- // gold 50
- case SPR_CHST:
- for(i = 0; i < 50; i++)
- P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+ case MT_TOKEN_HEALTH: // Health token - from the Front's doctor
+ if(!P_GiveBody(player, healthamounts[gameskill]))
+ return false;
break;
- // ???
- case SPR_HELT:
- P_GiveInventoryItem(player, SPR_HELT, MT_TOKEN_TOUGHNESS);
- P_GiveInventoryItem(player, SPR_GUNT, MT_TOKEN_ACCURACY);
-
- // [STRIFE] TODO - verify
- for(i = 0; i < 5 * player->numinventory + 300; i++)
- P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+ case MT_TOKEN_ALARM: // Alarm token - particularly from the Oracle.
+ P_NoiseAlert(player->mo, player->mo);
+ A_AlertSpectreC(dialogtalker); // BUG: assumes in a dialog o_O
break;
- // metal armor
- case SPR_ARM1:
- if(!P_GiveArmor(player, -2))
- P_GiveInventoryItem(player, sprnum, type);
+ case MT_TOKEN_DOOR1: // Door special 1
+ junk.tag = 222;
+ EV_DoDoor(&junk, open);
break;
- // leather armor
- case SPR_ARM2:
- if(!P_GiveArmor(player, -1))
+ case MT_TOKEN_PRISON_PASS: // Door special 1 - Prison pass
+ junk.tag = 223;
+ EV_DoDoor(&junk, open);
+ if(gamemap == 2) // If on Tarnhill, give Prison pass object
P_GiveInventoryItem(player, sprnum, type);
break;
- // communicator
- case SPR_COMM:
- if(!P_GivePower(player, pw_communicator))
- return false;
+ case MT_TOKEN_SHOPCLOSE: // Door special 3 - "Shop close" - unused?
+ junk.tag = 222;
+ EV_DoDoor(&junk, close);
break;
- // map
- case SPR_PMAP:
- if(!P_GivePower(player, pw_allmap))
- return false;
+ case MT_TOKEN_DOOR3: // Door special 4 (or 3? :P )
+ junk.tag = 224;
+ EV_DoDoor(&junk, close);
break;
- // rifle
- case SPR_RIFL:
- if(player->weaponowned[wp_rifle])
+ case MT_TOKEN_STAMINA: // Stamina upgrade
+ if(player->stamina >= 100)
return false;
- if(!P_GiveWeapon(player, wp_rifle, false))
- return false;
+ player->stamina += 10;
+ P_GiveBody(player, 200); // full healing
break;
- // flame thrower
- case SPR_FLAM:
- if(player->weaponowned[wp_flame])
+ case MT_TOKEN_NEW_ACCURACY: // Accuracy upgrade
+ if(player->accuracy >= 100)
return false;
- if(!P_GiveWeapon(player, wp_flame, false))
- return false;
+ player->accuracy += 10;
break;
- // missile launcher
- case SPR_MMSL:
- if(player->weaponowned[wp_missile])
- return false;
-
- if(!P_GiveWeapon(player, wp_missile, false))
- return false;
+ case MT_SLIDESHOW: // Slideshow (start a finale)
+ gameaction = ga_victory;
+ if(gamemap == 10)
+ P_GiveItemToPlayer(player, SPR_TOKN, MT_TOKEN_QUEST17);
break;
+
+ default: // The default is to just give it as an inventory item.
+ P_GiveInventoryItem(player, sprnum, type);
+ break;
+ }
+ break;
- // mauler
- case SPR_TRPD:
- if(player->weaponowned[wp_mauler])
- return false;
+ default: // The ultimate default: Give it as an inventory item.
+ if(!P_GiveInventoryItem(player, sprnum, type))
+ return false;
+ break;
+ }
- if(!P_GiveWeapon(player, wp_mauler, false))
- return false;
- break;
+ // Play sound.
+ if(player == &players[consoleplayer])
+ S_StartSound(NULL, sound);
- // crossbow
- case SPR_CBOW:
- if(player->weaponowned[wp_elecbow])
- return false;
+ return true;
- if(!P_GiveWeapon(player, wp_elecbow, false))
- return false;
- break;
+ // check for other types
+ /*
+ switch(type)
+ {
+ // severed hand
+ // 300 gold
+
+ // ammo refill (at training)
+
+ // health refill (at front HQ)
+
+ // alarm
+
+ // door special 1
+
+ // door special 2
+
+ // door special 3
+
+ // door special 4
+
+ // stamina upgrade
+
+ // slideshow
+
+ default:
+ // check for sprites if no specific type is found
+ switch(sprnum)
+ {
+ // bullets
+
+ // box of bullets
+
+ // missile
+
+ // box of missiles
+
+ // battery
+
+
+
+ // backpack
+
+ // communicator
+
+
+ // rifle
+
+ // flame thrower
+
+ // missile launcher
+
+ // mauler
+
+
// misc item
default:
if(!P_GiveInventoryItem(player, sprnum, type))
@@ -988,6 +1052,7 @@
S_StartSound(player->mo, sfx_itemup);
return true;
+ */
}
//
--- a/src/strife/p_inter.c
+++ b/src/strife/p_inter.c
@@ -418,7 +418,7 @@
if(delta > toucher->height || delta < -8*FRACUNIT)
return; // out of reach
- sound = sfx_itemup;
+ sound = sfx_itemup;
player = toucher->player;
// Dead thing touching.
--- a/src/strife/s_sound.c
+++ b/src/strife/s_sound.c
@@ -480,7 +480,7 @@
}
// kill old sound
- S_StopSound(origin);
+ //S_StopSound(origin);
// try to find a channel
cnum = S_GetChannel(origin, sfx, false); // haleyjd: not a voice.