more roll testing

This commit is contained in:
jacob 2026-02-18 19:04:34 -06:00
parent 67171a9906
commit 3b7b324369
4 changed files with 65 additions and 20 deletions

View File

@ -259,10 +259,15 @@ P_Anim P_AnimFromEnt(P_Frame *frame, P_Ent *ent)
if (P_IsEntRolling(frame, ent))
{
result.span = SPR_SpanKeyFromName(Lit("roll"));
result.weapon_over = 1;
}
else if (Vec2LenSq(ent->control.move) > (0.01 * 0.01))
{
result.span = SPR_SpanKeyFromName(Lit("walk"));
}
else
{
result.span = SPR_SpanKeyFromName(Lit("walk"));
result.span = SPR_SpanKeyFromName(Lit("idle"));
}
}
@ -2265,17 +2270,19 @@ void P_StepFrame(P_Frame *frame)
{
if (guy->is_guy)
{
if (guy->control.roll_presses && !IsVec2Zero(guy->control.move))
// if (guy->control.roll_presses && !IsVec2Zero(guy->control.move))
if (guy->control.roll_presses)
{
// TODO: Not like this
i64 roll_timeout_ns = P_RollTimeoutNs;
i64 roll_time_ns = P_RollTimeNs;
if (frame->time_ns - roll_timeout_ns + roll_time_ns > guy->last_roll_time_ns || guy->last_roll_time_ns == 0)
if (frame->time_ns - roll_timeout_ns - roll_time_ns > guy->last_roll_time_ns || guy->last_roll_time_ns == 0)
{
guy->last_roll_time_ns = frame->time_ns;
guy->last_roll_dir = NormRot(guy->control.move);
// guy->last_roll_dir = NormRot(guy->control.move);
guy->last_roll_dir = NormRot(guy->control.look);
}
}
}
@ -2315,14 +2322,20 @@ void P_StepFrame(P_Frame *frame)
b32 is_rolling = P_IsEntRolling(frame, guy);
if (is_rolling)
{
Vec2 roll_dir = NormRot(guy->last_roll_dir);
// Vec2 roll_dir = NormRot(guy->last_roll_dir);
Vec2 roll_dir = NormRot(guy->xf.r);
move = roll_dir;
look = roll_dir;
// look = roll_dir;
f32 roll_factor = 1.3;
move_force *= roll_factor;
max_speed *= roll_factor;
// if ((frame->time_ns - guy->last_roll_time_ns) > P_RollTurnTimeNs)
{
turn_rate = 0.1;
}
}
// Integrate linear movement
@ -2900,8 +2913,8 @@ void P_StepFrame(P_Frame *frame)
for (P_Ent *firer = P_FirstEnt(frame); !P_IsEntNil(firer); firer = P_NextEnt(firer))
{
P_Ent *weapon = P_EntFromKey(frame, firer->weapon);
// if (weapon->is_weapon && firer->control.fire_held)
if (weapon->is_weapon && firer->control.fire_presses)
if (weapon->is_weapon && firer->control.fire_held)
// if (weapon->is_weapon && firer->control.fire_presses)
{
// i64 fire_delta_ns = frame->time_ns - firer->last_fire_ns;

View File

@ -81,7 +81,8 @@ Struct(P_DebugDrawNode)
#define P_MinPlayerNameLen 1
#define P_MaxPlayerNameLen 24
#define P_RollTimeNs NsFromSeconds(0.5)
#define P_RollTimeoutNs NsFromSeconds(1)
#define P_RollTurnTimeNs (NsFromSeconds(0.1))
#define P_RollTimeoutNs NsFromSeconds(0.5)
Struct(P_Control)
{
@ -216,6 +217,7 @@ Struct(P_Anim)
SPR_SpanKey span;
SPR_SheetKey sheet;
SPR_SheetKey wep_sheet;
b32 weapon_over;
};
////////////////////////////////////////////////////////////

BIN
src/pp/pp_res/guy/guy.ase (Stored with Git LFS)

Binary file not shown.

View File

@ -2191,16 +2191,46 @@ void V_TickForever(WaveLaneCtx *lane)
// quad->occluder = V_OccluderKind_Guy;
}
//- Push body quad
if (body.ready)
{
//- Body quad
V_Quad body_quad = Zi;
{
Affine body_uv_to_world_af = ScaleAffine(body_pix_to_world_af, DimsFromRng2(body.tex_rect));
body_quad.quad_uv_to_world_af = body_uv_to_world_af;
body_quad.tex = body.tex;
body_quad.tex_slice_uv = DivRng2Vec2(body.tex_rect, body.tex_dims);
body_quad.occluder_id = ent->key.v & 0xFFFFFFFF;
}
V_Quad *quad = PushStruct(frame->quads_arena, V_Quad);
quad->quad_uv_to_world_af = body_uv_to_world_af;
quad->tex = body.tex;
quad->tex_slice_uv = DivRng2Vec2(body.tex_rect, body.tex_dims);
quad->occluder_id = ent->key.v & 0xFFFFFFFF;
//- Weapon quad
V_Quad wep_quad = Zi;
{
Affine wep_uv_to_world_af = ScaleAffine(wep_pix_to_world_af, DimsFromRng2(wep.tex_rect));
wep_quad.quad_uv_to_world_af = wep_uv_to_world_af;
wep_quad.tex = wep.tex;
wep_quad.tex_slice_uv = DivRng2Vec2(wep.tex_rect, wep.tex_dims);
// wep_quad.occluder = V_OccluderKind_Guy;
}
//- Push quads
if (wep.ready)
{
if (anim.weapon_over)
{
*PushStructNoZero(frame->quads_arena, V_Quad) = body_quad;
*PushStructNoZero(frame->quads_arena, V_Quad) = wep_quad;
}
else
{
*PushStructNoZero(frame->quads_arena, V_Quad) = wep_quad;
*PushStructNoZero(frame->quads_arena, V_Quad) = body_quad;
}
}
else
{
*PushStructNoZero(frame->quads_arena, V_Quad) = body_quad;
}
}
}
}
@ -2731,8 +2761,8 @@ void V_TickForever(WaveLaneCtx *lane)
//////////////////////////////
//- Push test explosion
// if (frame->held_buttons[Button_G])
if (frame->held_buttons[Button_G] && !prev_frame->held_buttons[Button_G])
if (frame->held_buttons[Button_G])
// if (frame->held_buttons[Button_G] && !prev_frame->held_buttons[Button_G])
{
// Fire
{