Skip to content

Commit

Permalink
Added Heretic/Doom64: Implemented support for voodoo dolls.
Browse files Browse the repository at this point in the history
Changed Doom: Fixed voodoo doll momentum-zeroing problem which would prevent continuous "voodooscript" loops from working as intended.
  • Loading branch information
danij-deng committed Mar 21, 2010
1 parent 1faedfa commit 423a1da
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 73 deletions.
2 changes: 1 addition & 1 deletion doomsday/plugins/common/src/p_start.c
Expand Up @@ -850,7 +850,7 @@ void P_SpawnPlayers(void)
}
else
{
#if __JDOOM__ || __JDOOM64__
#if __JDOOM__ || __JDOOM64__ || __JHERETIC__
if(!IS_NETGAME)
{
/* $voodoodolls */
Expand Down
10 changes: 6 additions & 4 deletions doomsday/plugins/jdoom/src/p_mobj.c
Expand Up @@ -338,24 +338,26 @@ void P_MobjMoveXY(mobj_t *mo)
}

// Stop player walking animation.
if((!player || !(player->plr->cmd.forwardMove | player->plr->cmd.sideMove) ||
player->plr->mo != mo /* $voodoodolls: Stop also. */) &&
if(!player || (!(player->plr->cmd.forwardMove | player->plr->cmd.sideMove) &&
player->plr->mo != mo /* $voodoodolls: Stop animating. */) &&
INRANGE_OF(mo->mom[MX], 0, STOPSPEED) &&
INRANGE_OF(mo->mom[MY], 0, STOPSPEED))
{
// If in a walking frame, stop moving.
if(player && isInWalkState(player) && player->plr->mo == mo)
P_MobjChangeState(player->plr->mo, PCLASS_INFO(player->class)->normalState);

mo->mom[MX] = mo->mom[MY] = 0;
// $voodoodolls: Do not zero mom!
if(!(player && player->plr->mo != mo))
mo->mom[MX] = mo->mom[MY] = 0;

// $voodoodolls: Stop view bobbing if this isn't a voodoo doll.
if(player && player->plr->mo == mo)
player->bob = 0;
}
else
{
float friction = getFriction(mo);
float friction = getFriction(mo);

mo->mom[MX] *= friction;
mo->mom[MY] *= friction;
Expand Down
70 changes: 39 additions & 31 deletions doomsday/plugins/jdoom64/src/p_mobj.c
Expand Up @@ -170,6 +170,30 @@ float P_MobjGetFriction(mobj_t *mo)
return XS_Friction(P_GetPtrp(mo->subsector, DMU_SECTOR));
}

static boolean isInWalkState(player_t* pl)
{
return pl->plr->mo->state - STATES -
PCLASS_INFO(pl->class)->runState < 4;
}

static float getFriction(mobj_t* mo)
{
if((mo->flags2 & MF2_FLY) && !(mo->pos[VZ] <= mo->floorZ) &&
!mo->onMobj)
{ // Airborne friction.
return FRICTION_FLY;
}

#if __JHERETIC__
if(P_ToXSector(P_GetPtrp(mo->subsector, DMU_SECTOR))->special == 15)
{ // Friction_Low
return FRICTION_LOW;
}
#endif

return P_MobjGetFriction(mo);
}

void P_MobjMoveXY(mobj_t* mo)
{
float pos[3], mom[3];
Expand Down Expand Up @@ -319,45 +343,29 @@ void P_MobjMoveXY(mobj_t* mo)
}

// Stop player walking animation.
if(player && !player->plr->cmd.forwardMove && !player->plr->cmd.sideMove &&
mo->mom[MX] > -STANDSPEED && mo->mom[MX] < STANDSPEED &&
mo->mom[MY] > -STANDSPEED && mo->mom[MY] < STANDSPEED)
if(!player || (!(player->plr->cmd.forwardMove | player->plr->cmd.sideMove) &&
player->plr->mo != mo /* $voodoodolls: Stop animating. */) &&
INRANGE_OF(mo->mom[MX], 0, STOPSPEED) &&
INRANGE_OF(mo->mom[MY], 0, STOPSPEED))
{
// If in a walking frame, stop moving.
if((unsigned) ((player->plr->mo->state - STATES) - PCLASS_INFO(player->class)->runState) < 4)
if(player && isInWalkState(player) && player->plr->mo == mo)
P_MobjChangeState(player->plr->mo, PCLASS_INFO(player->class)->normalState);
}

if((!player || (player->plr->cmd.forwardMove == 0 && player->plr->cmd.sideMove == 0)) &&
mo->mom[MX] > -STOPSPEED && mo->mom[MX] < STOPSPEED &&
mo->mom[MY] > -STOPSPEED && mo->mom[MY] < STOPSPEED)
{
mo->mom[MX] = mo->mom[MY] = 0;
// $voodoodolls: Do not zero mom!
if(!(player && player->plr->mo != mo))
mo->mom[MX] = mo->mom[MY] = 0;

// $voodoodolls: Stop view bobbing if this isn't a voodoo doll.
if(player && player->plr->mo == mo)
player->bob = 0;
}
else
{
if((mo->flags2 & MF2_FLY) && !(mo->pos[VZ] <= mo->floorZ) &&
!mo->onMobj)
{
mo->mom[MX] *= FRICTION_FLY;
mo->mom[MY] *= FRICTION_FLY;
}
#if __JHERETIC__
else if(P_ToXSector(P_GetPtrp(mo->subsector,
DMU_SECTOR))->special == 15)
{
// Friction_Low
mo->mom[MX] *= FRICTION_LOW;
mo->mom[MY] *= FRICTION_LOW;
}
#endif
else
{
float friction = P_MobjGetFriction(mo);
float friction = getFriction(mo);

mo->mom[MX] *= friction;
mo->mom[MY] *= friction;
}
mo->mom[MX] *= friction;
mo->mom[MY] *= friction;
}
}

Expand Down
80 changes: 43 additions & 37 deletions doomsday/plugins/jheretic/src/p_mobj.c
Expand Up @@ -338,6 +338,30 @@ float P_MobjGetFriction(mobj_t *mo)
}
}

