⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p_user.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 3 页
字号:
#endif        cmd->forwardmove = 0xc800/512;        cmd->sidemove = 0;        player->mo->flags &= ~MF_JUSTATTACKED;    }    if (player->playerstate == PST_REBORN)#ifdef PARANOIA        I_Error("player %d is in PST_REBORN\n");#else        // it is not "normal" but far to be critical        return;#endif    if (player->playerstate == PST_DEAD)    {        //Fab:25-04-98: show the dm rankings while dead, only in deathmatch        if (player==&players[displayplayer])            playerdeadview = true;        P_DeathThink (player);        //added:26-02-98:camera may still move when guy is dead        if (camera.chase)            P_MoveChaseCamera (&players[displayplayer]);        return;    }    else        if (player==&players[displayplayer])            playerdeadview = false;    if( player->chickenTics )        P_ChickenPlayerThink(player);    // check water content, set stuff in mobj    P_MobjCheckWater (player->mo);    // Move around.    // Reactiontime is used to prevent movement    //  for a bit after a teleport.    if (player->mo->reactiontime)        player->mo->reactiontime--;    else        P_MovePlayer (player);    //added:22-02-98: bob view only if looking by the marine's eyes#ifndef CLIENTPREDICTION2    if (!camera.chase)        P_CalcHeight (player);#endif    //added:26-02-98: calculate the camera movement    if (camera.chase && player==&players[displayplayer])        P_MoveChaseCamera (&players[displayplayer]);    // check special sectors : damage & secrets    P_PlayerInSpecialSector (player);    //    // water splashes    //    if (demoversion>=125 && player->specialsector >= 887 &&                            player->specialsector <= 888)    {        if ((player->mo->momx >  (2*FRACUNIT) ||             player->mo->momx < (-2*FRACUNIT) ||             player->mo->momy >  (2*FRACUNIT) ||             player->mo->momy < (-2*FRACUNIT) ||             player->mo->momz >  (2*FRACUNIT)) &&  // jump out of water             !(gametic % (32 * NEWTICRATERATIO)) )        {            //            // make sur we disturb the surface of water (we touch it)            //            if (player->specialsector==887)                //FLAT TEXTURE 'FWATER'                waterz = player->mo->subsector->sector->floorheight + (FRACUNIT/4);            else                //faB's current water hack using negative sector tags                waterz = - (player->mo->subsector->sector->tag << FRACBITS);            // half in the water            if(player->mo->eflags & MF_TOUCHWATER)            {                if (player->mo->z <= player->mo->floorz) // onground                {                    fixed_t whater_height=waterz-player->mo->subsector->sector->floorheight;                    if( whater_height<(player->mo->height>>2 ))                        S_StartSound (player->mo, sfx_splash);                    else                        S_StartSound (player->mo, sfx_floush);                }                else                    S_StartSound (player->mo, sfx_floush);            }                           }    }    // Check for weapon change.//#ifndef CLIENTPREDICTION2    if (cmd->buttons & BT_CHANGE)//#endif    {        // The actual changing of the weapon is done        //  when the weapon psprite can do it        //  (read: not in the middle of an attack).        newweapon = (cmd->buttons&BT_WEAPONMASK)>>BT_WEAPONSHIFT;        if(demoversion<128)        {            if (newweapon == wp_fist                && player->weaponowned[wp_chainsaw]                && !(player->readyweapon == wp_chainsaw                     && player->powers[pw_strength]))            {                newweapon = wp_chainsaw;            }                    if ( (gamemode == commercial)                && newweapon == wp_shotgun                && player->weaponowned[wp_supershotgun]                && player->readyweapon != wp_supershotgun)            {                newweapon = wp_supershotgun;            }        }        else        {            if(cmd->buttons&BT_EXTRAWEAPON)               switch(newweapon) {                  case wp_shotgun :                        if( gamemode == commercial && player->weaponowned[wp_supershotgun])                           newweapon = wp_supershotgun;                       break;                  case wp_fist :                       if( player->weaponowned[wp_chainsaw])                           newweapon = wp_chainsaw;                       break;                  default:                       break;               }        }        if (player->weaponowned[newweapon]            && newweapon != player->readyweapon)        {            // Do not go to plasma or BFG in shareware,            //  even if cheated.            if ((newweapon != wp_plasma                 && newweapon != wp_bfg)                || (gamemode != shareware) )            {                player->pendingweapon = newweapon;            }        }    }    // check for use    if (cmd->buttons & BT_USE)    {        if (!player->usedown)        {            P_UseLines (player);            player->usedown = true;        }    }    else        player->usedown = false;    // Chicken counter    if(player->chickenTics)    {        // Chicken attack counter        if(player->chickenPeck)            player->chickenPeck -= 3;        // Attempt to undo the chicken        if(!--player->chickenTics)            P_UndoPlayerChicken(player);    }    // cycle psprites    P_MovePsprites (player);    // Counters, time dependend power ups.    // Strength counts up to diminish fade.    if (player->powers[pw_strength])        player->powers[pw_strength]++;    if (player->powers[pw_invulnerability])        player->powers[pw_invulnerability]--;    // the MF_SHADOW activates the tr_transhi translucency while it is set    // (it doesnt use a preset value through FF_TRANSMASK)    if (player->powers[pw_invisibility])        if (! --player->powers[pw_invisibility] )            player->mo->flags &= ~MF_SHADOW;    if (player->powers[pw_infrared])        player->powers[pw_infrared]--;    if (player->powers[pw_ironfeet])        player->powers[pw_ironfeet]--;    if (player->powers[pw_flight])    {        if(!--player->powers[pw_flight])        {/* HERETODO            if(player->mo->z != player->mo->floorz)                player->centering = true;*/                        player->mo->flags2 &= ~MF2_FLY;            player->mo->flags &= ~MF_NOGRAVITY;           // BorderTopRefresh = true; //make sure the sprite's cleared out        }    }    if(player->powers[pw_weaponlevel2])    {        if(!--player->powers[pw_weaponlevel2])        {            player->weaponinfo = wpnlev1info;            // end of weaponlevel2 power            if((player->readyweapon == wp_phoenixrod)                && (player->psprites[ps_weapon].state                != &states[S_PHOENIXREADY])                && (player->psprites[ps_weapon].state                != &states[S_PHOENIXUP]))            {                P_SetPsprite(player, ps_weapon, S_PHOENIXREADY);                player->ammo[am_phoenixrod] -= USE_PHRD_AMMO_2;                player->refire = 0;            }            else if((player->readyweapon == wp_gauntlets)                || (player->readyweapon == wp_staff))            {                player->pendingweapon = player->readyweapon;            }            //BorderTopRefresh = true;        }    }    if (player->damagecount)        player->damagecount--;    if (player->bonuscount)        player->bonuscount--;    // Handling colormaps.    if (player->powers[pw_invulnerability])    {        if (player->powers[pw_invulnerability] > BLINKTHRESHOLD            || (player->powers[pw_invulnerability]&8) )            player->fixedcolormap = INVERSECOLORMAP;        else            player->fixedcolormap = 0;    }    else if (player->powers[pw_infrared])    {        if (player->powers[pw_infrared] > BLINKTHRESHOLD            || (player->powers[pw_infrared]&8) )        {            // almost full bright            player->fixedcolormap = 1;        }        else            player->fixedcolormap = 0;    }    else        player->fixedcolormap = 0;}//----------------------------------------------------------------------------//// PROC P_PlayerNextArtifact////----------------------------------------------------------------------------void P_PlayerNextArtifact(player_t *player){    player->inv_ptr--;    if(player->inv_ptr < 6)    {        player->st_curpos--;        if(player->st_curpos < 0)            player->st_curpos = 0;    }    if(player->inv_ptr < 0)    {        player->inv_ptr = player->inventorySlotNum-1;        if(player->inv_ptr < 6)            player->st_curpos = player->inv_ptr;        else            player->st_curpos = 6;    }}//----------------------------------------------------------------------------//// PROC P_PlayerRemoveArtifact////----------------------------------------------------------------------------static void P_PlayerRemoveArtifact(player_t *player, int slot){    int i;        if(!(--player->inventory[slot].count))    { // Used last of a type - compact the artifact list        player->inventory[slot].type = arti_none;        for(i = slot+1; i < player->inventorySlotNum; i++)            player->inventory[i-1] = player->inventory[i];        player->inventorySlotNum--;        // Set position markers and get next readyArtifact        player->inv_ptr--;        if(player->inv_ptr < 6)        {            player->st_curpos--;            if( player->st_curpos < 0 )                player->st_curpos = 0;        }        if( player->inv_ptr >= player->inventorySlotNum)            player->inv_ptr = player->inventorySlotNum-1;        if( player->inv_ptr < 0)            player->inv_ptr = 0;    }}//----------------------------------------------------------------------------//// PROC P_PlayerUseArtifact////----------------------------------------------------------------------------extern int ArtifactFlash;void P_PlayerUseArtifact(player_t *player, artitype_t arti){    int i;        for(i = 0; i < player->inventorySlotNum; i++)    {        if(player->inventory[i].type == arti)        { // Found match - try to use            if(P_UseArtifact(player, arti))            { // Artifact was used - remove it from inventory                P_PlayerRemoveArtifact(player, i);                if(player == &players[consoleplayer]                 || player == &players[secondarydisplayplayer] )                {                    S_StartSound(NULL, sfx_artiuse);                    ArtifactFlash = 4;                }            }            else            { // Unable to use artifact, advance pointer                P_PlayerNextArtifact(player);            }            break;        }    }}//----------------------------------------------------------------------------//// PROC P_ArtiTele////----------------------------------------------------------------------------void P_ArtiTele(player_t *player){    int i;    fixed_t destX;    fixed_t destY;    angle_t destAngle;        if(cv_deathmatch.value)    {        i = P_Random()%numdmstarts;        destX = deathmatchstarts[i]->x<<FRACBITS;        destY = deathmatchstarts[i]->y<<FRACBITS;        destAngle = ANG45*(deathmatchstarts[i]->angle/45);    }    else    {        destX = playerstarts[0]->x<<FRACBITS;        destY = playerstarts[0]->y<<FRACBITS;        destAngle = ANG45*(playerstarts[0]->angle/45);    }    P_Teleport(player->mo, destX, destY, destAngle);    S_StartSound(NULL, sfx_wpnup); // Full volume laugh}//----------------------------------------------------------------------------//// FUNC P_UseArtifact//// Returns true if artifact was used.////----------------------------------------------------------------------------boolean P_UseArtifact(player_t *player, artitype_t arti){    mobj_t *mo;    angle_t angle;        switch(arti)    {    case arti_invulnerability:        if(!P_GivePower(player, pw_invulnerability))        {            return(false);        }        break;    case arti_invisibility:        if(!P_GivePower(player, pw_invisibility))        {            return(false);        }        break;    case arti_health:        if(!P_GiveBody(player, 25))        {            return(false);        }        break;    case arti_superhealth:        if(!P_GiveBody(player, 100))        {            return(false);        }        break;    case arti_tomeofpower:        if(player->chickenTics)        { // Attempt to undo chicken            if(P_UndoPlayerChicken(player) == false)            { // Failed                P_DamageMobj(player->mo, NULL, NULL, 10000);            }            else            { // Succeeded                player->chickenTics = 0;#ifdef XPEREMNTAL_HW3S                S_StartScreamSound(player->mo, sfx_wpnup);#else                S_StartSound(player->mo, sfx_wpnup);#endif            }        }        else        {            if(!P_GivePower(player, pw_weaponlevel2))            {                return(false);            }            if(player->readyweapon == wp_staff)            {                P_SetPsprite(player, ps_weapon, S_STAFFREADY2_1);            }            else if(player->readyweapon == wp_gauntlets)            {                P_SetPsprite(player, ps_weapon, S_GAUNTLETREADY2_1);            }        }        break;    case arti_torch:        if(!P_GivePower(player, pw_infrared))        {            return(false);        }        break;    case arti_firebomb:        angle = player->mo->angle>>ANGLETOFINESHIFT;        mo = P_SpawnMobj(player->mo->x+24*finecosine[angle],            player->mo->y+24*finesine[angle], player->mo->z - 15*FRACUNIT*            ((player->mo->flags2&MF2_FEETARECLIPPED) != 0), MT_FIREBOMB);        mo->target = player->mo;        break;    case arti_egg:        mo = player->mo;        P_SpawnPlayerMissile(mo, MT_EGGFX);        P_SPMAngle(mo, MT_EGGFX, mo->angle-(ANG45/6));        P_SPMAngle(mo, MT_EGGFX, mo->angle+(ANG45/6));        P_SPMAngle(mo, MT_EGGFX, mo->angle-(ANG45/3));        P_SPMAngle(mo, MT_EGGFX, mo->angle+(ANG45/3));        break;    case arti_fly:        if(!P_GivePower(player, pw_flight))        {            return(false);        }        break;    case arti_teleport:        P_ArtiTele(player);        break;    default:        return(false);    }    return(true);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -