From ad87636e1296e525f3a3979e5f0d00d16f2c54fc Mon Sep 17 00:00:00 2001 From: Samuel Villareal Date: Sat, 11 Sep 2010 07:48:27 +0000 Subject: + P_GivePower update + Power tics implemented + Power enums implemented + More inventory functions implemented Subversion-branch: /branches/strife-branch Subversion-revision: 2061 --- src/strife/doomdef.h | 13 ++-- src/strife/p_dialog.c | 8 +- src/strife/p_inter.c | 97 ++++++++++++++---------- src/strife/p_pspr.h | 2 +- src/strife/p_user.c | 206 ++++++++++++++++++++++++++++++++++++++++++++++++-- src/strife/st_stuff.c | 2 +- 6 files changed, 270 insertions(+), 58 deletions(-) (limited to 'src/strife') 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]--; @@ -656,10 +660,202 @@ 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 -- cgit v1.2.3