Improve presentation of followers on player setup screen
- Animation speed is now framerate-independent - Render height is no longer all over the place - Ground followers now bounce
This commit is contained in:
parent
b4ec4ef691
commit
0dbecfdcf3
2 changed files with 22 additions and 11 deletions
|
|
@ -3684,7 +3684,7 @@ void readfollower(MYFILE *f)
|
|||
followers[numfollowers].horzlag = 3*FRACUNIT;
|
||||
followers[numfollowers].vertlag = 6*FRACUNIT;
|
||||
followers[numfollowers].anglelag = 8*FRACUNIT;
|
||||
followers[numfollowers].bobspeed = TICRATE*2;
|
||||
followers[numfollowers].bobspeed = (TICRATE*2)*FRACUNIT;
|
||||
followers[numfollowers].bobamp = 4*FRACUNIT;
|
||||
followers[numfollowers].hitconfirmtime = TICRATE;
|
||||
followers[numfollowers].defaultcolor = SKINCOLOR_GREEN;
|
||||
|
|
|
|||
31
src/m_menu.c
31
src/m_menu.c
|
|
@ -9404,7 +9404,7 @@ static state_t *multi_state;
|
|||
static UINT8 multi_spr2;
|
||||
|
||||
// used for follower display on player setup menu
|
||||
static INT32 follower_tics;
|
||||
static fixed_t follower_tics;
|
||||
static UINT32 follower_frame; // used for FF_ANIMATE garbo
|
||||
static state_t *follower_state;
|
||||
|
||||
|
|
@ -9680,14 +9680,15 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
|||
{
|
||||
// animate the follower
|
||||
|
||||
if (--follower_tics <= 0)
|
||||
follower_tics -= renderdeltatics;
|
||||
if (follower_tics <= 0)
|
||||
{
|
||||
|
||||
// FF_ANIMATE; cycle through FRAMES and get back afterwards. This will be prominent amongst followers hence why it's being supported here.
|
||||
if (follower_state->frame & FF_ANIMATE)
|
||||
{
|
||||
follower_frame++;
|
||||
follower_tics = follower_state->var2;
|
||||
follower_tics = follower_state->var2*FRACUNIT;
|
||||
if (follower_frame > (follower_state->frame & FF_FRAMEMASK) + follower_state->var1) // that's how it works, right?
|
||||
follower_frame = follower_state->frame & FF_FRAMEMASK;
|
||||
}
|
||||
|
|
@ -9696,9 +9697,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
|||
st = follower_state->nextstate;
|
||||
if (st != S_NULL)
|
||||
follower_state = &states[st];
|
||||
follower_tics = follower_state->tics;
|
||||
if (follower_tics == -1)
|
||||
follower_tics = 15; // er, what?
|
||||
follower_tics = follower_state->tics*FRACUNIT;
|
||||
// get spritedef:
|
||||
follower_frame = follower_state->frame & FF_FRAMEMASK;
|
||||
}
|
||||
|
|
@ -9720,12 +9719,24 @@ static void M_DrawSetupMultiPlayerMenu(void)
|
|||
// Fake the follower's in game appearance by now also applying some of its variables! coolio, eh?
|
||||
follower_t fl = followers[setupm_fakefollower]; // shortcut for our sanity
|
||||
|
||||
tic_t bobspeed = fl.bobspeed;
|
||||
if (fl.mode == FOLLOWERMODE_GROUND)
|
||||
bobspeed = FixedDiv(bobspeed, fl.bobamp / 6); // Rough approximation of bounce speed
|
||||
|
||||
// smooth floating, totally not stolen from rocket sneakers.
|
||||
fixed_t sine = FixedMul(fl.bobamp, FINESINE(((FixedMul(4 * M_TAU_FIXED, fl.bobspeed) * followertimer)>>ANGLETOFINESHIFT) & FINEMASK));
|
||||
fixed_t sine = FixedMul(fl.bobamp, FINESINE(((FixedMul(4 * M_TAU_FIXED, bobspeed) * followertimer)>>ANGLETOFINESHIFT) & FINEMASK));
|
||||
|
||||
UINT16 color = K_GetEffectiveFollowerColor(setupm_cvfollowercolor->value, &fl, setupm_fakecolor->color, &skins[setupm_fakeskin]);
|
||||
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, color, 0); // why does GTC_MENUCACHE not work here...?
|
||||
V_DrawFixedPatch((mx+65)*FRACUNIT, ((my+131)*FRACUNIT)-fl.zoffs+sine, fl.scale, flags, patch, colormap);
|
||||
|
||||
INT32 x = (mx+65)*FRACUNIT;
|
||||
INT32 y = ((my+100)*FRACUNIT);
|
||||
if (fl.mode == FOLLOWERMODE_GROUND)
|
||||
y += 40*FRACUNIT - abs(sine) * 2; // Bounce animation
|
||||
else
|
||||
y += sine;
|
||||
|
||||
V_DrawFixedPatch(x, y, fl.scale, flags, patch, colormap);
|
||||
Z_Free(colormap);
|
||||
}
|
||||
}
|
||||
|
|
@ -9747,9 +9758,9 @@ static void M_GetFollowerState(void)
|
|||
follower_state = &states[followers[setupm_fakefollower].followstate];
|
||||
|
||||
if (follower_state->frame & FF_ANIMATE)
|
||||
follower_tics = follower_state->var2; // support for FF_ANIMATE
|
||||
follower_tics = follower_state->var2*FRACUNIT; // support for FF_ANIMATE
|
||||
else
|
||||
follower_tics = follower_state->tics;
|
||||
follower_tics = follower_state->tics*FRACUNIT;
|
||||
|
||||
follower_frame = follower_state->frame & FF_FRAMEMASK;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue