Ejemplo n.º 1
0
dd_bool P_TakePower(player_t *player, powertype_t powerType)
{
    DENG_ASSERT(player != 0);
    DENG_ASSERT(powerType >= PT_FIRST && powerType < NUM_POWER_TYPES);

    if(!player->powers[powerType])
        return false; // Dont got it.

    switch(powerType)
    {
    case PT_ALLMAP:
        ST_RevealAutomap(player - players, false);
        break;

    case PT_FLIGHT: {
        mobj_t *plrmo = player->plr->mo;

        if(plrmo->origin[VZ] != plrmo->floorZ && cfg.lookSpring)
        {
            player->centering = true;
        }

        plrmo->flags2 &= ~MF2_FLY;
        plrmo->flags &= ~MF_NOGRAVITY;
        break; }

    default: break;
    }

    player->powers[powerType] = 0;
    player->update |= PSF_POWERS;

    return true;
}
Ejemplo n.º 2
0
dd_bool P_GivePower(player_t* player, int power)
{
    player->update |= PSF_POWERS;

    switch(power)
    {
    case PT_INVULNERABILITY:
        player->powers[power] = INVULNTICS;
        break;

    case PT_INVISIBILITY:
        player->powers[power] = INVISTICS;
        player->plr->mo->flags |= MF_SHADOW;;
        break;

    case PT_FLIGHT:
        player->powers[power] = 1;
        player->plr->mo->flags2 |= MF2_FLY;
        player->plr->mo->flags |= MF_NOGRAVITY;
        if(player->plr->mo->origin[VZ] <= player->plr->mo->floorZ)
        {
            player->flyHeight = 10; // Thrust the player in the air a bit.
            player->plr->mo->flags |= DDPF_FIXMOM;
        }
        break;

    case PT_INFRARED:
        player->powers[power] = INFRATICS;
        break;

    case PT_IRONFEET:
        player->powers[power] = IRONTICS;
        break;

    case PT_STRENGTH:
        P_GiveBody(player, maxHealth);
        player->powers[power] = 1;
        break;

    default:
        if(player->powers[power])
            return false; // Already got it.

        player->powers[power] = 1;
        break;
    }

    if(power == PT_ALLMAP)
        ST_RevealAutomap(player - players, true);

    // Maybe unhide the HUD?
    ST_HUDUnHide(player - players, HUE_ON_PICKUP_POWER);

    return true;
}
Ejemplo n.º 3
0
static void SV_v13_ReadPlayer(player_t* pl)
{
    int i, plrnum = pl - players;
    ddplayer_t* ddpl = pl->plr;
    byte temp[12];

    Reader_ReadInt32(svReader); // mo
    pl->playerState = Reader_ReadInt32(svReader);
    Reader_Read(svReader, temp, 10); // ticcmd_t
    pl->viewZ       = FIX2FLT(Reader_ReadInt32(svReader));
    pl->viewHeight  = FIX2FLT(Reader_ReadInt32(svReader));
    pl->viewHeightDelta = FIX2FLT(Reader_ReadInt32(svReader));
    pl->bob         = FIX2FLT(Reader_ReadInt32(svReader));
    pl->flyHeight   = Reader_ReadInt32(svReader);
    ddpl->lookDir   = Reader_ReadInt32(svReader);
    pl->centering   = Reader_ReadInt32(svReader);
    pl->health      = Reader_ReadInt32(svReader);
    pl->armorPoints = Reader_ReadInt32(svReader);
    pl->armorType   = Reader_ReadInt32(svReader);

    P_InventoryEmpty(plrnum);
    for(i = 0; i < 14; ++i)
    {
        inventoryitemtype_t type = Reader_ReadInt32(svReader);
        int j, count = Reader_ReadInt32(svReader);

        for(j = 0; j < count; ++j)
            P_InventoryGive(plrnum, type, true);
    }

    P_InventorySetReadyItem(plrnum, (inventoryitemtype_t) Reader_ReadInt32(svReader));
    Hu_InventorySelect(plrnum, P_InventoryReadyItem(plrnum));
    Reader_ReadInt32(svReader); // current inventory item count?
    /*pl->inventorySlotNum =*/ Reader_ReadInt32(svReader);

    memset(pl->powers, 0, sizeof(pl->powers));
    pl->powers[PT_INVULNERABILITY] = !!Reader_ReadInt32(svReader);
    pl->powers[PT_INVISIBILITY]    = !!Reader_ReadInt32(svReader);
    pl->powers[PT_ALLMAP]          = !!Reader_ReadInt32(svReader);
    if(pl->powers[PT_ALLMAP])
    {
        ST_RevealAutomap(pl - players, true);
    }
    pl->powers[PT_INFRARED]     = !!Reader_ReadInt32(svReader);
    pl->powers[PT_WEAPONLEVEL2] = !!Reader_ReadInt32(svReader);
    pl->powers[PT_FLIGHT]       = !!Reader_ReadInt32(svReader);
    pl->powers[PT_SHIELD]       = !!Reader_ReadInt32(svReader);
    pl->powers[PT_HEALTH2]      = !!Reader_ReadInt32(svReader);

    memset(pl->keys, 0, sizeof(pl->keys));
    pl->keys[KT_YELLOW] = !!Reader_ReadInt32(svReader);
    pl->keys[KT_GREEN]  = !!Reader_ReadInt32(svReader);
    pl->keys[KT_BLUE]   = !!Reader_ReadInt32(svReader);

    pl->backpack = Reader_ReadInt32(svReader);

    memset(pl->frags, 0, sizeof(pl->frags));
    pl->frags[0] = Reader_ReadInt32(svReader);
    pl->frags[1] = Reader_ReadInt32(svReader);
    pl->frags[2] = Reader_ReadInt32(svReader);
    pl->frags[3] = Reader_ReadInt32(svReader);

    pl->readyWeapon   = Reader_ReadInt32(svReader);
    pl->pendingWeapon = Reader_ReadInt32(svReader);

    // Owned weapons.
    memset(pl->weapons, 0, sizeof(pl->weapons));
    pl->weapons[WT_FIRST  ].owned = !!Reader_ReadInt32(svReader);
    pl->weapons[WT_SECOND ].owned = !!Reader_ReadInt32(svReader);
    pl->weapons[WT_THIRD  ].owned = !!Reader_ReadInt32(svReader);
    pl->weapons[WT_FOURTH ].owned = !!Reader_ReadInt32(svReader);
    pl->weapons[WT_FIFTH  ].owned = !!Reader_ReadInt32(svReader);
    pl->weapons[WT_SIXTH  ].owned = !!Reader_ReadInt32(svReader);
    pl->weapons[WT_SEVENTH].owned = !!Reader_ReadInt32(svReader);
    pl->weapons[WT_EIGHTH ].owned = !!Reader_ReadInt32(svReader);

    memset(pl->ammo, 0, sizeof(pl->ammo));
    pl->ammo[AT_CRYSTAL].owned = Reader_ReadInt32(svReader);
    pl->ammo[AT_ARROW  ].owned = Reader_ReadInt32(svReader);
    pl->ammo[AT_ORB    ].owned = Reader_ReadInt32(svReader);
    pl->ammo[AT_RUNE   ].owned = Reader_ReadInt32(svReader);
    pl->ammo[AT_FIREORB].owned = Reader_ReadInt32(svReader);
    pl->ammo[AT_MSPHERE].owned = Reader_ReadInt32(svReader);
    pl->ammo[AT_CRYSTAL].max = Reader_ReadInt32(svReader);
    pl->ammo[AT_ARROW  ].max = Reader_ReadInt32(svReader);
    pl->ammo[AT_ORB    ].max = Reader_ReadInt32(svReader);
    pl->ammo[AT_RUNE   ].max = Reader_ReadInt32(svReader);
    pl->ammo[AT_FIREORB].max = Reader_ReadInt32(svReader);
    pl->ammo[AT_MSPHERE].max = Reader_ReadInt32(svReader);

    pl->attackDown = Reader_ReadInt32(svReader);
    pl->useDown    = Reader_ReadInt32(svReader);
    pl->cheats     = Reader_ReadInt32(svReader);
    pl->refire     = Reader_ReadInt32(svReader);
    pl->killCount  = Reader_ReadInt32(svReader);
    pl->itemCount  = Reader_ReadInt32(svReader);
    pl->secretCount = Reader_ReadInt32(svReader);
    Reader_ReadInt32(svReader); // message, char*
    pl->damageCount = Reader_ReadInt32(svReader);
    pl->bonusCount = Reader_ReadInt32(svReader);
    pl->flameCount = Reader_ReadInt32(svReader);
    Reader_ReadInt32(svReader); // attacker
    ddpl->extraLight = Reader_ReadInt32(svReader);
    ddpl->fixedColorMap = Reader_ReadInt32(svReader);
    pl->colorMap = Reader_ReadInt32(svReader);
    for(i = 0; i < 2; ++i)
    {
        pspdef_t* psp = &pl->pSprites[i];

        psp->state = INT2PTR(state_t, Reader_ReadInt32(svReader));
        psp->pos[VX] = Reader_ReadInt32(svReader);
        psp->pos[VY] = Reader_ReadInt32(svReader);
        psp->tics = Reader_ReadInt32(svReader);
    }

    pl->didSecret = Reader_ReadInt32(svReader);
    pl->morphTics = Reader_ReadInt32(svReader);
    pl->chickenPeck = Reader_ReadInt32(svReader);
    Reader_ReadInt32(svReader); // rain1
    Reader_ReadInt32(svReader); // rain2
}
Ejemplo n.º 4
0
dd_bool P_GivePower(player_t *player, powertype_t powerType)
{
    DENG_ASSERT(player != 0);
    DENG_ASSERT(powerType >= PT_FIRST && powerType < NUM_POWER_TYPES);

    // Powers cannot be given to dead players.
    if(player->health <= 0) return false;

    player->update |= PSF_POWERS;

    switch(powerType)
    {
    case PT_INVULNERABILITY:
        player->powers[powerType] = INVULNTICS;
        break;

    case PT_INVISIBILITY:
        player->powers[powerType] = INVISTICS;
        player->plr->mo->flags |= MF_SHADOW;
        break;

    case PT_FLIGHT:
        player->powers[powerType] = 1;
        player->plr->mo->flags2 |= MF2_FLY;
        player->plr->mo->flags |= MF_NOGRAVITY;
        if(player->plr->mo->origin[VZ] <= player->plr->mo->floorZ)
        {
            player->flyHeight = 10; // Thrust the player in the air a bit.
            player->plr->mo->flags |= DDPF_FIXMOM;
        }
        break;

    case PT_INFRARED:
        player->powers[powerType] = INFRATICS;
        break;

    case PT_IRONFEET:
        player->powers[powerType] = IRONTICS;
        break;

    case PT_STRENGTH:
        P_GiveHealth(player, maxHealth);
        player->powers[powerType] = 1;
        break;

    default:
        if(player->powers[powerType])
            return false; // Already got it.

        player->powers[powerType] = 1;
        break;
    }

    if(powerType == PT_ALLMAP)
        ST_RevealAutomap(player - players, true);

    // Maybe unhide the HUD?
    ST_HUDUnHide(player - players, HUE_ON_PICKUP_POWER);

    return true;
}