[nq] Get intermission view working again

This is currently just the basic intermission view (not the finale view
or the deathmatch intermission view).
This commit is contained in:
Bill Currie 2022-11-03 17:49:05 +09:00
parent a07eccd5c7
commit bdbb8f1e0b
8 changed files with 110 additions and 56 deletions

View file

@ -65,15 +65,15 @@ typedef struct viewstate_s {
float height; float height;
int weaponframe; int weaponframe;
int onground; // -1 when in air int onground; // -1 when in air
int active:1; unsigned active:1;
int loading:1; unsigned loading:1;
int watervis:1; unsigned watervis:1;
int demoplayback:1; unsigned demoplayback:1;
int drift_enabled:1; unsigned drift_enabled:1;
int voffs_enabled:1; unsigned voffs_enabled:1;
int bob_enabled:1; unsigned bob_enabled:1;
int intermission:1; unsigned intermission:1;
int decay_punchangle:1; unsigned decay_punchangle:1;
int force_cshifts; // bitfield of server enforced cshifts int force_cshifts; // bitfield of server enforced cshifts
uint32_t flags; uint32_t flags;

View file

@ -56,7 +56,7 @@ void Sbar_Changed (sbar_changed change);
void Sbar_Draw (void); void Sbar_Draw (void);
// called every frame by screen // called every frame by screen
void Sbar_IntermissionOverlay (void); void Sbar_Intermission (int mode);
// called each frame after the level has been completed // called each frame after the level has been completed
void Sbar_FinaleOverlay (void); void Sbar_FinaleOverlay (void);

View file

@ -154,23 +154,15 @@ static SCR_Func scr_funcs_normal[] = {
}; };
static SCR_Func scr_funcs_intermission[] = { static SCR_Func scr_funcs_intermission[] = {
Sbar_IntermissionOverlay, HUD_Draw_Views,
Con_DrawConsole, Con_DrawConsole,
scr_draw_views, scr_draw_views,
0 0
}; };
static SCR_Func scr_funcs_finale[] = {
Sbar_FinaleOverlay,
Con_DrawConsole,
scr_draw_views,
0,
};
static SCR_Func *scr_funcs[] = { static SCR_Func *scr_funcs[] = {
scr_funcs_normal, scr_funcs_normal,
scr_funcs_intermission, scr_funcs_intermission,
scr_funcs_finale,
}; };
static void static void

View file

@ -209,9 +209,9 @@ hud_swap_f (void *data, const cvar_t *cvar)
static void static void
hud_scoreboard_gravity_f (void *data, const cvar_t *cvar) hud_scoreboard_gravity_f (void *data, const cvar_t *cvar)
{ {
#if 0//XXX if (View_Valid (hud_overlay_view)) {
view_setgravity (hud_overlay_view, hud_scoreboard_gravity); View_SetGravity (hud_overlay_view, hud_scoreboard_gravity);
#endif }
} }
void void

View file

@ -231,6 +231,7 @@ CL_ClearMemory (void)
// wipe the entire cl structure // wipe the entire cl structure
__auto_type cam = cl.viewstate.camera_transform; __auto_type cam = cl.viewstate.camera_transform;
memset (&cl, 0, sizeof (cl)); memset (&cl, 0, sizeof (cl));
Sbar_Intermission (cl.intermission = 0);
cl.viewstate.camera_transform = cam; cl.viewstate.camera_transform = cam;
CL_ClearTEnts (); CL_ClearTEnts ();
@ -338,7 +339,7 @@ CL_Disconnect (void)
} }
cl_world.scene->worldmodel = NULL; cl_world.scene->worldmodel = NULL;
cl.intermission = 0; Sbar_Intermission (cl.intermission = 0);
cl.viewstate.intermission = 0; cl.viewstate.intermission = 0;
} }

View file

@ -986,13 +986,13 @@ CL_ParseServerMessage (void)
break; break;
case svc_intermission: case svc_intermission:
cl.intermission = 1; Sbar_Intermission (cl.intermission = 1);
SCR_SetFullscreen (1); SCR_SetFullscreen (1);
cl.completed_time = cl.time; cl.completed_time = cl.time;
break; break;
case svc_finale: case svc_finale:
cl.intermission = 2; Sbar_Intermission (cl.intermission = 2);
SCR_SetFullscreen (1); SCR_SetFullscreen (1);
cl.completed_time = cl.time; cl.completed_time = cl.time;
str = MSG_ReadString (net_message); str = MSG_ReadString (net_message);
@ -1018,7 +1018,7 @@ CL_ParseServerMessage (void)
break; break;
case svc_cutscene: case svc_cutscene:
cl.intermission = 3; Sbar_Intermission (cl.intermission = 3);
SCR_SetFullscreen (1); SCR_SetFullscreen (1);
cl.completed_time = cl.time; cl.completed_time = cl.time;
str = MSG_ReadString (net_message); str = MSG_ReadString (net_message);

