From 745b96beec5666469bf3bb8298e87aae4922aa79 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 18 Mar 2017 15:42:34 +0100 Subject: [PATCH] - made the status screen a class and scriptified a few more functions. --- src/b_game.cpp | 8 + src/doomstat.cpp | 1 + src/g_level.cpp | 6 + src/p_user.cpp | 6 + src/wi_stuff.cpp | 112 +++++++----- wadsrc/static/zscript/base.txt | 5 +- wadsrc/static/zscript/shared/player.txt | 1 + .../static/zscript/statscreen/statscreen.txt | 160 +++++++++++++++++- 8 files changed, 247 insertions(+), 52 deletions(-) diff --git a/src/b_game.cpp b/src/b_game.cpp index c388c0538f..1f32182f60 100644 --- a/src/b_game.cpp +++ b/src/b_game.cpp @@ -632,3 +632,11 @@ ADD_STAT (bots) BotWTG); return out; } + +DEFINE_ACTION_FUNCTION(FLevelLocals, RemoveAllBots) +{ + PARAM_PROLOGUE; + PARAM_BOOL(fromlist); + bglobal.RemoveAllBots(fromlist); + return 0; +} \ No newline at end of file diff --git a/src/doomstat.cpp b/src/doomstat.cpp index 3093983318..49b4d533f1 100644 --- a/src/doomstat.cpp +++ b/src/doomstat.cpp @@ -61,6 +61,7 @@ CUSTOM_CVAR (String, language, "auto", CVAR_ARCHIVE) // [RH] Network arbitrator int Net_Arbitrator = 0; +DEFINE_GLOBAL(Net_Arbitrator); int NextSkill = -1; diff --git a/src/g_level.cpp b/src/g_level.cpp index e04eadba43..ead3ada992 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1186,6 +1186,12 @@ void G_WorldDone (void) } } +DEFINE_ACTION_FUNCTION(FLevelLocals, WorldDone) +{ + G_WorldDone(); + return 0; +} + //========================================================================== // // diff --git a/src/p_user.cpp b/src/p_user.cpp index e1940548c8..c74a89970a 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -761,6 +761,12 @@ DEFINE_ACTION_FUNCTION(_PlayerInfo, GetTeam) ACTION_RETURN_INT(self->userinfo.GetTeam()); } +DEFINE_ACTION_FUNCTION(_PlayerInfo, GetNoAutostartMap) +{ + PARAM_SELF_STRUCT_PROLOGUE(player_t); + ACTION_RETURN_INT(self->userinfo.GetNoAutostartMap()); +} + //=========================================================================== // diff --git a/src/wi_stuff.cpp b/src/wi_stuff.cpp index 87c69d6763..d7f37b39eb 100644 --- a/src/wi_stuff.cpp +++ b/src/wi_stuff.cpp @@ -719,10 +719,13 @@ struct FPatchInfo } }; +class DStatusScreen; +static DStatusScreen *WI_Screen; -class FIntermissionScreen +class DStatusScreen : public DObject { + DECLARE_CLASS(DStatusScreen, DObject) public: enum EValues @@ -2137,6 +2140,12 @@ public: void WI_Start (wbstartstruct_t *wbstartstruct) { + auto info = FindLevelInfo(wbstartstruct->next, false); + if (info == nullptr) + { + wbstartstruct->next = ""; + } + noautostartmap = false; V_SetBlend (0,0,0,0); WI_initVariables (wbstartstruct); @@ -2152,25 +2161,37 @@ public: } }; -static FIntermissionScreen WI_Screen; - void WI_Ticker() { - WI_Screen.bg->updateAnimatedBack(); - WI_Screen.WI_Ticker(); + if (WI_Screen) + { + WI_Screen->bg->updateAnimatedBack(); + WI_Screen->WI_Ticker(); + } } // Called by main loop, // draws the intermission directly into the screen buffer. void WI_Drawer() { - WI_Screen.WI_Drawer(); + if (WI_Screen) + { + WI_Screen->WI_Drawer(); + if (WI_Screen->state == LeavingIntermission) + { + WI_Screen->Destroy(); + GC::DelSoftRoot(WI_Screen); + WI_Screen = nullptr; + } + } } // Setup for an intermission screen. void WI_Start(wbstartstruct_t *wbstartstruct) { - WI_Screen.WI_Start(wbstartstruct); + WI_Screen = new DStatusScreen; + WI_Screen->WI_Start(wbstartstruct); + GC::AddSoftRoot(WI_Screen); } @@ -2197,41 +2218,42 @@ DEFINE_FIELD_X(WBStartStruct, wbstartstruct_t, totaltime); DEFINE_FIELD_X(WBStartStruct, wbstartstruct_t, pnum); DEFINE_FIELD_X(WBStartStruct, wbstartstruct_t, plyr); -DEFINE_FIELD(FIntermissionScreen, bg); -DEFINE_FIELD(FIntermissionScreen, acceleratestage); -DEFINE_FIELD(FIntermissionScreen, playerready); -DEFINE_FIELD(FIntermissionScreen, me); -DEFINE_FIELD(FIntermissionScreen, bcnt); -DEFINE_FIELD(FIntermissionScreen, state); -DEFINE_FIELD(FIntermissionScreen, wbs); -DEFINE_FIELD(FIntermissionScreen, Plrs); -DEFINE_FIELD(FIntermissionScreen, cnt); -DEFINE_FIELD(FIntermissionScreen, cnt_kills); -DEFINE_FIELD(FIntermissionScreen, cnt_items); -DEFINE_FIELD(FIntermissionScreen, cnt_secret); -DEFINE_FIELD(FIntermissionScreen, cnt_frags); -DEFINE_FIELD(FIntermissionScreen, cnt_deaths); -DEFINE_FIELD(FIntermissionScreen, cnt_time); -DEFINE_FIELD(FIntermissionScreen, cnt_total_time); -DEFINE_FIELD(FIntermissionScreen, cnt_par); -DEFINE_FIELD(FIntermissionScreen, cnt_pause); -DEFINE_FIELD(FIntermissionScreen, total_frags); -DEFINE_FIELD(FIntermissionScreen, total_deaths); -DEFINE_FIELD(FIntermissionScreen, noautostartmap); -DEFINE_FIELD(FIntermissionScreen, dofrags); -DEFINE_FIELD(FIntermissionScreen, ng_state); -DEFINE_FIELD(FIntermissionScreen, shadowalpha); -DEFINE_FIELD(FIntermissionScreen, mapname); -DEFINE_FIELD(FIntermissionScreen, finished); -DEFINE_FIELD(FIntermissionScreen, entering); -DEFINE_FIELD(FIntermissionScreen, P_secret); -DEFINE_FIELD(FIntermissionScreen, Kills); -DEFINE_FIELD(FIntermissionScreen, Secret); -DEFINE_FIELD(FIntermissionScreen, Items); -DEFINE_FIELD(FIntermissionScreen, Timepic); -DEFINE_FIELD(FIntermissionScreen, Par); -DEFINE_FIELD(FIntermissionScreen, Sucks); -DEFINE_FIELD(FIntermissionScreen, lnametexts); -DEFINE_FIELD(FIntermissionScreen, snl_pointeron); -DEFINE_FIELD(FIntermissionScreen, player_deaths); -DEFINE_FIELD(FIntermissionScreen, sp_state); +IMPLEMENT_CLASS(DStatusScreen, false, false) +DEFINE_FIELD(DStatusScreen, bg); +DEFINE_FIELD(DStatusScreen, acceleratestage); +DEFINE_FIELD(DStatusScreen, playerready); +DEFINE_FIELD(DStatusScreen, me); +DEFINE_FIELD(DStatusScreen, bcnt); +DEFINE_FIELD_NAMED(DStatusScreen, state, CurState); +DEFINE_FIELD(DStatusScreen, wbs); +DEFINE_FIELD(DStatusScreen, Plrs); +DEFINE_FIELD(DStatusScreen, cnt); +DEFINE_FIELD(DStatusScreen, cnt_kills); +DEFINE_FIELD(DStatusScreen, cnt_items); +DEFINE_FIELD(DStatusScreen, cnt_secret); +DEFINE_FIELD(DStatusScreen, cnt_frags); +DEFINE_FIELD(DStatusScreen, cnt_deaths); +DEFINE_FIELD(DStatusScreen, cnt_time); +DEFINE_FIELD(DStatusScreen, cnt_total_time); +DEFINE_FIELD(DStatusScreen, cnt_par); +DEFINE_FIELD(DStatusScreen, cnt_pause); +DEFINE_FIELD(DStatusScreen, total_frags); +DEFINE_FIELD(DStatusScreen, total_deaths); +DEFINE_FIELD(DStatusScreen, noautostartmap); +DEFINE_FIELD(DStatusScreen, dofrags); +DEFINE_FIELD(DStatusScreen, ng_state); +DEFINE_FIELD(DStatusScreen, shadowalpha); +DEFINE_FIELD(DStatusScreen, mapname); +DEFINE_FIELD(DStatusScreen, finished); +DEFINE_FIELD(DStatusScreen, entering); +DEFINE_FIELD(DStatusScreen, P_secret); +DEFINE_FIELD(DStatusScreen, Kills); +DEFINE_FIELD(DStatusScreen, Secret); +DEFINE_FIELD(DStatusScreen, Items); +DEFINE_FIELD(DStatusScreen, Timepic); +DEFINE_FIELD(DStatusScreen, Par); +DEFINE_FIELD(DStatusScreen, Sucks); +DEFINE_FIELD(DStatusScreen, lnametexts); +DEFINE_FIELD(DStatusScreen, snl_pointeron); +DEFINE_FIELD(DStatusScreen, player_deaths); +DEFINE_FIELD(DStatusScreen, sp_state); diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 82b05f7551..664e4d9949 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -1,4 +1,4 @@ -struct _ native +struct _ native // These are the global variables, the struct is only here to avoid extending the parser for this. { native readonly Array > AllActorClasses; native readonly Array<@PlayerClass> PlayerClasses; @@ -38,6 +38,7 @@ struct _ native native readonly bool demoplayback; native ui int BackbuttonTime; native ui float BackbuttonAlpha; + native readonly int Net_Arbitrator; } @@ -496,6 +497,8 @@ struct LevelLocals native native double GetUDMFFloat(int type, int index, Name key); native bool ExecuteSpecial(int special, Actor activator, line linedef, bool lineside, int arg1 = 0, int arg2 = 0, int arg3 = 0, int arg4 = 0, int arg5 = 0); native static void StartSlideshow(Name whichone = 'none'); + native static void WorldDone(); + native static void RemoveAllBots(bool fromlist); } struct StringTable native diff --git a/wadsrc/static/zscript/shared/player.txt b/wadsrc/static/zscript/shared/player.txt index 038e62a9dc..011daae650 100644 --- a/wadsrc/static/zscript/shared/player.txt +++ b/wadsrc/static/zscript/shared/player.txt @@ -356,6 +356,7 @@ usercmd_t original_cmd; native int GetGender() const; native int GetTeam() const; native float GetAutoaim() const; + native bool GetNoAutostartMap() const; native void SetFOV(float fov); } diff --git a/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/statscreen/statscreen.txt index 47a177cde7..2bfbde5be1 100644 --- a/wadsrc/static/zscript/statscreen/statscreen.txt +++ b/wadsrc/static/zscript/statscreen/statscreen.txt @@ -1,13 +1,14 @@ +// Note that the status screen needs to run in 'play' scope! -class InterBackground native +class InterBackground native play { native InterBackground Create(wbstartstruct wbst); native bool LoadBackground(bool isenterpic); native void updateAnimatedBack(); - native void drawBackground(int state, bool drawsplat, bool snl_pointeron); + native void drawBackground(int CurState, bool drawsplat, bool snl_pointeron); } -struct PatchInfo +struct PatchInfo play { Font mFont; TextureID mPatch; @@ -36,7 +37,7 @@ struct PatchInfo // Will be made a class later, but for now needs to mirror the internal version. -struct IntermissionScreen native +class StatusScreen native play { enum EValues { @@ -54,7 +55,13 @@ struct IntermissionScreen native NG_STATSY = 50, }; - + enum EState + { + NoState = -1, + StatCount, + ShowNextLoc, + LeavingIntermission + }; // States for single-player enum ESPState @@ -73,7 +80,7 @@ struct IntermissionScreen native native bool playerready[MAXPLAYERS]; native int me; // wbs.pnum native int bcnt; - native int state; // specifies current state + native int CurState; // specifies current CurState native wbstartstruct wbs; // contains information passed into intermission native wbplayerstruct Plrs[MAXPLAYERS]; // wbs.plyr[] native int cnt; // used for general timing @@ -347,6 +354,7 @@ struct IntermissionScreen native // Display level completion time and par, or "sucks" message if overflow. // //==================================================================== + protected void drawTime (int x, int y, int t, bool no_sucks=false) { bool sucky; @@ -390,5 +398,145 @@ struct IntermissionScreen native } } + + //==================================================================== + // + // + // + //==================================================================== + + protected void End () + { + CurState = LeavingIntermission; + + //Added by mc + if (deathmatch) + { + level.RemoveAllBots (consoleplayer != Net_Arbitrator); + } + } + + //==================================================================== + // + // + // + //==================================================================== + + protected bool autoSkip() + { + return wi_autoadvance > 0 && bcnt > (wi_autoadvance * Thinker.TICRATE); + } + + //==================================================================== + // + // + // + //==================================================================== + + protected void initNoState () + { + CurState = NoState; + acceleratestage = 0; + cnt = 10; + } + + //==================================================================== + // + // + // + //==================================================================== + + protected void updateNoState () + { + if (acceleratestage) + { + cnt = 0; + } + else + { + bool noauto = noautostartmap; + + for (int i = 0; !noauto && i < MAXPLAYERS; ++i) + { + if (playeringame[i]) + { + noauto |= players[i].GetNoAutostartMap(); + } + } + if (!noauto || autoSkip()) + { + cnt--; + } + } + + if (cnt == 0) + { + End(); + level.WorldDone(); + } + } + + //==================================================================== + // + // + // + //==================================================================== + + protected void initShowNextLoc () + { + if (wbs.next == "") + { + // Last map in episode - there is no next location! + End(); + level.WorldDone(); + return; + } + + CurState = ShowNextLoc; + acceleratestage = 0; + cnt = SHOWNEXTLOCDELAY * Thinker.TICRATE; + bg.LoadBackground(true); + } + + //==================================================================== + // + // + // + //==================================================================== + + protected void updateShowNextLoc () + { + if (!--cnt || acceleratestage) + initNoState(); + else + snl_pointeron = (cnt & 31) < 20; + } + + //==================================================================== + // + // + // + //==================================================================== + + protected void drawShowNextLoc(void) + { + bg.drawBackground(CurState, true, snl_pointeron); + + // draws which level you are entering.. + drawEL (); + + } + + //==================================================================== + // + // + // + //==================================================================== + + void WI_drawNoState () + { + snl_pointeron = true; + drawShowNextLoc(); + } }