From bdbb8f1e0b54f8ecd58908ac0628f5c43f5cd74c Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Thu, 3 Nov 2022 17:49:05 +0900 Subject: [PATCH] [nq] Get intermission view working again This is currently just the basic intermission view (not the finale view or the deathmatch intermission view). --- include/client/view.h | 18 +++---- include/sbar.h | 2 +- libs/client/cl_screen.c | 10 +--- libs/client/hud.c | 6 +-- nq/source/cl_main.c | 3 +- nq/source/cl_parse.c | 6 +-- nq/source/sbar.c | 117 ++++++++++++++++++++++++++++++---------- qw/source/sbar.c | 4 +- 8 files changed, 110 insertions(+), 56 deletions(-) diff --git a/include/client/view.h b/include/client/view.h index c2ae534d9..2bb2c8196 100644 --- a/include/client/view.h +++ b/include/client/view.h @@ -65,15 +65,15 @@ typedef struct viewstate_s { float height; int weaponframe; int onground; // -1 when in air - int active:1; - int loading:1; - int watervis:1; - int demoplayback:1; - int drift_enabled:1; - int voffs_enabled:1; - int bob_enabled:1; - int intermission:1; - int decay_punchangle:1; + unsigned active:1; + unsigned loading:1; + unsigned watervis:1; + unsigned demoplayback:1; + unsigned drift_enabled:1; + unsigned voffs_enabled:1; + unsigned bob_enabled:1; + unsigned intermission:1; + unsigned decay_punchangle:1; int force_cshifts; // bitfield of server enforced cshifts uint32_t flags; diff --git a/include/sbar.h b/include/sbar.h index 6c1f74317..95d38ac72 100644 --- a/include/sbar.h +++ b/include/sbar.h @@ -56,7 +56,7 @@ void Sbar_Changed (sbar_changed change); void Sbar_Draw (void); // called every frame by screen -void Sbar_IntermissionOverlay (void); +void Sbar_Intermission (int mode); // called each frame after the level has been completed void Sbar_FinaleOverlay (void); diff --git a/libs/client/cl_screen.c b/libs/client/cl_screen.c index 035dec6db..f2d21c454 100644 --- a/libs/client/cl_screen.c +++ b/libs/client/cl_screen.c @@ -154,23 +154,15 @@ static SCR_Func scr_funcs_normal[] = { }; static SCR_Func scr_funcs_intermission[] = { - Sbar_IntermissionOverlay, + HUD_Draw_Views, Con_DrawConsole, scr_draw_views, 0 }; -static SCR_Func scr_funcs_finale[] = { - Sbar_FinaleOverlay, - Con_DrawConsole, - scr_draw_views, - 0, -}; - static SCR_Func *scr_funcs[] = { scr_funcs_normal, scr_funcs_intermission, - scr_funcs_finale, }; static void diff --git a/libs/client/hud.c b/libs/client/hud.c index 9c375e50d..5473a5b34 100644 --- a/libs/client/hud.c +++ b/libs/client/hud.c @@ -209,9 +209,9 @@ hud_swap_f (void *data, const cvar_t *cvar) static void hud_scoreboard_gravity_f (void *data, const cvar_t *cvar) { -#if 0//XXX - view_setgravity (hud_overlay_view, hud_scoreboard_gravity); -#endif + if (View_Valid (hud_overlay_view)) { + View_SetGravity (hud_overlay_view, hud_scoreboard_gravity); + } } void diff --git a/nq/source/cl_main.c b/nq/source/cl_main.c index f7a731ac6..b6403481a 100644 --- a/nq/source/cl_main.c +++ b/nq/source/cl_main.c @@ -231,6 +231,7 @@ CL_ClearMemory (void) // wipe the entire cl structure __auto_type cam = cl.viewstate.camera_transform; memset (&cl, 0, sizeof (cl)); + Sbar_Intermission (cl.intermission = 0); cl.viewstate.camera_transform = cam; CL_ClearTEnts (); @@ -338,7 +339,7 @@ CL_Disconnect (void) } cl_world.scene->worldmodel = NULL; - cl.intermission = 0; + Sbar_Intermission (cl.intermission = 0); cl.viewstate.intermission = 0; } diff --git a/nq/source/cl_parse.c b/nq/source/cl_parse.c index 516b971d2..c866b0b31 100644 --- a/nq/source/cl_parse.c +++ b/nq/source/cl_parse.c @@ -986,13 +986,13 @@ CL_ParseServerMessage (void) break; case svc_intermission: - cl.intermission = 1; + Sbar_Intermission (cl.intermission = 1); SCR_SetFullscreen (1); cl.completed_time = cl.time; break; case svc_finale: - cl.intermission = 2; + Sbar_Intermission (cl.intermission = 2); SCR_SetFullscreen (1); cl.completed_time = cl.time; str = MSG_ReadString (net_message); @@ -1018,7 +1018,7 @@ CL_ParseServerMessage (void) break; case svc_cutscene: - cl.intermission = 3; + Sbar_Intermission (cl.intermission = 3); SCR_SetFullscreen (1); cl.completed_time = cl.time; str = MSG_ReadString (net_message); diff --git a/nq/source/sbar.c b/nq/source/sbar.c index cbfc19c31..14ff24e62 100644 --- a/nq/source/sbar.c +++ b/nq/source/sbar.c @@ -89,6 +89,11 @@ static view_t sbar_solo_anchor; static view_t sbar_solo_name; 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 { view_t *view; struct { @@ -105,6 +110,23 @@ typedef struct { } view_def_t; 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_inventory, { 0, 0,320, 24}, grav_northwest, &sbar_main}, {&sbar_frags, { 0, 0,130, 8}, grav_northeast, &sbar_inventory}, @@ -1174,50 +1196,89 @@ draw_fps (view_t view) } static void -draw_intermission (view_t *view) +draw_intermission (view_t view) { -#if 0 - int dig; - int num; + const char *n; - r_data->scr_copyeverything = 1; - r_data->scr_fullupdate = 0; + n = "gfx/complete.lmp"; + 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 - dig = cl.completed_time / 60; - draw_num (view, 160, 64, dig, 3, 0); - num = cl.completed_time - dig * 60; - draw_pic (view, 234, 64, sb_colon); - draw_pic (view, 246, 64, sb_nums[0][num / 10]); - draw_pic (view, 266, 64, sb_nums[0][num % 10]); - - draw_num (view, 160, 104, cl.stats[STAT_SECRETS], 3, 0); - draw_pic (view, 232, 104, sb_slash); - draw_num (view, 240, 104, cl.stats[STAT_TOTALSECRETS], 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 + view_t kill_views[] = { + View_GetChild (intermission_kill, 0), + View_GetChild (intermission_kill, 1), + View_GetChild (intermission_kill, 2), + View_GetChild (intermission_kill, 3), + View_GetChild (intermission_kill, 4), + View_GetChild (intermission_kill, 5), + View_GetChild (intermission_kill, 6), + }; + draw_num (kill_views + 0, cl.stats[STAT_MONSTERS], 3, 0); + sbar_setcomponent (kill_views[3], hud_pic, &sb_slash); + draw_num (kill_views + 4, cl.stats[STAT_TOTALMONSTERS], 3, 0); } +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 Sbar_IntermissionOverlay (void) { -#if 0 r_data->scr_copyeverything = 1; r_data->scr_fullupdate = 0; - if (cl.gametype == GAME_DEATHMATCH) { Sbar_DeathmatchOverlay (hud_overlay_view); return; } - draw_intermission (hud_overlay_view); + draw_intermission (intermission_view); +} #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 */ @@ -1453,7 +1514,6 @@ Sbar_Draw (void) draw_miniteam (0); draw_minifrags (0); draw_overlay (0); - draw_intermission (0); Sbar_DeathmatchOverlay (0); sbar_update_vis (); } @@ -1595,6 +1655,7 @@ init_sbar_views (void) for (int i = 0; i < 4; i++) { view_t v = View_GetChild (sbar_miniammo, i); draw_charbuffer_t *buffer = Draw_CreateBuffer (3, 1); + Draw_ClearBuffer (buffer); sbar_setcomponent (v, hud_charbuff, &buffer); } diff --git a/qw/source/sbar.c b/qw/source/sbar.c index 17cc61099..ba7027742 100644 --- a/qw/source/sbar.c +++ b/qw/source/sbar.c @@ -1620,10 +1620,10 @@ draw_stuff (view_t *view) draw_net (view); } +#if 0 void Sbar_IntermissionOverlay (void) { -#if 0 r_data->scr_copyeverything = 1; r_data->scr_fullupdate = 0; @@ -1631,8 +1631,8 @@ Sbar_IntermissionOverlay (void) Sbar_TeamOverlay (hud_overlay_view); else Sbar_DeathmatchOverlay (hud_overlay_view, 0); -#endif } +#endif /* CENTER PRINTING */ static dstring_t center_string = {&dstring_default_mem};