View file

@ -89,6 +89,11 @@ static view_t sbar_solo_anchor;
static view_t sbar_solo_name; static view_t sbar_solo_name;
static view_t sbar_tile[2]; static view_t sbar_tile[2];
static view_t intermission_view;
static view_t intermission_time;
static view_t intermission_secr;
static view_t intermission_kill;
typedef struct { typedef struct {
view_t *view; view_t *view;
struct { struct {
@ -105,6 +110,23 @@ typedef struct {
} view_def_t; } view_def_t;
static view_def_t view_defs[] = { static view_def_t view_defs[] = {
{&hud_overlay_view, { 0, 0,320,200}, grav_center, &cl_screen_view},
{&intermission_view, { 0, 0,320,200}, grav_northwest, &hud_overlay_view},
{0, {64, 24, 24, 24}, grav_northwest, &intermission_view, 1, 0, 0},
{0, {0, 56, 24, 24}, grav_northwest, &intermission_view, 1, 0, 0},
{&intermission_time, {160,64,134,24}, grav_northwest, &intermission_view},
{0, {0, 0, 24, 24}, grav_northwest, &intermission_time, 3, 24, 0},
{0, {74, 0, 16, 24}, grav_northwest, &intermission_time, 1, 0, 0},
{0, {86, 0, 24, 24}, grav_northwest, &intermission_time, 2, 24, 0},
{&intermission_secr, {160,104,152,24}, grav_northwest, &intermission_view},
{0, {0, 0, 24, 24}, grav_northwest, &intermission_secr, 3, 24, 0},
{0, {72, 0, 16, 24}, grav_northwest, &intermission_secr, 1, 0, 0},
{0, {80, 0, 24, 24}, grav_northwest, &intermission_secr, 3, 24, 0},
{&intermission_kill, {160,144,152,24}, grav_northwest, &intermission_view},
{0, {0, 0, 24, 24}, grav_northwest, &intermission_kill, 3, 24, 0},
{0, {72, 0, 16, 24}, grav_northwest, &intermission_kill, 1, 0, 0},
{0, {80, 0, 24, 24}, grav_northwest, &intermission_kill, 3, 24, 0},
{&sbar_main, { 0, 0,320, 48}, grav_south, &cl_screen_view}, {&sbar_main, { 0, 0,320, 48}, grav_south, &cl_screen_view},
{&sbar_inventory, { 0, 0,320, 24}, grav_northwest, &sbar_main}, {&sbar_inventory, { 0, 0,320, 24}, grav_northwest, &sbar_main},
{&sbar_frags, { 0, 0,130, 8}, grav_northeast, &sbar_inventory}, {&sbar_frags, { 0, 0,130, 8}, grav_northeast, &sbar_inventory},
@ -1174,50 +1196,89 @@ draw_fps (view_t view)
} }
static void static void
draw_intermission (view_t *view) draw_intermission (view_t view)
{ {
#if 0 const char *n;
int dig;
int num;
r_data->scr_copyeverything = 1; n = "gfx/complete.lmp";
r_data->scr_fullupdate = 0; sbar_setcomponent (View_GetChild (view, 0), hud_cachepic, &n);
n = "gfx/inter.lmp";
sbar_setcomponent (View_GetChild (view, 1), hud_cachepic, &n);
draw_cachepic (view, 64, 24, "gfx/complete.lmp", 0); view_t time_views[] = {
View_GetChild (intermission_time, 0),
View_GetChild (intermission_time, 1),
View_GetChild (intermission_time, 2),
View_GetChild (intermission_time, 3),
View_GetChild (intermission_time, 4),
View_GetChild (intermission_time, 5),
};
int dig = cl.completed_time / 60;
int num = cl.completed_time - dig * 60;
draw_num (time_views + 0, dig, 3, 0);
sbar_setcomponent (time_views[3], hud_pic, &sb_colon);
draw_num (time_views + 4, num, 2, 0);
draw_cachepic (view, 0, 56, "gfx/inter.lmp", 0); view_t secr_views[] = {
View_GetChild (intermission_secr, 0),
View_GetChild (intermission_secr, 1),
View_GetChild (intermission_secr, 2),
View_GetChild (intermission_secr, 3),
View_GetChild (intermission_secr, 4),
View_GetChild (intermission_secr, 5),
View_GetChild (intermission_secr, 6),
};
draw_num (secr_views + 0, cl.stats[STAT_SECRETS], 3, 0);
sbar_setcomponent (secr_views[3], hud_pic, &sb_slash);
draw_num (secr_views + 4, cl.stats[STAT_TOTALSECRETS], 3, 0);
// time view_t kill_views[] = {
dig = cl.completed_time / 60; View_GetChild (intermission_kill, 0),
draw_num (view, 160, 64, dig, 3, 0); View_GetChild (intermission_kill, 1),
num = cl.completed_time - dig * 60; View_GetChild (intermission_kill, 2),
draw_pic (view, 234, 64, sb_colon); View_GetChild (intermission_kill, 3),
draw_pic (view, 246, 64, sb_nums[0][num / 10]); View_GetChild (intermission_kill, 4),
draw_pic (view, 266, 64, sb_nums[0][num % 10]); View_GetChild (intermission_kill, 5),
View_GetChild (intermission_kill, 6),
draw_num (view, 160, 104, cl.stats[STAT_SECRETS], 3, 0); };
draw_pic (view, 232, 104, sb_slash); draw_num (kill_views + 0, cl.stats[STAT_MONSTERS], 3, 0);
draw_num (view, 240, 104, cl.stats[STAT_TOTALSECRETS], 3, 0); sbar_setcomponent (kill_views[3], hud_pic, &sb_slash);
draw_num (kill_views + 4, cl.stats[STAT_TOTALMONSTERS], 3, 0);
draw_num (view, 160, 144, cl.stats[STAT_MONSTERS], 3, 0);
draw_pic (view, 232, 144, sb_slash);
draw_num (view, 240, 144, cl.stats[STAT_TOTALMONSTERS], 3, 0);
#endif
} }
static void
clear_views (view_t view)
{
sbar_remcomponent (view, hud_cachepic);
sbar_remcomponent (view, hud_pic);
for (uint32_t i = 0; i < View_ChildCount (view); i++) {
clear_views (View_GetChild (view, i));
}
}
#if 0
void void
Sbar_IntermissionOverlay (void) Sbar_IntermissionOverlay (void)
{ {
#if 0
r_data->scr_copyeverything = 1; r_data->scr_copyeverything = 1;
r_data->scr_fullupdate = 0; r_data->scr_fullupdate = 0;
if (cl.gametype == GAME_DEATHMATCH) { if (cl.gametype == GAME_DEATHMATCH) {
Sbar_DeathmatchOverlay (hud_overlay_view); Sbar_DeathmatchOverlay (hud_overlay_view);
return; return;
} }
draw_intermission (hud_overlay_view); draw_intermission (intermission_view);
}
#endif #endif
void
Sbar_Intermission (int mode)
{
void *f = clear_views;
if (mode == 1) {
f = draw_intermission;
}
sbar_setcomponent (intermission_view, hud_updateonce, &f);
} }
/* CENTER PRINTING */ /* CENTER PRINTING */
@ -1453,7 +1514,6 @@ Sbar_Draw (void)
draw_miniteam (0); draw_miniteam (0);
draw_minifrags (0); draw_minifrags (0);
draw_overlay (0); draw_overlay (0);
draw_intermission (0);
Sbar_DeathmatchOverlay (0); Sbar_DeathmatchOverlay (0);
sbar_update_vis (); sbar_update_vis ();
} }
@ -1595,6 +1655,7 @@ init_sbar_views (void)
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
view_t v = View_GetChild (sbar_miniammo, i); view_t v = View_GetChild (sbar_miniammo, i);
draw_charbuffer_t *buffer = Draw_CreateBuffer (3, 1); draw_charbuffer_t *buffer = Draw_CreateBuffer (3, 1);
Draw_ClearBuffer (buffer);
sbar_setcomponent (v, hud_charbuff, &buffer); sbar_setcomponent (v, hud_charbuff, &buffer);
} }

View file

@ -1620,10 +1620,10 @@ draw_stuff (view_t *view)
draw_net (view); draw_net (view);
} }
#if 0
void void
Sbar_IntermissionOverlay (void) Sbar_IntermissionOverlay (void)
{ {
#if 0
r_data->scr_copyeverything = 1; r_data->scr_copyeverything = 1;
r_data->scr_fullupdate = 0; r_data->scr_fullupdate = 0;
@ -1631,8 +1631,8 @@ Sbar_IntermissionOverlay (void)
Sbar_TeamOverlay (hud_overlay_view); Sbar_TeamOverlay (hud_overlay_view);
else else
Sbar_DeathmatchOverlay (hud_overlay_view, 0); Sbar_DeathmatchOverlay (hud_overlay_view, 0);
#endif
} }
#endif
/* CENTER PRINTING */ /* CENTER PRINTING */
static dstring_t center_string = {&dstring_default_mem}; static dstring_t center_string = {&dstring_default_mem};