shithub: choc

Download patch

ref: 939706506562843669ea2bb5b8205e32d56f9972
parent: dac020ba99222b13a320cd04f2bac6d842a610f1
author: Samuel Villareal <svkaiser@gmail.com>
date: Fri Sep 10 01:06:06 EDT 2010

+ P_GiveItemToPlayer fleshed out
+ Key enumerations added

Subversion-branch: /branches/strife-branch
Subversion-revision: 2057

--- a/src/strife/doomdef.h
+++ b/src/strife/doomdef.h
@@ -104,18 +104,38 @@
 //
 // Key cards.
 //
-// STRIFE-TODO: A hell of a bunch of keys.
+// villsa [STRIFE]
 typedef enum
 {
-    it_bluecard,
-    it_yellowcard,
-    it_redcard,
-    it_blueskull,
-    it_yellowskull,
-    it_redskull,
-    
+    key_BaseKey,
+    key_GovsKey,
+    key_Passcard,
+    key_IDBadge,
+    key_PrisonKey,
+    key_SeveredHand,
+    key_Power1Key,
+    key_Power2Key,
+    key_Power3Key,
+    key_GoldKey,
+    key_IDCard,
+    key_SilverKey,
+    key_OracleKey,
+    key_MilitaryID,
+    key_OrderKey,
+    key_WarehouseKey,
+    key_BrassKey,
+    key_RedCrystalKey,
+    key_BlueCrystalKey,
+    key_ChapelKey,
+    key_CatacombKey,
+    key_SecurityKey,
+    key_CoreKey,
+    key_MaulerKey,
+    key_FactoryKey,
+    key_MineKey,
+    key_NewKey5,
+
     NUMCARDS
-    
 } card_t;
 
 
--- a/src/strife/p_dialog.c
+++ b/src/strife/p_dialog.c
@@ -109,6 +109,9 @@
 // Text at the end of the choices
 char dialoglastmsgbuffer[48];
 
+// Item to display to player when picked up or recieved
+char pickupstring[46];
+
 //=============================================================================
 //
 // Dialog State Sets
@@ -602,19 +605,79 @@
 //
 // [STRIFE] New function
 // haleyjd 09/03/10: Give an inventory item to the player, if possible.
+// villsa 09/09/10: Fleshed out routine
 //
-boolean P_GiveInventoryItem(player_t *player, int a2, int a3)
+boolean P_GiveInventoryItem(player_t *player, int sprnum, mobjtype_t type)
 {
-    int v3  = 0;
-    int v15 = a2;
-    int v4  = a3;
+    int curinv = 0;
+    int i;
+    boolean ok = false;
+    mobjtype_t item = 0;
+    inventory_t* invtail;
 
     // repaint the status bar due to inventory changing
     player->st_update = true;
 
-    // STRIFE-TODO: do an insertion sort on the inventory...
-    // Too bad the code is nearly impossible to understand!!!
+    while(1)
+    {
+        // inventory is full
+        if(curinv > player->numinventory)
+            return true;
 
+        item = player->inventory[curinv].type;
+        if(type < item)
+        {
+            if(curinv != MAXINVENTORYSLOTS)
+            {
+                // villsa - sort inventory item if needed
+                invtail = &player->inventory[player->numinventory - 1];
+                if(player->numinventory >= (curinv + 1))
+                {
+                    for(i = player->numinventory; i >= (curinv + 1); --i)    
+                    {
+                        invtail[1].sprite   = invtail[0].sprite;
+                        invtail[1].type     = invtail[0].type;
+                        invtail[1].amount   = invtail[0].amount;
+
+                        invtail--;
+                    }
+                }
+
+                // villsa - add inventory item
+                player->inventory[curinv].amount = 1;
+                player->inventory[curinv].sprite = sprnum;
+                player->inventory[curinv].type = type;
+
+                // sort cursor if needed
+                if(player->numinventory)
+                {
+                    if(curinv <= player->inventorycursor)
+                        player->inventorycursor++;
+                }
+
+                player->numinventory++;
+
+                return true;
+            }
+
+            return false;
+        }
+
+        if(type == item)
+            break;
+
+        curinv++;
+    }
+
+    // check amount of inventory item by using the mass from mobjinfo
+    if(player->inventory[curinv].amount < mobjinfo[item].mass)
+    {
+        player->inventory[curinv].amount++;
+        ok = true;
+    }
+    else
+        ok = false;
+
     return true;
 }
 