static boolean isInWalkState(player_t* pl)
{
return pl->plr->mo->state - STATES -
PCLASS_INFO(pl->class)->runState < 4;
}

static float getFriction(mobj_t* mo)
{
if((mo->flags2 & MF2_FLY) && !(mo->pos[VZ] <= mo->floorZ) &&
!mo->onMobj)
{ // Airborne friction.
return FRICTION_FLY;
}

#if __JHERETIC__
if(P_ToXSector(P_GetPtrp(mo->subsector, DMU_SECTOR))->special == 15)
{ // Friction_Low
return FRICTION_LOW;
}
#endif

return P_MobjGetFriction(mo);
}

void P_MobjMoveXY(mobj_t* mo)
{
float pos[2], mom[2];
Expand Down Expand Up @@ -507,48 +531,29 @@ void P_MobjMoveXY(mobj_t* mo)
}

// Stop player walking animation.
if(player && !player->plr->cmd.forwardMove && !player->plr->cmd.sideMove &&
mo->mom[MX] > -STANDSPEED && mo->mom[MX] < STANDSPEED &&
mo->mom[MY] > -STANDSPEED && mo->mom[MY] < STANDSPEED)
if(!player || (!(player->plr->cmd.forwardMove | player->plr->cmd.sideMove) &&
player->plr->mo != mo /* $voodoodolls: Stop animating. */) &&
INRANGE_OF(mo->mom[MX], 0, STOPSPEED) &&
INRANGE_OF(mo->mom[MY], 0, STOPSPEED))
{
// If in a walking frame, stop moving.
if((unsigned) ((player->plr->mo->state - STATES) - PCLASS_INFO(player->class)->runState) < 4)
if(player && isInWalkState(player) && player->plr->mo == mo)
P_MobjChangeState(player->plr->mo, PCLASS_INFO(player->class)->normalState);
}

if((!player || (player->plr->cmd.forwardMove == 0 && player->plr->cmd.sideMove == 0)) &&
mo->mom[MX] > -STOPSPEED && mo->mom[MX] < STOPSPEED &&
mo->mom[MY] > -STOPSPEED && mo->mom[MY] < STOPSPEED)
{
mo->mom[MX] = 0;
mo->mom[MY] = 0;
// $voodoodolls: Do not zero mom!
if(!(player && player->plr->mo != mo))
mo->mom[MX] = mo->mom[MY] = 0;

// $voodoodolls: Stop view bobbing if this isn't a voodoo doll.
if(player && player->plr->mo == mo)
player->bob = 0;
}
else
{
if((mo->flags2 & MF2_FLY) && !(mo->pos[VZ] <= mo->floorZ) &&
!mo->onMobj)
{
mo->mom[MX] *= FRICTION_FLY;
mo->mom[MY] *= FRICTION_FLY;
}
else
{
#if __JHERETIC__
if(P_ToXSector(P_GetPtrp(mo->subsector, DMU_SECTOR))->special == 15)
{
// Friction_Low
mo->mom[MX] *= FRICTION_LOW;
mo->mom[MY] *= FRICTION_LOW;
}
else
#endif
{
float friction = P_MobjGetFriction(mo);
float friction = getFriction(mo);

mo->mom[MX] *= friction;
mo->mom[MY] *= friction;
}
}
mo->mom[MX] *= friction;
mo->mom[MY] *= friction;
}
}

Expand All @@ -564,8 +569,8 @@ void P_MobjMoveZ(mobj_t *mo)

gravity = XS_Gravity(P_GetPtrp(mo->subsector, DMU_SECTOR));

// Check for smooth step up.
if(mo->player && mo->pos[VZ] < mo->floorZ)
// $voodoodolls: Check for smooth step up unless a voodoo doll.
if(mo->player && mo->player->plr->mo == mo && mo->pos[VZ] < mo->floorZ)
{
mo->player->viewHeight -= mo->floorZ - mo->pos[VZ];
mo->player->viewHeightDelta =
Expand Down Expand Up @@ -609,7 +614,8 @@ void P_MobjMoveZ(mobj_t *mo)
}

// Do some fly-bobbing.
if(mo->player && (mo->flags2 & MF2_FLY) && mo->pos[VZ] > mo->floorZ &&
if(mo->player && mo->player->plr->mo == mo &&
(mo->flags2 & MF2_FLY) && mo->pos[VZ] > mo->floorZ &&
!mo->onMobj && (mapTime & 2))
{
mo->pos[VZ] += FIX2FLT(finesine[(FINEANGLES / 20 * mapTime >> 2) & FINEMASK]);
Expand Down

0 comments on commit 423a1da

Please sign in to comment.