summaryrefslogtreecommitdiff
path: root/src/strife
diff options
context:
space:
mode:
authorSamuel Villareal2010-09-11 07:48:27 +0000
committerSamuel Villareal2010-09-11 07:48:27 +0000
commitad87636e1296e525f3a3979e5f0d00d16f2c54fc (patch)
tree72a17d9fff0d006a7c6e9081b5b4dbd1d1a1d6de /src/strife
parent993520eecddbdddddb1a562646c755e1efd0fa29 (diff)
downloadchocolate-doom-ad87636e1296e525f3a3979e5f0d00d16f2c54fc.tar.gz
chocolate-doom-ad87636e1296e525f3a3979e5f0d00d16f2c54fc.tar.bz2
chocolate-doom-ad87636e1296e525f3a3979e5f0d00d16f2c54fc.zip
+ P_GivePower update
+ Power tics implemented + Power enums implemented + More inventory functions implemented Subversion-branch: /branches/strife-branch Subversion-revision: 2061
Diffstat (limited to 'src/strife')
-rw-r--r--src/strife/doomdef.h13
-rw-r--r--src/strife/p_dialog.c8
-rw-r--r--src/strife/p_inter.c97
-rw-r--r--src/strife/p_pspr.h2
-rw-r--r--src/strife/p_user.c206
-rw-r--r--src/strife/st_stuff.c2
6 files changed, 270 insertions, 58 deletions
diff --git a/src/strife/doomdef.h b/src/strife/doomdef.h
index 1423bf51..536e99d3 100644
--- a/src/strife/doomdef.h
+++ b/src/strife/doomdef.h
@@ -185,14 +185,15 @@ typedef enum
// Power up artifacts.
+// villsa [STRIFE]
typedef enum
{
- pw_invulnerability,
pw_strength,
pw_invisibility,
pw_ironfeet,
pw_allmap,
- pw_infrared,
+ pw_communicator,
+ pw_targeter,
NUMPOWERS
} powertype_t;
@@ -206,10 +207,10 @@ typedef enum
//
typedef enum
{
- INVULNTICS = (30*TICRATE),
- INVISTICS = (60*TICRATE),
- INFRATICS = (120*TICRATE),
- IRONTICS = (60*TICRATE)
+ INVISTICS = (55*TICRATE), // villsa [STRIFE] changed from 60 to 55
+ IRONTICS = (80*TICRATE), // villsa [STRIFE] changed from 60 to 80
+ PMUPTICS = (80*TICRATE), // villsa [STRIFE]
+ TARGTICS = (160*TICRATE),// villsa [STRIFE]
} powerduration_t;
diff --git a/src/strife/p_dialog.c b/src/strife/p_dialog.c
index 08de3cb1..8e4b1bc1 100644
--- a/src/strife/p_dialog.c
+++ b/src/strife/p_dialog.c
@@ -915,14 +915,14 @@ boolean P_GiveItemToPlayer(player_t *player, int sprnum, mobjtype_t type)
// communicator
case SPR_COMM:
- //if(!P_GivePower(player)) // [STRIFE] TODO
- // return false;
+ if(!P_GivePower(player, pw_communicator))
+ return false;
break;
// map
case SPR_PMAP:
- //if(!P_GivePower(player)) // [STRIFE] TODO
- // return false;
+ if(!P_GivePower(player, pw_allmap))
+ return false;
break;
// rifle
diff --git a/src/strife/p_inter.c b/src/strife/p_inter.c
index ae6dc774..ae8fbc31 100644
--- a/src/strife/p_inter.c
+++ b/src/strife/p_inter.c
@@ -273,62 +273,80 @@ P_GiveArmor
//
// P_GiveCard
//
-void
-P_GiveCard
-( player_t* player,
- card_t card )
+boolean P_GiveCard(player_t* player, card_t card)
{
if (player->cards[card])
- return;
+ return false;
- player->bonuscount = BONUSADD;
+ // villsa [STRIFE] multiply by 2
+ player->bonuscount = BONUSADD * 2;
player->cards[card] = 1;
+
+ return true;
}
//
// P_GivePower
//
-boolean
-P_GivePower
-( player_t* player,
- int /*powertype_t*/ power )
+boolean P_GivePower(player_t* player, powertype_t power)
{
- if (power == pw_invulnerability)
+ // villsa [STRIFE]
+ if(power == pw_targeter)
{
- player->powers[power] = INVULNTICS;
- return true;
+ player->powers[power] = TARGTICS;
+ P_SetPsprite(player, ps_targcenter, S_TRGT_00); // 10
+ P_SetPsprite(player, ps_targleft, S_TRGT_01); // 11
+ P_SetPsprite(player, ps_targright, S_TRGT_02); // 12
+
+ player->psprites[ps_targcenter].sx = (160*FRACUNIT);
+ player->psprites[ps_targleft].sy = (100*FRACUNIT);
+ player->psprites[ps_targcenter].sy = (100*FRACUNIT);
+ player->psprites[ps_targright].sy = (100*FRACUNIT);
+ return true;
}
-
- if (power == pw_invisibility)
+
+ if(power == pw_invisibility)
{
- player->powers[power] = INVISTICS;
- player->mo->flags |= MF_SHADOW;
- return true;
+ player->powers[power] = INVISTICS;
+ player->mo->flags |= MF_SHADOW;
+ return true;
}
-
- if (power == pw_infrared)
+
+ if(power == pw_ironfeet)
{
- player->powers[power] = INFRATICS;
- return true;
+ player->powers[power] = IRONTICS;
+ return true;
}
-
- if (power == pw_ironfeet)
+
+ if(power == pw_strength)
{
- player->powers[power] = IRONTICS;
- return true;
+ P_GiveBody(player, 100);
+ player->powers[power] = 1;
+ return true;
}
-
- if (power == pw_strength)
+
+ // villsa [STRIFE]
+ if(power == pw_allmap)
{
- P_GiveBody (player, 100);
- player->powers[power] = 1;
- return true;
+ if(gamemap < 40)
+ player->mapstate[gamemap] = 1;
+
+ player->powers[power] = 1;
+ return true;
}
-
+
+ // villsa [STRIFE]
+ if(power == pw_communicator)
+ {
+ player->powers[power] = 1;
+ return true;
+ }
+
+
if (player->powers[power])
- return false; // already got it
-
+ return false; // already got it
+
player->powers[power] = 1;
return true;
}
@@ -864,13 +882,10 @@ P_DamageMobj
// Below certain threshold,
- // ignore damage in GOD mode, or with INVUL power.
- if ( damage < 1000
- && ( (player->cheats&CF_GODMODE)
- || player->powers[pw_invulnerability] ) )
- {
- return;
- }
+ // ignore damage in GOD mode.
+ // villsa [STRIFE] removed pw_invulnerability check
+ if(damage < 1000 && (player->cheats & CF_GODMODE))
+ return;
if (player->armortype)
{
diff --git a/src/strife/p_pspr.h b/src/strife/p_pspr.h
index e88e7413..373831a1 100644
--- a/src/strife/p_pspr.h
+++ b/src/strife/p_pspr.h
@@ -63,9 +63,9 @@ typedef enum
{
ps_weapon,
ps_flash,
+ ps_targcenter, // villsa [STRIFE]
ps_targleft, // villsa [STRIFE]
ps_targright, // villsa [STRIFE]
- ps_targcenter, // villsa [STRIFE]
NUMPSPRITES
} psprnum_t;
diff --git a/src/strife/p_user.c b/src/strife/p_user.c
index 41d77a63..704985e6 100644
--- a/src/strife/p_user.c
+++ b/src/strife/p_user.c
@@ -31,8 +31,8 @@
#include "doomdef.h"
#include "d_event.h"
-
#include "p_local.h"
+#include "sounds.h" // villsa [STRIFE]
#include "p_dialog.h" // villsa [STRIFE]
#include "doomstat.h"
@@ -47,6 +47,8 @@
void P_DropInventoryItem(player_t* player, int sprite); // villsa [STRIFE]
+boolean P_ItemBehavior(player_t* player, int item); // villsa [STRIFE]
+static char useinventorymsg[44]; // villsa [STRIFE]
//
// Movement.
@@ -469,15 +471,17 @@ void P_PlayerThink (player_t* player)
if (player->powers[pw_strength])
player->powers[pw_strength]++;
- if (player->powers[pw_invulnerability])
- player->powers[pw_invulnerability]--;
+ // villsa [STRIFE] unused
+ /*if (player->powers[pw_invulnerability])
+ player->powers[pw_invulnerability]--;*/
if (player->powers[pw_invisibility])
if (! --player->powers[pw_invisibility] )
player->mo->flags &= ~MF_SHADOW;
- if (player->powers[pw_infrared])
- player->powers[pw_infrared]--;
+ // villsa [STRIFE] unused
+ /*if (player->powers[pw_infrared])
+ player->powers[pw_infrared]--;*/
if (player->powers[pw_ironfeet])
player->powers[pw_ironfeet]--;
@@ -657,9 +661,201 @@ void P_DropInventoryItem(player_t* player, int sprite)
}
//
+// P_TossDegninOre
+// villsa [STRIFE] new function
+//
+boolean P_TossDegninOre(player_t* player)
+{
+ angle_t angle;
+ mobj_t* mo;
+ mobj_t* ore;
+ fixed_t x;
+ fixed_t y;
+ fixed_t z;
+ fixed_t dist;
+
+ angle = player->mo->angle >> ANGLETOFINESHIFT;
+
+ if(angle < 7618 && angle >= 6718)
+ angle = 7618;
+
+ else if(angle < 5570 && angle >= 4670)
+ angle = 5570;
+
+ else if(angle < 3522 && angle >= 2622)
+ angle = 3522;
+
+ else if(angle < 1474 && angle >= 574)
+ angle = 1474;
+
+ mo = player->mo;
+ dist = mobjinfo[MT_DEGNINORE].radius + mo->info->radius + (4*FRACUNIT);
+
+ x = mo->x + FixedMul(finecosine[angle], dist);
+ y = mo->y + FixedMul(finesine[angle], dist);
+ z = mo->z + (10*FRACUNIT);
+ ore = P_SpawnMobj(x, y, z, MT_DEGNINORE);
+
+ if(P_CheckPosition(ore, x, y))
+ {
+ ore->target = mo;
+ ore->angle = (angle << ANGLETOFINESHIFT);
+ ore->momx = FixedMul(finecosine[angle], (5*FRACUNIT));
+ ore->momy = FixedMul(finesine[angle], (5*FRACUNIT));
+ ore->momz = FRACUNIT;
+ return true;
+ }
+ else
+ P_RemoveMobj(ore);
+
+ return false;
+}
+
+//
+// P_SpawnTeleportBeacon
+// villsa [STRIFE] new function
+//
+boolean P_SpawnTeleportBeacon(player_t* player)
+{
+ angle_t angle;
+ int r;
+ mobj_t* mo;
+ mobj_t* beacon;
+ fixed_t x;
+ fixed_t y;
+ fixed_t z;
+ fixed_t dist;
+
+ angle = player->mo->angle;
+ r = P_Random();
+ angle = (angle + ((r - P_Random()) << 18)) >> ANGLETOFINESHIFT;
+
+ if(angle < 7618 && angle >= 6718)
+ angle = 7618;
+
+ else if(angle < 5570 && angle >= 4670)
+ angle = 5570;
+
+ else if(angle < 3522 && angle >= 2622)
+ angle = 3522;
+
+ else if(angle < 1474 && angle >= 574)
+ angle = 1474;
+
+ mo = player->mo;
+ dist = mobjinfo[MT_BEACON].radius + mo->info->radius + (4*FRACUNIT);
+
+ x = mo->x + FixedMul(finecosine[angle], dist);
+ y = mo->y + FixedMul(finesine[angle], dist);
+ z = mo->z + (10*FRACUNIT);
+ beacon = P_SpawnMobj(x, y, z, MT_BEACON);
+
+ if(P_CheckPosition(beacon, x, y))
+ {
+ beacon->target = mo;
+ beacon->miscdata = mo->miscdata;
+ beacon->angle = (angle << ANGLETOFINESHIFT);
+ beacon->momx = FixedMul(finecosine[angle], (5*FRACUNIT));
+ beacon->momy = FixedMul(finesine[angle], (5*FRACUNIT));
+ beacon->momz = FRACUNIT;
+ P_SetMobjState(beacon, beacon->info->seestate);
+ return true;
+ }
+ else
+ P_RemoveMobj(beacon);
+
+ return false;
+}
+
+//
// P_UseInventoryItem
// villsa [STRIFE] new function
//
boolean P_UseInventoryItem(player_t* player, int item)
{
+ int i;
+ char* name;
+
+ if(player->cheats & CF_ONFIRE)
+ return false;
+
+ for(i = 0; i < player->numinventory; i++)
+ {
+ if(item != player->inventory[i].sprite)
+ continue;
+
+ if(!P_ItemBehavior(player, item))
+ return false;
+
+ name = P_RemoveInventoryItem(player, i, 1);
+ if(name == NULL)
+ name = "Item";
+
+ sprintf(useinventorymsg, "You used the %s.", name);
+ player->message = useinventorymsg;
+
+ if(player == &players[consoleplayer])
+ S_StartSound(NULL, sfx_itemup);
+
+ return true;
+ }
+
+ return false;
+}
+
+//
+// P_ItemBehavior
+// villsa [STRIFE] new function
+//
+boolean P_ItemBehavior(player_t* player, int item)
+{
+ switch(item)
+ {
+ case SPR_ARM1: // 136
+ return P_GiveArmor(player, 2);
+ break;
+
+ case SPR_ARM2: // 137
+ return P_GiveArmor(player, 1);
+ break;
+
+ case SPR_SHD1: // 186
+ return P_GivePower(player, pw_invisibility);
+ break;
+
+ case SPR_MASK: // 187
+ return P_GivePower(player, pw_ironfeet);
+ break;
+
+ case SPR_PMUP: // 191
+ if(!player->powers[pw_allmap])
+ {
+ player->message = "The scanner won't work without a map!";
+ return false;
+ }
+ player->powers[pw_allmap] = PMUPTICS;
+ break;
+
+ case SPR_STMP: // 180
+ return P_GiveBody(player, 10);
+ break;
+
+ case SPR_MDKT: // 181
+ return P_GiveBody(player, 25);
+ break;
+
+ case SPR_FULL: // 130
+ return P_GiveBody(player, 200);
+ break;
+
+ case SPR_BEAC: // 135
+ return P_SpawnTeleportBeacon(player);
+ break;
+
+ case SPR_TARG: // 108
+ return P_GivePower(player, pw_targeter);
+ break;
+ }
+
+ return true;
} \ No newline at end of file
diff --git a/src/strife/st_stuff.c b/src/strife/st_stuff.c
index 1af8a485..c8aac617 100644
--- a/src/strife/st_stuff.c
+++ b/src/strife/st_stuff.c
@@ -462,7 +462,7 @@ ST_Responder (event_t* ev)
{
// villsa [STRIFE] unused
//plyr->weaponowned[wp_chainsaw] = true;
- plyr->powers[pw_invulnerability] = true;
+ //plyr->powers[pw_invulnerability] = true;
plyr->message = DEH_String(STSTR_CHOPPERS);
}
// 'mypos' for player position