@@ -624,10 +687,253 @@
 // [STRIFE] New function
 // haleyjd 09/03/10: Sorts out how to give something to the player.
 // Not strictly just for inventory items.
+// villsa 09/09/10: Fleshed out function
 //
 boolean P_GiveItemToPlayer(player_t *player, int sprnum, mobjtype_t type)
 {
-    // haleyjd: STRIFE-TODO
+    int i = 0;
+    line_t junk;
+    boolean ok = true;
+
+    if(mobjinfo[type].flags & MF_GIVEQUEST)
+        player->questflags |= 1 << (mobjinfo[type].speed - 1);
+
+    if(type >= MT_KEY_BASE && type <= MT_NEWKEY5)
+    {
+        P_GiveCard(player, type - MT_KEY_BASE);
+        return true;
+    }
+
+    if(type >= MT_TOKEN_QUEST1 && type <= MT_TOKEN_QUEST31)
+    {
+        if(mobjinfo[type].name)
+        {
+            strncpy(pickupstring, mobjinfo[type].name, 39);
+            player->message = pickupstring;
+        }
+        player->questflags |= 1 << (type - MT_TOKEN_QUEST1);
+    }
+    else switch(type)
+    {
+    case MT_KEY_HAND:
+        P_GiveCard(player, key_SeveredHand);
+        break;
+
+    case MT_MONY_300:
+        for(i = 0; i < 300; i++)
+            P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+        break;
+
+    case MT_TOKEN_AMMO:
+        if(player->ammo[am_bullets] >= 50)
+            return false;
+
+        player->ammo[am_bullets] = 50;
+        break;
+
+    case MT_TOKEN_HEALTH:
+        // [STRIFE] TODO - add healthamounts array
+        //if(!P_GiveBody(player, healthamounts[gameskill]))
+        //    return false;
+        break;
+
+    case MT_TOKEN_ALARM:
+        P_NoiseAlert(player->mo, player->mo);
+        A_AlertSpectreC(dialogtalker);
+        break;
+
+    case MT_TOKEN_DOOR1:
+        junk.tag = 222;
+        EV_DoDoor(&junk, open);
+        break;
+
+    case MT_TOKEN_PRISON_PASS:
+        junk.tag = 223;
+        EV_DoDoor(&junk, open);
+        if(gamemap == 2)
+            P_GiveInventoryItem(player, sprnum, type);
+        break;
+
+    case MT_TOKEN_SHOPCLOSE:
+        junk.tag = 222;
+        EV_DoDoor(&junk, close);
+        break;
+
+    case MT_TOKEN_DOOR3:
+        junk.tag = 224;
+        EV_DoDoor(&junk, close);
+        break;
+
+    case MT_TOKEN_STAMINA:
+        if(player->stamina >= 100)
+            return false;
+
+        player->stamina += 10;
+        P_GiveBody(player, 200);
+        break;
+
+    case MT_TOKEN_NEW_ACCURACY:
+        if(player->accuracy >= 100)
+            return false;
+
+        player->accuracy += 10;
+        break;
+
+    case MT_SLIDESHOW:
+        gameaction = ga_victory;
+        if(gamemap == 10)
+            P_GiveItemToPlayer(player, SPR_TOKN, MT_TOKEN_QUEST17);
+        break;
+    }
+    
+    switch(sprnum)
+    {
+    case SPR_BLIT:
+        ok = P_GiveAmmo(player, am_bullets, 1);
+        break;
+
+    case SPR_BBOX:
+        ok = P_GiveAmmo(player, am_bullets, 5);
+        break;
+
+    case SPR_MSSL:
+        ok = P_GiveAmmo(player, am_missiles, 1);
+        break;
+
+    case SPR_ROKT:
+        ok = P_GiveAmmo(player, am_missiles, 5);
+        break;
+
+    case SPR_BRY1:
+        ok = P_GiveAmmo(player, am_cell, 1);
+        break;
+
+    case SPR_CPAC:
+        ok = P_GiveAmmo(player, am_cell, 5);
+        break;
+
+    case SPR_PQRL:
+        ok = P_GiveAmmo(player, am_poisonbolts, 5);
+        break;
+
+    case SPR_XQRL:
+        ok = P_GiveAmmo(player, am_elecbolts, 5);
+        break;
+
+    case SPR_GRN1:
+        ok = P_GiveAmmo(player, am_hegrenades, 1);
+        break;
+
+    case SPR_GRN2:
+        ok = P_GiveAmmo(player, am_wpgrenades, 1);
+        break;
+
+    case SPR_BKPK:
+        if(!player->backpack)
+        {
+            for(i = 0; i < NUMAMMO; i++)
+                player->maxammo[i] *= 2;
+
+            player->backpack = true;
+        }
+        for(i = 0; i < NUMAMMO; i++)
+	    P_GiveAmmo(player, i, 1);
+        break;
+
+    case SPR_COIN:
+        P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+        break;
+
+    case SPR_CRED:
+        for(i = 0; i < 10; i++)
+            P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+        break;
+
+    case SPR_SACK:
+        for(i = 0; i < 25; i++)
+            P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+        break;
+
+    case SPR_CHST:
+        for(i = 0; i < 50; i++)
+            P_GiveInventoryItem(player, SPR_COIN, MT_MONY_1);
+        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);
+        break;
+
+    case SPR_ARM1:
+        if(!P_GiveArmor(player, -2))
+            P_GiveInventoryItem(player, sprnum, type);
+        break;
+
+    case SPR_ARM2:
+        if(!P_GiveArmor(player, -1))
+            P_GiveInventoryItem(player, sprnum, type);
+        break;
+
+    case SPR_COMM:
+        //if(!P_GivePower(player)) // [STRIFE] TODO
+        //  return false;
+        break;
+
+    case SPR_PMAP:
+        //if(!P_GivePower(player)) // [STRIFE] TODO
+        //  return false;
+        break;
+
+    case SPR_RIFL:
+        if(player->weaponowned[wp_rifle])
+            return false;
+
+        if(!P_GiveWeapon(player, wp_rifle, false))
+            return false;
+      break;
+
+    case SPR_FLAM:
+        if(player->weaponowned[wp_flame])
+            return false;
+
+        if(!P_GiveWeapon(player, wp_flame, false))
+            return false;
+      break;
+
+    case SPR_MMSL:
+        if(player->weaponowned[wp_missile])
+            return false;
+
+        if(!P_GiveWeapon(player, wp_missile, false))
+            return false;
+      break;
+
+    case SPR_TRPD:
+        if(player->weaponowned[wp_mauler])
+            return false;
+
+        if(!P_GiveWeapon(player, wp_mauler, false))
+            return false;
+      break;
+
+    case SPR_CBOW:
+        if(player->weaponowned[wp_elecbow])
+            return false;
+
+        if(!P_GiveWeapon(player, wp_elecbow, false))
+            return false;
+      break;
+
+    default:
+        if(!P_GiveInventoryItem(player, sprnum, type))
+            return false;
+    }
+
+    S_StartSound(player->mo, sfx_itemup);
     return true;
 }
 
--- a/src/strife/p_dialog.h
+++ b/src/strife/p_dialog.h
@@ -33,6 +33,8 @@
 
 #define OBJECTIVE_LEN       300
 
+#define MAXINVENTORYSLOTS   30
+
 #define MDLG_CHOICELEN      32
 #define MDLG_MSGLEN         80
 #define MDLG_NAMELEN        16
--- a/src/strife/p_doors.c
+++ b/src/strife/p_doors.c
@@ -212,7 +212,7 @@
     if (!p)
 	return 0;
 		
-    switch(line->special)
+/*    switch(line->special)
     {
       case 99:	// Blue Lock
       case 133:
@@ -250,7 +250,7 @@
 	    return 0;
 	}
 	break;	
-    }
+    }*/
 
     return EV_DoDoor(line,type);
 }
@@ -357,7 +357,7 @@
     //	Check for locks
     player = thing->player;
 		
-    switch(line->special)
+/*    switch(line->special)
     {
       case 26: // Blue Lock
       case 32:
@@ -398,7 +398,7 @@
 	    return;
 	}
 	break;
-    }
+    }*/
 	
     // if the sector has an active thinker, use it
     sec = sides[ line->sidenum[side^1]] .sector;