From 237d00f6fff3545c39fead0f84b97c62c408c0bf Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 12 Aug 2019 22:12:20 -0400 Subject: [PATCH 01/50] WIP 2.2 title screen (Alacroix) --- src/dehacked.c | 106 ++++++++++++++++++- src/f_finale.c | 271 +++++++++++++++++++++++++++++++++++++++---------- src/f_finale.h | 33 +++++- src/m_menu.c | 61 ++++++++++- src/m_menu.h | 18 +++- 5 files changed, 425 insertions(+), 64 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 2f28a74cf..7e18063ed 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -2010,12 +2010,63 @@ static void readmenu(MYFILE *f, INT32 num) menupres[num].bgcolor = get_number(word2); titlechanged = true; } - else if (fastcmp(word, "HIDETITLEPICS") || fastcmp(word, "HIDEPICS")) + else if (fastcmp(word, "HIDETITLEPICS") || fastcmp(word, "HIDEPICS") || fastcmp(word, "TITLEPICSHIDE")) { // true by default, except MM_MAIN menupres[num].hidetitlepics = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } + else if (fastcmp(word, "TITLEPICSMODE")) + { + if (fastcmp(word2, "USER")) + menupres[num].ttmode = TTMODE_USER; + else if (fastcmp(word2, "ALACROIX")) + menupres[num].ttmode = TTMODE_ALACROIX; + else if (fastcmp(word2, "HIDE") || fastcmp(word2, "HIDDEN") || fastcmp(word2, "NONE")) + { + menupres[num].ttmode = TTMODE_USER; + menupres[num].ttname[0] = 0; + menupres[num].hidetitlepics = true; + } + else // if (fastcmp(word2, "OLD") || fastcmp(word2, "SSNTAILS")) + menupres[num].ttmode = TTMODE_OLD; + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSSCALE")) + { + menupres[num].ttscale = max(1, min(8, (UINT8)get_number(word2))); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSCOUNTERSET")) + { + menupres[num].ttcounterset = (INT32)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSNAME")) + { + strncpy(menupres[num].ttname, word2, 9); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSX")) + { + menupres[num].ttx = (INT16)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSY")) + { + menupres[num].tty = (INT16)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSLOOP")) + { + menupres[num].ttloop = (INT16)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSTICS")) + { + menupres[num].tttics = (UINT16)get_number(word2); + titlechanged = true; + } else if (fastcmp(word, "TITLESCROLLSPEED") || fastcmp(word, "TITLESCROLLXSPEED") || fastcmp(word, "SCROLLSPEED") || fastcmp(word, "SCROLLXSPEED")) { @@ -3374,11 +3425,62 @@ static void readmaincfg(MYFILE *f) titlemap = (INT16)value; titlechanged = true; } - else if (fastcmp(word, "HIDETITLEPICS")) + else if (fastcmp(word, "HIDETITLEPICS") || fastcmp(word, "TITLEPICSHIDE")) { hidetitlepics = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } + else if (fastcmp(word, "TITLEPICSMODE")) + { + if (fastcmp(word2, "USER")) + ttmode = TTMODE_USER; + else if (fastcmp(word2, "ALACROIX")) + ttmode = TTMODE_ALACROIX; + else if (fastcmp(word2, "HIDE") || fastcmp(word2, "HIDDEN") || fastcmp(word2, "NONE")) + { + ttmode = TTMODE_USER; + ttname[0] = 0; + hidetitlepics = true; + } + else // if (fastcmp(word2, "OLD") || fastcmp(word2, "SSNTAILS")) + ttmode = TTMODE_OLD; + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSSCALE")) + { + ttscale = max(1, min(8, (UINT8)get_number(word2))); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSCOUNTERSET")) + { + ttcounterset = (INT32)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSNAME")) + { + strncpy(ttname, word2, 9); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSX")) + { + ttx = (INT16)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSY")) + { + tty = (INT16)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSLOOP")) + { + ttloop = (INT16)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSTICS")) + { + tttics = (UINT16)get_number(word2); + titlechanged = true; + } else if (fastcmp(word, "TITLESCROLLSPEED") || fastcmp(word, "TITLESCROLLXSPEED")) { titlescrollxspeed = get_number(word2); diff --git a/src/f_finale.c b/src/f_finale.c index f3ab235b8..586c1b7af 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -70,7 +70,6 @@ mobj_t *titlemapcameraref = NULL; // menu presentation state char curbgname[9]; SINT8 curfadevalue; -boolean curhidepics; INT32 curbgcolor; INT32 curbgxspeed; INT32 curbgyspeed; @@ -80,6 +79,30 @@ static UINT8 curDemo = 0; static UINT32 demoDelayLeft; static UINT32 demoIdleLeft; +// customizable title screen graphics + +ttmode_enum ttmode = TTMODE_OLD; +UINT8 ttscale = 1; // FRACUNIT / ttscale +INT32 ttcounterset = -1; +// ttmode user vars +char ttname[9]; +INT16 ttx = 0; +INT16 tty = 0; +INT16 ttloop = 0; +UINT16 tttics = 1; + +boolean curhidepics; +ttmode_enum curttmode; +UINT8 curttscale; +INT32 curttcounterset; +// ttmode user vars +char curttname[9]; +INT16 curttx; +INT16 curtty; +INT16 curttloop; +UINT16 curtttics; + +// ttmode old static patch_t *ttbanner; // white banner with "robo blast" and "2" static patch_t *ttwing; // wing background static patch_t *ttsonic; // "SONIC" @@ -96,6 +119,16 @@ static patch_t *ttspop5; static patch_t *ttspop6; static patch_t *ttspop7; +// ttmode alacroix +static patch_t *ttribb[TTMAX_ALACROIX]; +static patch_t *ttsntx[TTMAX_ALACROIX]; +static patch_t *ttrobo[TTMAX_ALACROIX]; +static patch_t *tttwot[TTMAX_ALACROIX]; +static patch_t *ttembl[TTMAX_ALACROIX]; + +// ttmode user +static patch_t *ttuser[TTMAX_USER]; + static boolean goodending; static patch_t *endbrdr[2]; // border - blue, white, pink - where have i seen those colours before? static patch_t *endbgsp[3]; // nebula, sun, planet @@ -2095,16 +2128,25 @@ void F_InitMenuPresValues(void) // Set defaults for presentation values strncpy(curbgname, "TITLESKY", 9); curfadevalue = 16; - curhidepics = hidetitlepics; curbgcolor = -1; curbgxspeed = titlescrollxspeed; curbgyspeed = titlescrollyspeed; curbghide = true; + + curhidepics = hidetitlepics; + curttmode = ttmode; + curttscale = ttscale; + curttcounterset = ttcounterset; + strncpy(curttname, ttname, 9); + curttx = ttx; + curtty = tty; + curttloop = ttloop; + curtttics = tttics; // Find current presentation values M_SetMenuCurBackground((gamestate == GS_TIMEATTACK) ? "SRB2BACK" : "TITLESKY"); M_SetMenuCurFadeValue(16); - M_SetMenuCurHideTitlePics(); + M_SetMenuCurTitlePics(); } // @@ -2255,27 +2297,88 @@ void F_StartTitleScreen(void) demoDelayLeft = demoDelayTime; demoIdleLeft = demoIdleTime; - ttbanner = W_CachePatchName("TTBANNER", PU_LEVEL); - ttwing = W_CachePatchName("TTWING", PU_LEVEL); - ttsonic = W_CachePatchName("TTSONIC", PU_LEVEL); - ttswave1 = W_CachePatchName("TTSWAVE1", PU_LEVEL); - ttswave2 = W_CachePatchName("TTSWAVE2", PU_LEVEL); - ttswip1 = W_CachePatchName("TTSWIP1", PU_LEVEL); - ttsprep1 = W_CachePatchName("TTSPREP1", PU_LEVEL); - ttsprep2 = W_CachePatchName("TTSPREP2", PU_LEVEL); - ttspop1 = W_CachePatchName("TTSPOP1", PU_LEVEL); - ttspop2 = W_CachePatchName("TTSPOP2", PU_LEVEL); - ttspop3 = W_CachePatchName("TTSPOP3", PU_LEVEL); - ttspop4 = W_CachePatchName("TTSPOP4", PU_LEVEL); - ttspop5 = W_CachePatchName("TTSPOP5", PU_LEVEL); - ttspop6 = W_CachePatchName("TTSPOP6", PU_LEVEL); - ttspop7 = W_CachePatchName("TTSPOP7", PU_LEVEL); +#define LOADTTGFX(arr, name, maxf) \ +lumpnum = W_CheckNumForName(name); \ +if (lumpnum != LUMPERROR) \ +{ \ + arr[0] = W_CachePatchName(name, PU_LEVEL); \ + arr[min(1, maxf-1)] = 0; \ +} \ +else if (strlen(name) <= 6) \ +{ \ + fixed_t cnt = strlen(name); \ + strncpy(lumpname, name, 7); \ + for (i = 0; i < maxf-1; i++) \ + { \ + sprintf(&lumpname[cnt], "%.2hu", (UINT16)(i+1)); \ + lumpname[8] = 0; \ + lumpnum = W_CheckNumForName(lumpname); \ + if (lumpnum != LUMPERROR) \ + arr[i] = W_CachePatchName(lumpname, PU_LEVEL); \ + else \ + break; \ + } \ + arr[min(i, maxf-1)] = 0; \ +} \ +else \ + arr[0] = 0; + + switch(curttmode) + { + case TTMODE_OLD: + case TTMODE_NONE: + ttbanner = W_CachePatchName("TTBANNER", PU_LEVEL); + ttwing = W_CachePatchName("TTWING", PU_LEVEL); + ttsonic = W_CachePatchName("TTSONIC", PU_LEVEL); + ttswave1 = W_CachePatchName("TTSWAVE1", PU_LEVEL); + ttswave2 = W_CachePatchName("TTSWAVE2", PU_LEVEL); + ttswip1 = W_CachePatchName("TTSWIP1", PU_LEVEL); + ttsprep1 = W_CachePatchName("TTSPREP1", PU_LEVEL); + ttsprep2 = W_CachePatchName("TTSPREP2", PU_LEVEL); + ttspop1 = W_CachePatchName("TTSPOP1", PU_LEVEL); + ttspop2 = W_CachePatchName("TTSPOP2", PU_LEVEL); + ttspop3 = W_CachePatchName("TTSPOP3", PU_LEVEL); + ttspop4 = W_CachePatchName("TTSPOP4", PU_LEVEL); + ttspop5 = W_CachePatchName("TTSPOP5", PU_LEVEL); + ttspop6 = W_CachePatchName("TTSPOP6", PU_LEVEL); + ttspop7 = W_CachePatchName("TTSPOP7", PU_LEVEL); + break; + + case TTMODE_ALACROIX: + { + UINT16 i; + lumpnum_t lumpnum; + char lumpname[9]; + + finalecount -= 3; // hack so that frames don't advance during the entry wipe + + LOADTTGFX(ttembl, "TTEMBL", TTMAX_ALACROIX) + LOADTTGFX(ttribb, "TTRIBB", TTMAX_ALACROIX) + LOADTTGFX(ttsntx, "TTSNTX", TTMAX_ALACROIX) + LOADTTGFX(ttrobo, "TTROBO", TTMAX_ALACROIX) + LOADTTGFX(tttwot, "TTTWOT", TTMAX_ALACROIX) + break; + } + + case TTMODE_USER: + { + UINT16 i; + lumpnum_t lumpnum; + char lumpname[9]; + + LOADTTGFX(ttuser, curttname, TTMAX_USER) + break; + } + } + +#undef LOADTTGFX } // (no longer) De-Demo'd Title Screen void F_TitleScreenDrawer(void) { boolean hidepics; + fixed_t sc = FRACUNIT / max(1, curttscale); if (modeattacking) return; // We likely came here from retrying. Don't do a damn thing. @@ -2287,7 +2390,7 @@ void F_TitleScreenDrawer(void) F_SkyScroll(curbgxspeed, curbgyspeed, curbgname); // Don't draw outside of the title screen, or if the patch isn't there. - if (!ttwing || (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS)) + if (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS) return; // rei|miru: use title pics? @@ -2299,42 +2402,104 @@ void F_TitleScreenDrawer(void) return; #endif - V_DrawScaledPatch(30, 14, 0, ttwing); - - if (finalecount < 57) + switch(curttmode) { - if (finalecount == 35) - V_DrawScaledPatch(115, 15, 0, ttspop1); - else if (finalecount == 36) - V_DrawScaledPatch(114, 15, 0,ttspop2); - else if (finalecount == 37) - V_DrawScaledPatch(113, 15, 0,ttspop3); - else if (finalecount == 38) - V_DrawScaledPatch(112, 15, 0,ttspop4); - else if (finalecount == 39) - V_DrawScaledPatch(111, 15, 0,ttspop5); - else if (finalecount == 40) - V_DrawScaledPatch(110, 15, 0, ttspop6); - else if (finalecount >= 41 && finalecount <= 44) - V_DrawScaledPatch(109, 15, 0, ttspop7); - else if (finalecount >= 45 && finalecount <= 48) - V_DrawScaledPatch(108, 12, 0, ttsprep1); - else if (finalecount >= 49 && finalecount <= 52) - V_DrawScaledPatch(107, 9, 0, ttsprep2); - else if (finalecount >= 53 && finalecount <= 56) - V_DrawScaledPatch(106, 6, 0, ttswip1); - V_DrawScaledPatch(93, 106, 0, ttsonic); - } - else - { - V_DrawScaledPatch(93, 106, 0,ttsonic); - if (finalecount/5 & 1) - V_DrawScaledPatch(100, 3, 0,ttswave1); - else - V_DrawScaledPatch(100,3, 0,ttswave2); - } + case TTMODE_OLD: + case TTMODE_NONE: + V_DrawSciencePatch(30<= 41 && finalecount <= 44) + V_DrawSciencePatch(109<= 45 && finalecount <= 48) + V_DrawSciencePatch(108<= 49 && finalecount <= 52) + V_DrawSciencePatch(107<= 53 && finalecount <= 56) + V_DrawSciencePatch(106< 31 && 41-finalecount > 0 && 41-finalecount < 10) + V_DrawFadeScreen(0, 41-finalecount); + + // Draw emblem + V_DrawSciencePatch(52< 9) + { + // Fade value for ROBO BLAST + INT32 fadeval = 0; + + // Draw SONIC text + V_DrawSciencePatch(94<= 0 || curbgname[0]) void F_InitMenuPresValues(void); diff --git a/src/m_menu.c b/src/m_menu.c index ca389a94d..3af93ddd2 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2228,6 +2228,14 @@ void M_InitMenuPresTables(void) // so-called "undefined" menupres[i].fadestrength = -1; menupres[i].hidetitlepics = -1; // inherits global hidetitlepics + menupres[i].ttmode = TTMODE_NONE; + menupres[i].ttscale = UINT8_MAX; + menupres[i].ttcounterset = INT32_MAX; + menupres[i].ttname[0] = 0; + menupres[i].ttx = INT16_MAX; + menupres[i].tty = INT16_MAX; + menupres[i].ttloop = INT16_MAX; + menupres[i].tttics = UINT16_MAX; menupres[i].enterwipe = -1; menupres[i].exitwipe = -1; menupres[i].bgcolor = -1; @@ -2404,7 +2412,7 @@ static boolean MIT_SetCurFadeValue(UINT32 menutype, INT32 level, INT32 *retval, return false; } -static boolean MIT_SetCurHideTitlePics(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) +static boolean MIT_SetCurTitlePics(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { (void)input; (void)retval; @@ -2418,8 +2426,44 @@ static boolean MIT_SetCurHideTitlePics(UINT32 menutype, INT32 level, INT32 *retv curhidepics = menupres[menutype].hidetitlepics; return true; } + else if (menupres[menutype].ttmode == TTMODE_USER) + { + if (menupres[menutype].ttname[0]) + { + curhidepics = menupres[menutype].hidetitlepics; + curttmode = menupres[menutype].ttmode; + curttscale = (menupres[menutype].ttscale != UINT8_MAX ? menupres[menutype].ttscale : ttscale); + curttcounterset = (menupres[menutype].ttcounterset != INT32_MAX ? menupres[menutype].ttcounterset : ttcounterset); + strncpy(curttname, menupres[menutype].ttname, 9); + curttx = (menupres[menutype].ttx != INT16_MAX ? menupres[menutype].ttx : ttx); + curtty = (menupres[menutype].tty != INT16_MAX ? menupres[menutype].tty : tty); + curttloop = (menupres[menutype].ttloop != INT16_MAX ? menupres[menutype].ttloop : ttloop); + curtttics = (menupres[menutype].tttics != UINT16_MAX ? menupres[menutype].tttics : tttics); + } + else + curhidepics = menupres[menutype].hidetitlepics; + return true; + } + else if (menupres[menutype].ttmode != TTMODE_NONE) + { + curhidepics = menupres[menutype].hidetitlepics; + curttmode = menupres[menutype].ttmode; + curttscale = (menupres[menutype].ttscale != UINT8_MAX ? menupres[menutype].ttscale : ttscale); + curttcounterset = (menupres[menutype].ttcounterset != INT32_MAX ? menupres[menutype].ttcounterset : ttcounterset); + return true; + } else if (!level) + { curhidepics = hidetitlepics; + curttmode = ttmode; + curttscale = ttscale; + curttcounterset = ttcounterset; + strncpy(curttname, ttname, 9); + curttx = ttx; + curtty = tty; + curttloop = ttloop; + curtttics = tttics; + } return false; } @@ -2464,9 +2508,9 @@ void M_SetMenuCurFadeValue(UINT8 defaultvalue) M_IterateMenuTree(MIT_SetCurFadeValue, &defaultvalue); } -void M_SetMenuCurHideTitlePics(void) +void M_SetMenuCurTitlePics(void) { - M_IterateMenuTree(MIT_SetCurHideTitlePics, NULL); + M_IterateMenuTree(MIT_SetCurTitlePics, NULL); } // ==================================== @@ -2516,6 +2560,15 @@ static void M_HandleMenuPresState(menu_t *newMenu) curbgyspeed = titlescrollyspeed; curbghide = (gamestate != GS_TIMEATTACK); // show in time attack, hide in other menus + curttmode = ttmode; + curttscale = ttscale; + curttcounterset = ttcounterset; + strncpy(curttname, ttname, 9); + curttx = ttx; + curtty = tty; + curttloop = ttloop; + curtttics = tttics; + // don't do the below during the in-game menus if (gamestate != GS_TITLESCREEN && gamestate != GS_TIMEATTACK) return; @@ -2523,7 +2576,7 @@ static void M_HandleMenuPresState(menu_t *newMenu) // Find current presentation values M_SetMenuCurBackground((gamestate == GS_TIMEATTACK) ? "SRB2BACK" : "TITLESKY"); M_SetMenuCurFadeValue(16); - M_SetMenuCurHideTitlePics(); + M_SetMenuCurTitlePics(); // Loop through both menu IDs in parallel and look for type changes // The youngest child in activeMenuId is the entered menu diff --git a/src/m_menu.h b/src/m_menu.h index 347725e10..9461a0d3a 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -18,6 +18,7 @@ #include "d_event.h" #include "command.h" #include "r_things.h" // for SKINNAMESIZE +#include "f_finale.h" // for ttmode_enum // // MENUS @@ -124,19 +125,28 @@ typedef enum typedef struct { char bgname[8]; // name for background gfx lump; lays over titlemap if this is set - SINT8 hidetitlepics; // hide title gfx per menu; -1 means undefined, inherits global setting + SINT8 fadestrength; // darken background when displaying this menu, strength 0-31 or -1 for undefined + INT32 bgcolor; // fill color, overrides bg name. -1 means follow bg name rules. INT32 titlescrollxspeed; // background gfx scroll per menu; inherits global setting INT32 titlescrollyspeed; // y scroll - INT32 bgcolor; // fill color, overrides bg name. -1 means follow bg name rules. boolean bghide; // for titlemaps, hide the background. + SINT8 hidetitlepics; // hide title gfx per menu; -1 means undefined, inherits global setting + ttmode_enum ttmode; // title wing animation mode; default TTMODE_OLD + UINT8 ttscale; // scale of title wing gfx (FRACUNIT / ttscale); -1 means undefined, inherits global setting + INT32 ttcounterset; // Value to reset animation counter to on subsequent menu viewings. + char ttname[9]; // lump name of title wing gfx. If name length is <= 6, engine will attempt to load numbered frames (TTNAMExx) + INT16 ttx; // X position of title wing + INT16 tty; // Y position of title wing + INT16 ttloop; // # frame to loop; -1 means dont loop + UINT16 tttics; // # of tics per frame + char musname[7]; ///< Music track to play. "" for no music. UINT16 mustrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore. boolean muslooping; ///< Loop the music boolean musstop; ///< Don't play any music boolean musignore; ///< Let the current music keep playing - SINT8 fadestrength; // darken background when displaying this menu, strength 0-31 or -1 for undefined boolean enterbubble; // run all entrance line execs after common ancestor and up to child. If false, only run the child's exec boolean exitbubble; // run all exit line execs from child and up to before common ancestor. If false, only run the child's exec INT32 entertag; // line exec to run on menu enter, if titlemap @@ -154,7 +164,7 @@ UINT8 M_GetYoungestChildMenu(void); void M_ChangeMenuMusic(const char *defaultmusname, boolean defaultmuslooping); void M_SetMenuCurBackground(const char *defaultname); void M_SetMenuCurFadeValue(UINT8 defaultvalue); -void M_SetMenuCurHideTitlePics(void); +void M_SetMenuCurTitlePics(void); // Called by main loop, // saves config file and calls I_Quit when user exits. From 57974168c8843bb8c6c6e1fa54d19582481de614 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 12 Aug 2019 22:12:20 -0400 Subject: [PATCH 02/50] WIP 2.2 title screen (Alacroix) --- src/dehacked.c | 106 ++++++++++++++++++- src/f_finale.c | 279 +++++++++++++++++++++++++++++++++++++++---------- src/f_finale.h | 33 +++++- src/m_menu.c | 61 ++++++++++- src/m_menu.h | 18 +++- 5 files changed, 432 insertions(+), 65 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 2f28a74cf..7e18063ed 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -2010,12 +2010,63 @@ static void readmenu(MYFILE *f, INT32 num) menupres[num].bgcolor = get_number(word2); titlechanged = true; } - else if (fastcmp(word, "HIDETITLEPICS") || fastcmp(word, "HIDEPICS")) + else if (fastcmp(word, "HIDETITLEPICS") || fastcmp(word, "HIDEPICS") || fastcmp(word, "TITLEPICSHIDE")) { // true by default, except MM_MAIN menupres[num].hidetitlepics = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } + else if (fastcmp(word, "TITLEPICSMODE")) + { + if (fastcmp(word2, "USER")) + menupres[num].ttmode = TTMODE_USER; + else if (fastcmp(word2, "ALACROIX")) + menupres[num].ttmode = TTMODE_ALACROIX; + else if (fastcmp(word2, "HIDE") || fastcmp(word2, "HIDDEN") || fastcmp(word2, "NONE")) + { + menupres[num].ttmode = TTMODE_USER; + menupres[num].ttname[0] = 0; + menupres[num].hidetitlepics = true; + } + else // if (fastcmp(word2, "OLD") || fastcmp(word2, "SSNTAILS")) + menupres[num].ttmode = TTMODE_OLD; + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSSCALE")) + { + menupres[num].ttscale = max(1, min(8, (UINT8)get_number(word2))); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSCOUNTERSET")) + { + menupres[num].ttcounterset = (INT32)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSNAME")) + { + strncpy(menupres[num].ttname, word2, 9); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSX")) + { + menupres[num].ttx = (INT16)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSY")) + { + menupres[num].tty = (INT16)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSLOOP")) + { + menupres[num].ttloop = (INT16)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSTICS")) + { + menupres[num].tttics = (UINT16)get_number(word2); + titlechanged = true; + } else if (fastcmp(word, "TITLESCROLLSPEED") || fastcmp(word, "TITLESCROLLXSPEED") || fastcmp(word, "SCROLLSPEED") || fastcmp(word, "SCROLLXSPEED")) { @@ -3374,11 +3425,62 @@ static void readmaincfg(MYFILE *f) titlemap = (INT16)value; titlechanged = true; } - else if (fastcmp(word, "HIDETITLEPICS")) + else if (fastcmp(word, "HIDETITLEPICS") || fastcmp(word, "TITLEPICSHIDE")) { hidetitlepics = (boolean)(value || word2[0] == 'T' || word2[0] == 'Y'); titlechanged = true; } + else if (fastcmp(word, "TITLEPICSMODE")) + { + if (fastcmp(word2, "USER")) + ttmode = TTMODE_USER; + else if (fastcmp(word2, "ALACROIX")) + ttmode = TTMODE_ALACROIX; + else if (fastcmp(word2, "HIDE") || fastcmp(word2, "HIDDEN") || fastcmp(word2, "NONE")) + { + ttmode = TTMODE_USER; + ttname[0] = 0; + hidetitlepics = true; + } + else // if (fastcmp(word2, "OLD") || fastcmp(word2, "SSNTAILS")) + ttmode = TTMODE_OLD; + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSSCALE")) + { + ttscale = max(1, min(8, (UINT8)get_number(word2))); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSCOUNTERSET")) + { + ttcounterset = (INT32)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSNAME")) + { + strncpy(ttname, word2, 9); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSX")) + { + ttx = (INT16)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSY")) + { + tty = (INT16)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSLOOP")) + { + ttloop = (INT16)get_number(word2); + titlechanged = true; + } + else if (fastcmp(word, "TITLEPICSTICS")) + { + tttics = (UINT16)get_number(word2); + titlechanged = true; + } else if (fastcmp(word, "TITLESCROLLSPEED") || fastcmp(word, "TITLESCROLLXSPEED")) { titlescrollxspeed = get_number(word2); diff --git a/src/f_finale.c b/src/f_finale.c index f3ab235b8..846377218 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -70,7 +70,6 @@ mobj_t *titlemapcameraref = NULL; // menu presentation state char curbgname[9]; SINT8 curfadevalue; -boolean curhidepics; INT32 curbgcolor; INT32 curbgxspeed; INT32 curbgyspeed; @@ -80,6 +79,30 @@ static UINT8 curDemo = 0; static UINT32 demoDelayLeft; static UINT32 demoIdleLeft; +// customizable title screen graphics + +ttmode_enum ttmode = TTMODE_OLD; +UINT8 ttscale = 1; // FRACUNIT / ttscale +INT32 ttcounterset = -1; +// ttmode user vars +char ttname[9]; +INT16 ttx = 0; +INT16 tty = 0; +INT16 ttloop = 0; +UINT16 tttics = 1; + +boolean curhidepics; +ttmode_enum curttmode; +UINT8 curttscale; +INT32 curttcounterset; +// ttmode user vars +char curttname[9]; +INT16 curttx; +INT16 curtty; +INT16 curttloop; +UINT16 curtttics; + +// ttmode old static patch_t *ttbanner; // white banner with "robo blast" and "2" static patch_t *ttwing; // wing background static patch_t *ttsonic; // "SONIC" @@ -96,6 +119,16 @@ static patch_t *ttspop5; static patch_t *ttspop6; static patch_t *ttspop7; +// ttmode alacroix +static patch_t *ttribb[TTMAX_ALACROIX]; +static patch_t *ttsntx[TTMAX_ALACROIX]; +static patch_t *ttrobo[TTMAX_ALACROIX]; +static patch_t *tttwot[TTMAX_ALACROIX]; +static patch_t *ttembl[TTMAX_ALACROIX]; + +// ttmode user +static patch_t *ttuser[TTMAX_USER]; + static boolean goodending; static patch_t *endbrdr[2]; // border - blue, white, pink - where have i seen those colours before? static patch_t *endbgsp[3]; // nebula, sun, planet @@ -2095,16 +2128,25 @@ void F_InitMenuPresValues(void) // Set defaults for presentation values strncpy(curbgname, "TITLESKY", 9); curfadevalue = 16; - curhidepics = hidetitlepics; curbgcolor = -1; curbgxspeed = titlescrollxspeed; curbgyspeed = titlescrollyspeed; curbghide = true; + + curhidepics = hidetitlepics; + curttmode = ttmode; + curttscale = ttscale; + curttcounterset = ttcounterset; + strncpy(curttname, ttname, 9); + curttx = ttx; + curtty = tty; + curttloop = ttloop; + curtttics = tttics; // Find current presentation values M_SetMenuCurBackground((gamestate == GS_TIMEATTACK) ? "SRB2BACK" : "TITLESKY"); M_SetMenuCurFadeValue(16); - M_SetMenuCurHideTitlePics(); + M_SetMenuCurTitlePics(); } // @@ -2180,7 +2222,10 @@ void F_StartTitleScreen(void) if (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS) { - finalecount = 0; + if (curttmode == TTMODE_ALACROIX) + finalecount = -3; // hack so that frames don't advance during the entry wipe + else + finalecount = 0; wipetypepost = menupres[MN_MAIN].enterwipe; } else @@ -2255,27 +2300,86 @@ void F_StartTitleScreen(void) demoDelayLeft = demoDelayTime; demoIdleLeft = demoIdleTime; - ttbanner = W_CachePatchName("TTBANNER", PU_LEVEL); - ttwing = W_CachePatchName("TTWING", PU_LEVEL); - ttsonic = W_CachePatchName("TTSONIC", PU_LEVEL); - ttswave1 = W_CachePatchName("TTSWAVE1", PU_LEVEL); - ttswave2 = W_CachePatchName("TTSWAVE2", PU_LEVEL); - ttswip1 = W_CachePatchName("TTSWIP1", PU_LEVEL); - ttsprep1 = W_CachePatchName("TTSPREP1", PU_LEVEL); - ttsprep2 = W_CachePatchName("TTSPREP2", PU_LEVEL); - ttspop1 = W_CachePatchName("TTSPOP1", PU_LEVEL); - ttspop2 = W_CachePatchName("TTSPOP2", PU_LEVEL); - ttspop3 = W_CachePatchName("TTSPOP3", PU_LEVEL); - ttspop4 = W_CachePatchName("TTSPOP4", PU_LEVEL); - ttspop5 = W_CachePatchName("TTSPOP5", PU_LEVEL); - ttspop6 = W_CachePatchName("TTSPOP6", PU_LEVEL); - ttspop7 = W_CachePatchName("TTSPOP7", PU_LEVEL); +#define LOADTTGFX(arr, name, maxf) \ +lumpnum = W_CheckNumForName(name); \ +if (lumpnum != LUMPERROR) \ +{ \ + arr[0] = W_CachePatchName(name, PU_LEVEL); \ + arr[min(1, maxf-1)] = 0; \ +} \ +else if (strlen(name) <= 6) \ +{ \ + fixed_t cnt = strlen(name); \ + strncpy(lumpname, name, 7); \ + for (i = 0; i < maxf-1; i++) \ + { \ + sprintf(&lumpname[cnt], "%.2hu", (UINT16)(i+1)); \ + lumpname[8] = 0; \ + lumpnum = W_CheckNumForName(lumpname); \ + if (lumpnum != LUMPERROR) \ + arr[i] = W_CachePatchName(lumpname, PU_LEVEL); \ + else \ + break; \ + } \ + arr[min(i, maxf-1)] = 0; \ +} \ +else \ + arr[0] = 0; + + switch(curttmode) + { + case TTMODE_OLD: + case TTMODE_NONE: + ttbanner = W_CachePatchName("TTBANNER", PU_LEVEL); + ttwing = W_CachePatchName("TTWING", PU_LEVEL); + ttsonic = W_CachePatchName("TTSONIC", PU_LEVEL); + ttswave1 = W_CachePatchName("TTSWAVE1", PU_LEVEL); + ttswave2 = W_CachePatchName("TTSWAVE2", PU_LEVEL); + ttswip1 = W_CachePatchName("TTSWIP1", PU_LEVEL); + ttsprep1 = W_CachePatchName("TTSPREP1", PU_LEVEL); + ttsprep2 = W_CachePatchName("TTSPREP2", PU_LEVEL); + ttspop1 = W_CachePatchName("TTSPOP1", PU_LEVEL); + ttspop2 = W_CachePatchName("TTSPOP2", PU_LEVEL); + ttspop3 = W_CachePatchName("TTSPOP3", PU_LEVEL); + ttspop4 = W_CachePatchName("TTSPOP4", PU_LEVEL); + ttspop5 = W_CachePatchName("TTSPOP5", PU_LEVEL); + ttspop6 = W_CachePatchName("TTSPOP6", PU_LEVEL); + ttspop7 = W_CachePatchName("TTSPOP7", PU_LEVEL); + break; + + case TTMODE_ALACROIX: + { + UINT16 i; + lumpnum_t lumpnum; + char lumpname[9]; + + LOADTTGFX(ttembl, "TTEMBL", TTMAX_ALACROIX) + LOADTTGFX(ttribb, "TTRIBB", TTMAX_ALACROIX) + LOADTTGFX(ttsntx, "TTSNTX", TTMAX_ALACROIX) + LOADTTGFX(ttrobo, "TTROBO", TTMAX_ALACROIX) + LOADTTGFX(tttwot, "TTTWOT", TTMAX_ALACROIX) + break; + } + + case TTMODE_USER: + { + UINT16 i; + lumpnum_t lumpnum; + char lumpname[9]; + + LOADTTGFX(ttuser, curttname, TTMAX_USER) + break; + } + } + +#undef LOADTTGFX } // (no longer) De-Demo'd Title Screen void F_TitleScreenDrawer(void) { boolean hidepics; + fixed_t sc = FRACUNIT / max(1, curttscale); if (modeattacking) return; // We likely came here from retrying. Don't do a damn thing. @@ -2287,7 +2391,7 @@ void F_TitleScreenDrawer(void) F_SkyScroll(curbgxspeed, curbgyspeed, curbgname); // Don't draw outside of the title screen, or if the patch isn't there. - if (!ttwing || (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS)) + if (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS) return; // rei|miru: use title pics? @@ -2299,42 +2403,109 @@ void F_TitleScreenDrawer(void) return; #endif - V_DrawScaledPatch(30, 14, 0, ttwing); - - if (finalecount < 57) + switch(curttmode) { - if (finalecount == 35) - V_DrawScaledPatch(115, 15, 0, ttspop1); - else if (finalecount == 36) - V_DrawScaledPatch(114, 15, 0,ttspop2); - else if (finalecount == 37) - V_DrawScaledPatch(113, 15, 0,ttspop3); - else if (finalecount == 38) - V_DrawScaledPatch(112, 15, 0,ttspop4); - else if (finalecount == 39) - V_DrawScaledPatch(111, 15, 0,ttspop5); - else if (finalecount == 40) - V_DrawScaledPatch(110, 15, 0, ttspop6); - else if (finalecount >= 41 && finalecount <= 44) - V_DrawScaledPatch(109, 15, 0, ttspop7); - else if (finalecount >= 45 && finalecount <= 48) - V_DrawScaledPatch(108, 12, 0, ttsprep1); - else if (finalecount >= 49 && finalecount <= 52) - V_DrawScaledPatch(107, 9, 0, ttsprep2); - else if (finalecount >= 53 && finalecount <= 56) - V_DrawScaledPatch(106, 6, 0, ttswip1); - V_DrawScaledPatch(93, 106, 0, ttsonic); - } - else - { - V_DrawScaledPatch(93, 106, 0,ttsonic); - if (finalecount/5 & 1) - V_DrawScaledPatch(100, 3, 0,ttswave1); - else - V_DrawScaledPatch(100,3, 0,ttswave2); - } + case TTMODE_OLD: + case TTMODE_NONE: + V_DrawSciencePatch(30<= 41 && finalecount <= 44) + V_DrawSciencePatch(109<= 45 && finalecount <= 48) + V_DrawSciencePatch(108<= 49 && finalecount <= 52) + V_DrawSciencePatch(107<= 53 && finalecount <= 56) + V_DrawSciencePatch(106< 7 && 17-finalecount > 0 && 17-finalecount < 10) + V_DrawFadeScreen(0, 17-finalecount); + + // Draw emblem + V_DrawSciencePatch(52< 9) + { + // Fade value for ROBO BLAST + INT32 fadeval = 0; + + // Draw SONIC text + V_DrawSciencePatch(94<= 0 || curbgname[0]) void F_InitMenuPresValues(void); diff --git a/src/m_menu.c b/src/m_menu.c index ca389a94d..3af93ddd2 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2228,6 +2228,14 @@ void M_InitMenuPresTables(void) // so-called "undefined" menupres[i].fadestrength = -1; menupres[i].hidetitlepics = -1; // inherits global hidetitlepics + menupres[i].ttmode = TTMODE_NONE; + menupres[i].ttscale = UINT8_MAX; + menupres[i].ttcounterset = INT32_MAX; + menupres[i].ttname[0] = 0; + menupres[i].ttx = INT16_MAX; + menupres[i].tty = INT16_MAX; + menupres[i].ttloop = INT16_MAX; + menupres[i].tttics = UINT16_MAX; menupres[i].enterwipe = -1; menupres[i].exitwipe = -1; menupres[i].bgcolor = -1; @@ -2404,7 +2412,7 @@ static boolean MIT_SetCurFadeValue(UINT32 menutype, INT32 level, INT32 *retval, return false; } -static boolean MIT_SetCurHideTitlePics(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) +static boolean MIT_SetCurTitlePics(UINT32 menutype, INT32 level, INT32 *retval, void **input, boolean fromoldest) { (void)input; (void)retval; @@ -2418,8 +2426,44 @@ static boolean MIT_SetCurHideTitlePics(UINT32 menutype, INT32 level, INT32 *retv curhidepics = menupres[menutype].hidetitlepics; return true; } + else if (menupres[menutype].ttmode == TTMODE_USER) + { + if (menupres[menutype].ttname[0]) + { + curhidepics = menupres[menutype].hidetitlepics; + curttmode = menupres[menutype].ttmode; + curttscale = (menupres[menutype].ttscale != UINT8_MAX ? menupres[menutype].ttscale : ttscale); + curttcounterset = (menupres[menutype].ttcounterset != INT32_MAX ? menupres[menutype].ttcounterset : ttcounterset); + strncpy(curttname, menupres[menutype].ttname, 9); + curttx = (menupres[menutype].ttx != INT16_MAX ? menupres[menutype].ttx : ttx); + curtty = (menupres[menutype].tty != INT16_MAX ? menupres[menutype].tty : tty); + curttloop = (menupres[menutype].ttloop != INT16_MAX ? menupres[menutype].ttloop : ttloop); + curtttics = (menupres[menutype].tttics != UINT16_MAX ? menupres[menutype].tttics : tttics); + } + else + curhidepics = menupres[menutype].hidetitlepics; + return true; + } + else if (menupres[menutype].ttmode != TTMODE_NONE) + { + curhidepics = menupres[menutype].hidetitlepics; + curttmode = menupres[menutype].ttmode; + curttscale = (menupres[menutype].ttscale != UINT8_MAX ? menupres[menutype].ttscale : ttscale); + curttcounterset = (menupres[menutype].ttcounterset != INT32_MAX ? menupres[menutype].ttcounterset : ttcounterset); + return true; + } else if (!level) + { curhidepics = hidetitlepics; + curttmode = ttmode; + curttscale = ttscale; + curttcounterset = ttcounterset; + strncpy(curttname, ttname, 9); + curttx = ttx; + curtty = tty; + curttloop = ttloop; + curtttics = tttics; + } return false; } @@ -2464,9 +2508,9 @@ void M_SetMenuCurFadeValue(UINT8 defaultvalue) M_IterateMenuTree(MIT_SetCurFadeValue, &defaultvalue); } -void M_SetMenuCurHideTitlePics(void) +void M_SetMenuCurTitlePics(void) { - M_IterateMenuTree(MIT_SetCurHideTitlePics, NULL); + M_IterateMenuTree(MIT_SetCurTitlePics, NULL); } // ==================================== @@ -2516,6 +2560,15 @@ static void M_HandleMenuPresState(menu_t *newMenu) curbgyspeed = titlescrollyspeed; curbghide = (gamestate != GS_TIMEATTACK); // show in time attack, hide in other menus + curttmode = ttmode; + curttscale = ttscale; + curttcounterset = ttcounterset; + strncpy(curttname, ttname, 9); + curttx = ttx; + curtty = tty; + curttloop = ttloop; + curtttics = tttics; + // don't do the below during the in-game menus if (gamestate != GS_TITLESCREEN && gamestate != GS_TIMEATTACK) return; @@ -2523,7 +2576,7 @@ static void M_HandleMenuPresState(menu_t *newMenu) // Find current presentation values M_SetMenuCurBackground((gamestate == GS_TIMEATTACK) ? "SRB2BACK" : "TITLESKY"); M_SetMenuCurFadeValue(16); - M_SetMenuCurHideTitlePics(); + M_SetMenuCurTitlePics(); // Loop through both menu IDs in parallel and look for type changes // The youngest child in activeMenuId is the entered menu diff --git a/src/m_menu.h b/src/m_menu.h index 347725e10..9461a0d3a 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -18,6 +18,7 @@ #include "d_event.h" #include "command.h" #include "r_things.h" // for SKINNAMESIZE +#include "f_finale.h" // for ttmode_enum // // MENUS @@ -124,19 +125,28 @@ typedef enum typedef struct { char bgname[8]; // name for background gfx lump; lays over titlemap if this is set - SINT8 hidetitlepics; // hide title gfx per menu; -1 means undefined, inherits global setting + SINT8 fadestrength; // darken background when displaying this menu, strength 0-31 or -1 for undefined + INT32 bgcolor; // fill color, overrides bg name. -1 means follow bg name rules. INT32 titlescrollxspeed; // background gfx scroll per menu; inherits global setting INT32 titlescrollyspeed; // y scroll - INT32 bgcolor; // fill color, overrides bg name. -1 means follow bg name rules. boolean bghide; // for titlemaps, hide the background. + SINT8 hidetitlepics; // hide title gfx per menu; -1 means undefined, inherits global setting + ttmode_enum ttmode; // title wing animation mode; default TTMODE_OLD + UINT8 ttscale; // scale of title wing gfx (FRACUNIT / ttscale); -1 means undefined, inherits global setting + INT32 ttcounterset; // Value to reset animation counter to on subsequent menu viewings. + char ttname[9]; // lump name of title wing gfx. If name length is <= 6, engine will attempt to load numbered frames (TTNAMExx) + INT16 ttx; // X position of title wing + INT16 tty; // Y position of title wing + INT16 ttloop; // # frame to loop; -1 means dont loop + UINT16 tttics; // # of tics per frame + char musname[7]; ///< Music track to play. "" for no music. UINT16 mustrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore. boolean muslooping; ///< Loop the music boolean musstop; ///< Don't play any music boolean musignore; ///< Let the current music keep playing - SINT8 fadestrength; // darken background when displaying this menu, strength 0-31 or -1 for undefined boolean enterbubble; // run all entrance line execs after common ancestor and up to child. If false, only run the child's exec boolean exitbubble; // run all exit line execs from child and up to before common ancestor. If false, only run the child's exec INT32 entertag; // line exec to run on menu enter, if titlemap @@ -154,7 +164,7 @@ UINT8 M_GetYoungestChildMenu(void); void M_ChangeMenuMusic(const char *defaultmusname, boolean defaultmuslooping); void M_SetMenuCurBackground(const char *defaultname); void M_SetMenuCurFadeValue(UINT8 defaultvalue); -void M_SetMenuCurHideTitlePics(void); +void M_SetMenuCurTitlePics(void); // Called by main loop, // saves config file and calls I_Quit when user exits. From 2439b2cb324d376614669143bf1329a1fefe8ad1 Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 27 Oct 2019 13:37:14 +0000 Subject: [PATCH 03/50] More consistent momentum handling for "groundpounding" shield abilities (elemental, bubble) in THZ goop. --- src/p_mobj.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 5735dc27b..e33e0aa49 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3314,7 +3314,7 @@ void P_MobjCheckWater(mobj_t *mobj) ffloor_t *rover; player_t *p = mobj->player; // Will just be null if not a player. fixed_t height = (p ? P_GetPlayerHeight(p) : mobj->height); // for players, calculation height does not necessarily match actual height for gameplay reasons (spin, etc) - boolean wasgroundpounding = (p && (mobj->eflags & MFE_GOOWATER) && ((p->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL || (p->powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP) && (p->pflags & PF_SHIELDABILITY)); + boolean wasgroundpounding = (p && ((p->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL || (p->powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP) && (p->pflags & PF_SHIELDABILITY)); // Default if no water exists. mobj->watertop = mobj->waterbottom = mobj->z - 1000*FRACUNIT; @@ -3414,7 +3414,7 @@ void P_MobjCheckWater(mobj_t *mobj) p->powers[pw_underwater] = underwatertics + 1; } - if (wasgroundpounding) + if ((wasgroundpounding = ((mobj->eflags & MFE_GOOWATER) && wasgroundpounding))) { p->pflags &= ~PF_SHIELDABILITY; mobj->momz >>= 1; From 23c6011348b56dd18946799cb4c4ed3d5204b184 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 27 Oct 2019 13:12:36 -0400 Subject: [PATCH 04/50] Fix char select music not playing in secrets menu --- src/m_menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/m_menu.c b/src/m_menu.c index 54c0b6c87..ea95b9c85 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2306,7 +2306,7 @@ void M_InitMenuPresTables(void) strncpy(menupres[i].musname, "_recat", 7); else if (i == MN_SP_NIGHTSATTACK) strncpy(menupres[i].musname, "_nitat", 7); - else if (i == MN_SP_PLAYER) + else if (i == MN_SP_PLAYER || i == MN_SR_PLAYER) strncpy(menupres[i].musname, "_chsel", 7); } } From df785e16519fa1d76c1925577df19d8dbbe845a5 Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 27 Oct 2019 17:20:43 +0000 Subject: [PATCH 05/50] * Add alternate numerical drawer for continues on Intermission screen if there's > 5. * Tweak offsets on Continue screen numerical continue drawer to match. --- src/f_finale.c | 4 ++-- src/y_inter.c | 20 ++++++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index eb1415042..9d0d7892e 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -2586,8 +2586,8 @@ void F_ContinueDrawer(void) { if (!(continuetime & 1) || continuetime > 17) V_DrawContinueIcon(x, 68, 0, players[consoleplayer].skin, players[consoleplayer].skincolor); - V_DrawScaledPatch(x+12, 68-2, 0, stlivex); - V_DrawRightAlignedString(x+36, 69-5, 0, + V_DrawScaledPatch(x+12, 66, 0, stlivex); + V_DrawRightAlignedString(x+38, 64, 0, va("%d",(imcontinuing ? ncontinues-1 : ncontinues))); } else diff --git a/src/y_inter.c b/src/y_inter.c index 2fed35de3..c9ab564ba 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -425,11 +425,23 @@ void Y_IntermissionDrawer(void) UINT8 continues = data.spec.continues & 0x7F; V_DrawScaledPatch(152 + xoffset5, 150+yoffset, 0, data.spec.pcontinues); - for (i = 0; i < continues; ++i) + if (continues > 5) { - if ((data.spec.continues & 0x80) && i == continues-1 && (endtic < 0 || intertic%20 < 10)) - break; - V_DrawContinueIcon(246 + xoffset5 - (i*20), 162+yoffset, 0, *data.spec.playerchar, *data.spec.playercolor); + INT32 leftx = (continues >= 10) ? 216 : 224; + V_DrawContinueIcon(leftx + xoffset5, 162+yoffset, 0, *data.spec.playerchar, *data.spec.playercolor); + V_DrawScaledPatch(leftx + xoffset5 + 12, 160+yoffset, 0, stlivex); + if (!((data.spec.continues & 0x80) && !(endtic < 0 || intertic%20 < 10))) + V_DrawRightAlignedString(252 + xoffset5, 158+yoffset, 0, + va("%d",(((data.spec.continues & 0x80) && (endtic < 0)) ? continues-1 : continues))); + } + else + { + for (i = 0; i < continues; ++i) + { + if ((data.spec.continues & 0x80) && i == continues-1 && (endtic < 0 || intertic%20 < 10)) + break; + V_DrawContinueIcon(246 + xoffset5 - (i*20), 162+yoffset, 0, *data.spec.playerchar, *data.spec.playercolor); + } } } } From 4ac136f6269ceb90c37c494dd971aca3f294546d Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 5 Oct 2019 13:15:36 -0700 Subject: [PATCH 06/50] Custom gamedata parameter --- src/g_game.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/g_game.c b/src/g_game.c index e2f43e4f2..519c934a3 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3361,6 +3361,11 @@ void G_LoadGameData(void) if (M_CheckParm("-resetdata")) return; // Don't load (essentially, reset). + if (M_CheckParm("-gamedata") && M_IsNextParm()) + { + strlcpy(gamedatafilename, M_GetNextParm(), sizeof gamedatafilename); + } + length = FIL_ReadFile(va(pandf, srb2home, gamedatafilename), &savebuffer); if (!length) // Aw, no game data. Their loss! return; From 2078b47952b83bfa69750ae388766c088ca5f73e Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 27 Oct 2019 10:33:40 -0700 Subject: [PATCH 07/50] Move gamedata param to cover -resetdata --- src/g_game.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 519c934a3..5a619f945 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3358,14 +3358,14 @@ void G_LoadGameData(void) // Allow saving of gamedata beyond this point gamedataloaded = true; - if (M_CheckParm("-resetdata")) - return; // Don't load (essentially, reset). - if (M_CheckParm("-gamedata") && M_IsNextParm()) { strlcpy(gamedatafilename, M_GetNextParm(), sizeof gamedatafilename); } + if (M_CheckParm("-resetdata")) + return; // Don't load (essentially, reset). + length = FIL_ReadFile(va(pandf, srb2home, gamedatafilename), &savebuffer); if (!length) // Aw, no game data. Their loss! return; From 33816e49cae24dc9c5950355f9945dcf842f8596 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 28 Oct 2019 00:04:30 -0700 Subject: [PATCH 08/50] Add overflow checks so we I_Error instead of death crash into oblivion You'd love to know how we even reached (size_t)-1. --- src/z_zone.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/z_zone.c b/src/z_zone.c index 001c69bb3..d5146f7a3 100644 --- a/src/z_zone.c +++ b/src/z_zone.c @@ -247,7 +247,11 @@ void Z_Free(void *ptr) static void *xm(size_t size) { const size_t padedsize = size+sizeof (size_t); - void *p = malloc(padedsize); + void *p; + + if (padedsize < size)/* overflow check */ + I_Error("You are allocating memory too large!"); + p = malloc(padedsize); if (p == NULL) { @@ -295,6 +299,9 @@ void *Z_MallocAlign(size_t size, INT32 tag, void *user, INT32 alignbits) CONS_Debug(DBG_MEMORY, "Z_Malloc %s:%d\n", file, line); #endif + if (blocksize < size)/* overflow check */ + I_Error("You are allocating memory too large!"); + block = xm(sizeof *block); #ifdef HAVE_VALGRIND padsize += (1< Date: Mon, 28 Oct 2019 16:10:22 +0100 Subject: [PATCH 09/50] Fix some intro fades displaying text in all-caps --- src/f_finale.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index eb1415042..096e4424b 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -836,7 +836,7 @@ void F_IntroDrawer(void) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); V_DrawScaledPatch(0, 0, 0, radar); W_UnlockCachedPatch(radar); - V_DrawString(8, 128, 0, cutscene_disptext); + V_DrawString(8, 128, V_ALLOWLOWERCASE, cutscene_disptext); F_WipeEndScreen(); F_RunWipe(99,true); @@ -849,7 +849,7 @@ void F_IntroDrawer(void) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); V_DrawScaledPatch(0, 0, 0, grass); W_UnlockCachedPatch(grass); - V_DrawString(8, 128, 0, cutscene_disptext); + V_DrawString(8, 128, V_ALLOWLOWERCASE, cutscene_disptext); F_WipeEndScreen(); F_RunWipe(99,true); @@ -862,7 +862,7 @@ void F_IntroDrawer(void) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); V_DrawSmallScaledPatch(0, 0, 0, confront); W_UnlockCachedPatch(confront); - V_DrawString(8, 128, 0, cutscene_disptext); + V_DrawString(8, 128, V_ALLOWLOWERCASE, cutscene_disptext); F_WipeEndScreen(); F_RunWipe(99,true); @@ -875,7 +875,7 @@ void F_IntroDrawer(void) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); V_DrawSmallScaledPatch(0, 0, 0, sdo); W_UnlockCachedPatch(sdo); - V_DrawString(224, 8, 0, cutscene_disptext); + V_DrawString(224, 8, V_ALLOWLOWERCASE, cutscene_disptext); F_WipeEndScreen(); F_RunWipe(99,true); From 0a49340ae11f4deab9e089079dc6e6ba22f2f64a Mon Sep 17 00:00:00 2001 From: Jaime Passos Date: Mon, 28 Oct 2019 23:46:33 -0300 Subject: [PATCH 10/50] Fix warnings when NOPNG=1 --- src/hardware/hw_cache.c | 4 +++- src/r_data.c | 6 +++++- src/w_wad.c | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/hardware/hw_cache.c b/src/hardware/hw_cache.c index 02df290b8..5cfd0f61c 100644 --- a/src/hardware/hw_cache.c +++ b/src/hardware/hw_cache.c @@ -690,7 +690,9 @@ static void HWR_GenerateTexture(INT32 texnum, GLTexture_t *grtex) // Composite the columns together. for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++) { +#ifndef NO_PNG_LUMPS size_t lumplength = W_LumpLengthPwad(patch->wad, patch->lump); +#endif realpatch = W_CacheLumpNumPwad(patch->wad, patch->lump, PU_CACHE); #ifndef NO_PNG_LUMPS if (R_IsLumpPNG((UINT8 *)realpatch, lumplength)) @@ -929,9 +931,9 @@ static void HWR_LoadPatchFlat(GLMipmap_t *grMipmap, lumpnum_t flatlumpnum) { UINT8 *flat; patch_t *patch = (patch_t *)W_CacheLumpNum(flatlumpnum, PU_STATIC); +#ifndef NO_PNG_LUMPS size_t lumplength = W_LumpLength(flatlumpnum); -#ifndef NO_PNG_LUMPS if (R_IsLumpPNG((UINT8 *)patch, lumplength)) patch = R_PNGToPatch((UINT8 *)patch, lumplength, NULL, false); #endif diff --git a/src/r_data.c b/src/r_data.c index 524baad15..74cbf6ad4 100644 --- a/src/r_data.c +++ b/src/r_data.c @@ -831,7 +831,9 @@ void R_LoadTextures(void) { UINT16 wadnum = (UINT16)w; lumpnum_t lumpnum = texstart + j; +#ifndef NO_PNG_LUMPS size_t lumplength; +#endif if (wadfiles[w]->type == RET_PK3) { @@ -839,8 +841,10 @@ void R_LoadTextures(void) continue; // If it is then SKIP IT } - lumplength = W_LumpLengthPwad(wadnum, lumpnum); patchlump = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE); +#ifndef NO_PNG_LUMPS + lumplength = W_LumpLengthPwad(wadnum, lumpnum); +#endif //CONS_Printf("\n\"%s\" is a single patch, dimensions %d x %d",W_CheckNameForNumPwad((UINT16)w,texstart+j),patchlump->width, patchlump->height); texture = textures[i] = Z_Calloc(sizeof(texture_t) + sizeof(texpatch_t), PU_STATIC, NULL); diff --git a/src/w_wad.c b/src/w_wad.c index 4d08b26dc..51c77fd87 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -1531,7 +1531,10 @@ void *W_CachePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag) if (!lumpcache[lump]) { size_t len = W_LumpLengthPwad(wad, lump); - void *ptr, *lumpdata, *srcdata = NULL; + void *ptr, *lumpdata; +#ifndef NO_PNG_LUMPS + void *srcdata = NULL; +#endif ptr = Z_Malloc(len, tag, &lumpcache[lump]); lumpdata = Z_Malloc(len, tag, NULL); From 5464b6ab280dafc35f8b50bb4a0b66e280ddc4ff Mon Sep 17 00:00:00 2001 From: Jaime Passos Date: Tue, 29 Oct 2019 00:15:33 -0300 Subject: [PATCH 11/50] Use doomtype.h types instead of libpng types --- src/r_data.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/r_data.c b/src/r_data.c index 74cbf6ad4..d37f7822d 100644 --- a/src/r_data.c +++ b/src/r_data.c @@ -2802,22 +2802,23 @@ boolean R_IsLumpPNG(const UINT8 *d, size_t s) #ifdef HAVE_PNG -#if PNG_LIBPNG_VER_DLLNUM < 14 +/*#if PNG_LIBPNG_VER_DLLNUM < 14 typedef PNG_CONST png_byte *png_const_bytep; -#endif -typedef struct { - png_const_bytep buffer; - png_uint_32 bufsize; - png_uint_32 current_pos; +#endif*/ +typedef struct +{ + const UINT8 *buffer; + UINT32 size; + UINT32 position; } png_io_t; static void PNG_IOReader(png_structp png_ptr, png_bytep data, png_size_t length) { png_io_t *f = png_get_io_ptr(png_ptr); - if (length > (f->bufsize - f->current_pos)) + if (length > (f->size - f->position)) png_error(png_ptr, "PNG_IOReader: buffer overrun"); - memcpy(data, f->buffer + f->current_pos, length); - f->current_pos += length; + memcpy(data, f->buffer + f->position, length); + f->position += length; } typedef struct @@ -2903,10 +2904,10 @@ static png_bytep *PNG_Read(const UINT8 *png, UINT16 *w, UINT16 *h, INT16 *topoff png_memcpy(png_jmpbuf(png_ptr), jmpbuf, sizeof jmp_buf); #endif - // set our own read_function - png_io.buffer = (png_const_bytep)png; - png_io.bufsize = size; - png_io.current_pos = 0; + // set our own read function + png_io.buffer = png; + png_io.size = size; + png_io.position = 0; png_set_read_fn(png_ptr, &png_io, PNG_IOReader); memset(&chunk, 0x00, sizeof(png_chunk_t)); @@ -3073,10 +3074,10 @@ boolean R_PNGDimensions(UINT8 *png, INT16 *width, INT16 *height, size_t size) png_memcpy(png_jmpbuf(png_ptr), jmpbuf, sizeof jmp_buf); #endif - // set our own read_function - png_io.buffer = (png_bytep)png; - png_io.bufsize = size; - png_io.current_pos = 0; + // set our own read function + png_io.buffer = png; + png_io.size = size; + png_io.position = 0; png_set_read_fn(png_ptr, &png_io, PNG_IOReader); #ifdef PNG_SET_USER_LIMITS_SUPPORTED From 1ebcdb5344159cffab96939e5c3712e3e78dca01 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 2 Nov 2019 12:12:36 -0400 Subject: [PATCH 12/50] Multi-res title screen gfx --- src/f_finale.c | 72 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 17 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index ad888eb44..9c0ea13f0 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -121,11 +121,26 @@ static patch_t *ttspop6; static patch_t *ttspop7; // ttmode alacroix -static patch_t *ttribb[TTMAX_ALACROIX]; -static patch_t *ttsntx[TTMAX_ALACROIX]; -static patch_t *ttrobo[TTMAX_ALACROIX]; -static patch_t *tttwot[TTMAX_ALACROIX]; -static patch_t *ttembl[TTMAX_ALACROIX]; +static patch_t *t1ribb[TTMAX_ALACROIX]; +static patch_t *t1sntx[TTMAX_ALACROIX]; +static patch_t *t1robo[TTMAX_ALACROIX]; +static patch_t *t1twot[TTMAX_ALACROIX]; +static patch_t *t1embl[TTMAX_ALACROIX]; +static patch_t *t2ribb[TTMAX_ALACROIX]; +static patch_t *t2sntx[TTMAX_ALACROIX]; +static patch_t *t2robo[TTMAX_ALACROIX]; +static patch_t *t2twot[TTMAX_ALACROIX]; +static patch_t *t2embl[TTMAX_ALACROIX]; +static patch_t *t4ribb[TTMAX_ALACROIX]; +static patch_t *t4sntx[TTMAX_ALACROIX]; +static patch_t *t4robo[TTMAX_ALACROIX]; +static patch_t *t4twot[TTMAX_ALACROIX]; +static patch_t *t4embl[TTMAX_ALACROIX]; +static patch_t *t6ribb[TTMAX_ALACROIX]; +static patch_t *t6sntx[TTMAX_ALACROIX]; +static patch_t *t6robo[TTMAX_ALACROIX]; +static patch_t *t6twot[TTMAX_ALACROIX]; +static patch_t *t6embl[TTMAX_ALACROIX]; // ttmode user static patch_t *ttuser[TTMAX_USER]; @@ -2355,11 +2370,26 @@ else \ lumpnum_t lumpnum; char lumpname[9]; - LOADTTGFX(ttembl, "TTEMBL", TTMAX_ALACROIX) - LOADTTGFX(ttribb, "TTRIBB", TTMAX_ALACROIX) - LOADTTGFX(ttsntx, "TTSNTX", TTMAX_ALACROIX) - LOADTTGFX(ttrobo, "TTROBO", TTMAX_ALACROIX) - LOADTTGFX(tttwot, "TTTWOT", TTMAX_ALACROIX) + LOADTTGFX(t1embl, "T1EMBL", TTMAX_ALACROIX) + LOADTTGFX(t1ribb, "T1RIBB", TTMAX_ALACROIX) + LOADTTGFX(t1sntx, "T1SNTX", TTMAX_ALACROIX) + LOADTTGFX(t1robo, "T1ROBO", TTMAX_ALACROIX) + LOADTTGFX(t1twot, "T1TWOT", TTMAX_ALACROIX) + LOADTTGFX(t2embl, "T2EMBL", TTMAX_ALACROIX) + LOADTTGFX(t2ribb, "T2RIBB", TTMAX_ALACROIX) + LOADTTGFX(t2sntx, "T2SNTX", TTMAX_ALACROIX) + LOADTTGFX(t2robo, "T2ROBO", TTMAX_ALACROIX) + LOADTTGFX(t2twot, "T2TWOT", TTMAX_ALACROIX) + LOADTTGFX(t4embl, "T4EMBL", TTMAX_ALACROIX) + LOADTTGFX(t4ribb, "T4RIBB", TTMAX_ALACROIX) + LOADTTGFX(t4sntx, "T4SNTX", TTMAX_ALACROIX) + LOADTTGFX(t4robo, "T4ROBO", TTMAX_ALACROIX) + LOADTTGFX(t4twot, "T4TWOT", TTMAX_ALACROIX) + LOADTTGFX(t6embl, "T6EMBL", TTMAX_ALACROIX) + LOADTTGFX(t6ribb, "T6RIBB", TTMAX_ALACROIX) + LOADTTGFX(t6sntx, "T6SNTX", TTMAX_ALACROIX) + LOADTTGFX(t6robo, "T6ROBO", TTMAX_ALACROIX) + LOADTTGFX(t6twot, "T6TWOT", TTMAX_ALACROIX) break; } @@ -2381,7 +2411,9 @@ else \ void F_TitleScreenDrawer(void) { boolean hidepics; - fixed_t sc = FRACUNIT / max(1, curttscale); + fixed_t presc = max(1, min(6, (vid.dupx == 6 ? 2 : vid.dupx == 5 ? 6 : (vid.dupx == 3 ? 4 : vid.dupx)))); + fixed_t sc = (curttmode == TTMODE_ALACROIX ? FRACUNIT / presc + : FRACUNIT / max(1, curttscale)); if (modeattacking) return; // We likely came here from retrying. Don't do a damn thing. @@ -2452,6 +2484,12 @@ void F_TitleScreenDrawer(void) ALICE ANIMATION CODE GOES HERE */ +#define TTEMBL (presc == 6 ? t6embl : presc == 4 ? t4embl : presc == 2 ? t2embl : t1embl) +#define TTRIBB (presc == 6 ? t6ribb : presc == 4 ? t4ribb : presc == 2 ? t2ribb : t1ribb) +#define TTSNTX (presc == 6 ? t6sntx : presc == 4 ? t4sntx : presc == 2 ? t2sntx : t1sntx) +#define TTROBO (presc == 6 ? t6robo : presc == 4 ? t4robo : presc == 2 ? t2robo : t1robo) +#define TTTWOT (presc == 6 ? t6twot : presc == 4 ? t4twot : presc == 2 ? t2twot : t1twot) + // Start at black background, then at 8 tics, white flash to title background. // Why 8 tics: The fanfare starts at 1.5 secs from O__TITLE. // 1.5 secs * 35 tics/sec = 52.5 tics @@ -2464,10 +2502,10 @@ void F_TitleScreenDrawer(void) V_DrawFadeScreen(0, 17-finalecount); // Draw emblem - V_DrawSciencePatch(52< 9) @@ -2476,7 +2514,7 @@ void F_TitleScreenDrawer(void) INT32 fadeval = 0; // Draw SONIC text - V_DrawSciencePatch(94< Date: Sat, 2 Nov 2019 12:40:12 -0400 Subject: [PATCH 13/50] Remove TTCOUNTERSET to simplify custom title SOC --- src/dehacked.c | 10 ---------- src/f_finale.c | 3 --- src/f_finale.h | 2 -- src/m_menu.c | 5 ----- src/m_menu.h | 1 - 5 files changed, 21 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index df2295216..37df6176c 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -2116,11 +2116,6 @@ static void readmenu(MYFILE *f, INT32 num) menupres[num].ttscale = max(1, min(8, (UINT8)get_number(word2))); titlechanged = true; } - else if (fastcmp(word, "TITLEPICSCOUNTERSET")) - { - menupres[num].ttcounterset = (INT32)get_number(word2); - titlechanged = true; - } else if (fastcmp(word, "TITLEPICSNAME")) { strncpy(menupres[num].ttname, word2, 9); @@ -3569,11 +3564,6 @@ static void readmaincfg(MYFILE *f) ttscale = max(1, min(8, (UINT8)get_number(word2))); titlechanged = true; } - else if (fastcmp(word, "TITLEPICSCOUNTERSET")) - { - ttcounterset = (INT32)get_number(word2); - titlechanged = true; - } else if (fastcmp(word, "TITLEPICSNAME")) { strncpy(ttname, word2, 9); diff --git a/src/f_finale.c b/src/f_finale.c index 9c0ea13f0..a6da78325 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -84,7 +84,6 @@ static UINT32 demoIdleLeft; ttmode_enum ttmode = TTMODE_OLD; UINT8 ttscale = 1; // FRACUNIT / ttscale -INT32 ttcounterset = -1; // ttmode user vars char ttname[9]; INT16 ttx = 0; @@ -95,7 +94,6 @@ UINT16 tttics = 1; boolean curhidepics; ttmode_enum curttmode; UINT8 curttscale; -INT32 curttcounterset; // ttmode user vars char curttname[9]; INT16 curttx; @@ -2153,7 +2151,6 @@ void F_InitMenuPresValues(void) curhidepics = hidetitlepics; curttmode = ttmode; curttscale = ttscale; - curttcounterset = ttcounterset; strncpy(curttname, ttname, 9); curttx = ttx; curtty = tty; diff --git a/src/f_finale.h b/src/f_finale.h index b27d49baa..ca1de9225 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -90,7 +90,6 @@ typedef enum extern ttmode_enum ttmode; extern UINT8 ttscale; -extern INT32 ttcounterset; // ttmode user vars extern char ttname[9]; extern INT16 ttx; @@ -119,7 +118,6 @@ extern boolean hidetitlemap; extern boolean curhidepics; extern ttmode_enum curttmode; extern UINT8 curttscale; -extern INT32 curttcounterset; // ttmode user vars extern char curttname[9]; extern INT16 curttx; diff --git a/src/m_menu.c b/src/m_menu.c index 17461c5ff..ede83fd92 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2291,7 +2291,6 @@ void M_InitMenuPresTables(void) menupres[i].hidetitlepics = -1; // inherits global hidetitlepics menupres[i].ttmode = TTMODE_NONE; menupres[i].ttscale = UINT8_MAX; - menupres[i].ttcounterset = INT32_MAX; menupres[i].ttname[0] = 0; menupres[i].ttx = INT16_MAX; menupres[i].tty = INT16_MAX; @@ -2496,7 +2495,6 @@ static boolean MIT_SetCurTitlePics(UINT32 menutype, INT32 level, INT32 *retval, curhidepics = menupres[menutype].hidetitlepics; curttmode = menupres[menutype].ttmode; curttscale = (menupres[menutype].ttscale != UINT8_MAX ? menupres[menutype].ttscale : ttscale); - curttcounterset = (menupres[menutype].ttcounterset != INT32_MAX ? menupres[menutype].ttcounterset : ttcounterset); strncpy(curttname, menupres[menutype].ttname, 9); curttx = (menupres[menutype].ttx != INT16_MAX ? menupres[menutype].ttx : ttx); curtty = (menupres[menutype].tty != INT16_MAX ? menupres[menutype].tty : tty); @@ -2512,7 +2510,6 @@ static boolean MIT_SetCurTitlePics(UINT32 menutype, INT32 level, INT32 *retval, curhidepics = menupres[menutype].hidetitlepics; curttmode = menupres[menutype].ttmode; curttscale = (menupres[menutype].ttscale != UINT8_MAX ? menupres[menutype].ttscale : ttscale); - curttcounterset = (menupres[menutype].ttcounterset != INT32_MAX ? menupres[menutype].ttcounterset : ttcounterset); return true; } else if (!level) @@ -2520,7 +2517,6 @@ static boolean MIT_SetCurTitlePics(UINT32 menutype, INT32 level, INT32 *retval, curhidepics = hidetitlepics; curttmode = ttmode; curttscale = ttscale; - curttcounterset = ttcounterset; strncpy(curttname, ttname, 9); curttx = ttx; curtty = tty; @@ -2625,7 +2621,6 @@ static void M_HandleMenuPresState(menu_t *newMenu) curttmode = ttmode; curttscale = ttscale; - curttcounterset = ttcounterset; strncpy(curttname, ttname, 9); curttx = ttx; curtty = tty; diff --git a/src/m_menu.h b/src/m_menu.h index 8ee944f6d..6f27d6432 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -138,7 +138,6 @@ typedef struct SINT8 hidetitlepics; // hide title gfx per menu; -1 means undefined, inherits global setting ttmode_enum ttmode; // title wing animation mode; default TTMODE_OLD UINT8 ttscale; // scale of title wing gfx (FRACUNIT / ttscale); -1 means undefined, inherits global setting - INT32 ttcounterset; // Value to reset animation counter to on subsequent menu viewings. char ttname[9]; // lump name of title wing gfx. If name length is <= 6, engine will attempt to load numbered frames (TTNAMExx) INT16 ttx; // X position of title wing INT16 tty; // Y position of title wing From 067ef42e379ced317a0fccc3d3eb576681834d47 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 2 Nov 2019 13:30:03 -0400 Subject: [PATCH 14/50] SNTX -> SONT --- src/f_finale.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index a6da78325..5d5887416 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -120,22 +120,22 @@ static patch_t *ttspop7; // ttmode alacroix static patch_t *t1ribb[TTMAX_ALACROIX]; -static patch_t *t1sntx[TTMAX_ALACROIX]; +static patch_t *t1sont[TTMAX_ALACROIX]; static patch_t *t1robo[TTMAX_ALACROIX]; static patch_t *t1twot[TTMAX_ALACROIX]; static patch_t *t1embl[TTMAX_ALACROIX]; static patch_t *t2ribb[TTMAX_ALACROIX]; -static patch_t *t2sntx[TTMAX_ALACROIX]; +static patch_t *t2sont[TTMAX_ALACROIX]; static patch_t *t2robo[TTMAX_ALACROIX]; static patch_t *t2twot[TTMAX_ALACROIX]; static patch_t *t2embl[TTMAX_ALACROIX]; static patch_t *t4ribb[TTMAX_ALACROIX]; -static patch_t *t4sntx[TTMAX_ALACROIX]; +static patch_t *t4sont[TTMAX_ALACROIX]; static patch_t *t4robo[TTMAX_ALACROIX]; static patch_t *t4twot[TTMAX_ALACROIX]; static patch_t *t4embl[TTMAX_ALACROIX]; static patch_t *t6ribb[TTMAX_ALACROIX]; -static patch_t *t6sntx[TTMAX_ALACROIX]; +static patch_t *t6sont[TTMAX_ALACROIX]; static patch_t *t6robo[TTMAX_ALACROIX]; static patch_t *t6twot[TTMAX_ALACROIX]; static patch_t *t6embl[TTMAX_ALACROIX]; @@ -2369,22 +2369,22 @@ else \ LOADTTGFX(t1embl, "T1EMBL", TTMAX_ALACROIX) LOADTTGFX(t1ribb, "T1RIBB", TTMAX_ALACROIX) - LOADTTGFX(t1sntx, "T1SNTX", TTMAX_ALACROIX) + LOADTTGFX(t1sont, "T1SONT", TTMAX_ALACROIX) LOADTTGFX(t1robo, "T1ROBO", TTMAX_ALACROIX) LOADTTGFX(t1twot, "T1TWOT", TTMAX_ALACROIX) LOADTTGFX(t2embl, "T2EMBL", TTMAX_ALACROIX) LOADTTGFX(t2ribb, "T2RIBB", TTMAX_ALACROIX) - LOADTTGFX(t2sntx, "T2SNTX", TTMAX_ALACROIX) + LOADTTGFX(t2sont, "T2SONT", TTMAX_ALACROIX) LOADTTGFX(t2robo, "T2ROBO", TTMAX_ALACROIX) LOADTTGFX(t2twot, "T2TWOT", TTMAX_ALACROIX) LOADTTGFX(t4embl, "T4EMBL", TTMAX_ALACROIX) LOADTTGFX(t4ribb, "T4RIBB", TTMAX_ALACROIX) - LOADTTGFX(t4sntx, "T4SNTX", TTMAX_ALACROIX) + LOADTTGFX(t4sont, "T4SONT", TTMAX_ALACROIX) LOADTTGFX(t4robo, "T4ROBO", TTMAX_ALACROIX) LOADTTGFX(t4twot, "T4TWOT", TTMAX_ALACROIX) LOADTTGFX(t6embl, "T6EMBL", TTMAX_ALACROIX) LOADTTGFX(t6ribb, "T6RIBB", TTMAX_ALACROIX) - LOADTTGFX(t6sntx, "T6SNTX", TTMAX_ALACROIX) + LOADTTGFX(t6sont, "T6SONT", TTMAX_ALACROIX) LOADTTGFX(t6robo, "T6ROBO", TTMAX_ALACROIX) LOADTTGFX(t6twot, "T6TWOT", TTMAX_ALACROIX) break; @@ -2483,7 +2483,7 @@ void F_TitleScreenDrawer(void) #define TTEMBL (presc == 6 ? t6embl : presc == 4 ? t4embl : presc == 2 ? t2embl : t1embl) #define TTRIBB (presc == 6 ? t6ribb : presc == 4 ? t4ribb : presc == 2 ? t2ribb : t1ribb) -#define TTSNTX (presc == 6 ? t6sntx : presc == 4 ? t4sntx : presc == 2 ? t2sntx : t1sntx) +#define TTSONT (presc == 6 ? t6sont : presc == 4 ? t4sont : presc == 2 ? t2sont : t1sont) #define TTROBO (presc == 6 ? t6robo : presc == 4 ? t4robo : presc == 2 ? t2robo : t1robo) #define TTTWOT (presc == 6 ? t6twot : presc == 4 ? t4twot : presc == 2 ? t2twot : t1twot) @@ -2511,7 +2511,7 @@ void F_TitleScreenDrawer(void) INT32 fadeval = 0; // Draw SONIC text - V_DrawSciencePatch(90< Date: Sat, 2 Nov 2019 14:57:15 -0400 Subject: [PATCH 15/50] Alacroix title animation adjustments --- src/f_finale.c | 117 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 76 insertions(+), 41 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index 5d5887416..24a738d01 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -124,21 +124,35 @@ static patch_t *t1sont[TTMAX_ALACROIX]; static patch_t *t1robo[TTMAX_ALACROIX]; static patch_t *t1twot[TTMAX_ALACROIX]; static patch_t *t1embl[TTMAX_ALACROIX]; +static patch_t *t1rbtx[TTMAX_ALACROIX]; + static patch_t *t2ribb[TTMAX_ALACROIX]; static patch_t *t2sont[TTMAX_ALACROIX]; static patch_t *t2robo[TTMAX_ALACROIX]; static patch_t *t2twot[TTMAX_ALACROIX]; static patch_t *t2embl[TTMAX_ALACROIX]; +static patch_t *t2rbtx[TTMAX_ALACROIX]; + static patch_t *t4ribb[TTMAX_ALACROIX]; static patch_t *t4sont[TTMAX_ALACROIX]; static patch_t *t4robo[TTMAX_ALACROIX]; static patch_t *t4twot[TTMAX_ALACROIX]; static patch_t *t4embl[TTMAX_ALACROIX]; +static patch_t *t4rbtx[TTMAX_ALACROIX]; + static patch_t *t6ribb[TTMAX_ALACROIX]; static patch_t *t6sont[TTMAX_ALACROIX]; static patch_t *t6robo[TTMAX_ALACROIX]; static patch_t *t6twot[TTMAX_ALACROIX]; static patch_t *t6embl[TTMAX_ALACROIX]; +static patch_t *t6rbtx[TTMAX_ALACROIX]; + +#define TTEMBL (presc == 6 ? t6embl : presc == 4 ? t4embl : presc == 2 ? t2embl : t1embl) +#define TTRIBB (presc == 6 ? t6ribb : presc == 4 ? t4ribb : presc == 2 ? t2ribb : t1ribb) +#define TTSONT (presc == 6 ? t6sont : presc == 4 ? t4sont : presc == 2 ? t2sont : t1sont) +#define TTROBO (presc == 6 ? t6robo : presc == 4 ? t4robo : presc == 2 ? t2robo : t1robo) +#define TTTWOT (presc == 6 ? t6twot : presc == 4 ? t4twot : presc == 2 ? t2twot : t1twot) +#define TTRBTX (presc == 6 ? t6rbtx : presc == 4 ? t4rbtx : presc == 2 ? t2rbtx : t1rbtx) // ttmode user static patch_t *ttuser[TTMAX_USER]; @@ -2372,21 +2386,28 @@ else \ LOADTTGFX(t1sont, "T1SONT", TTMAX_ALACROIX) LOADTTGFX(t1robo, "T1ROBO", TTMAX_ALACROIX) LOADTTGFX(t1twot, "T1TWOT", TTMAX_ALACROIX) + LOADTTGFX(t1rbtx, "T1RBTX", TTMAX_ALACROIX) + LOADTTGFX(t2embl, "T2EMBL", TTMAX_ALACROIX) LOADTTGFX(t2ribb, "T2RIBB", TTMAX_ALACROIX) LOADTTGFX(t2sont, "T2SONT", TTMAX_ALACROIX) LOADTTGFX(t2robo, "T2ROBO", TTMAX_ALACROIX) LOADTTGFX(t2twot, "T2TWOT", TTMAX_ALACROIX) + LOADTTGFX(t2rbtx, "T2RBTX", TTMAX_ALACROIX) + LOADTTGFX(t4embl, "T4EMBL", TTMAX_ALACROIX) LOADTTGFX(t4ribb, "T4RIBB", TTMAX_ALACROIX) LOADTTGFX(t4sont, "T4SONT", TTMAX_ALACROIX) LOADTTGFX(t4robo, "T4ROBO", TTMAX_ALACROIX) LOADTTGFX(t4twot, "T4TWOT", TTMAX_ALACROIX) + LOADTTGFX(t4rbtx, "T4RBTX", TTMAX_ALACROIX) + LOADTTGFX(t6embl, "T6EMBL", TTMAX_ALACROIX) LOADTTGFX(t6ribb, "T6RIBB", TTMAX_ALACROIX) LOADTTGFX(t6sont, "T6SONT", TTMAX_ALACROIX) LOADTTGFX(t6robo, "T6ROBO", TTMAX_ALACROIX) LOADTTGFX(t6twot, "T6TWOT", TTMAX_ALACROIX) + LOADTTGFX(t6rbtx, "T6RBTX", TTMAX_ALACROIX) break; } @@ -2408,7 +2429,7 @@ else \ void F_TitleScreenDrawer(void) { boolean hidepics; - fixed_t presc = max(1, min(6, (vid.dupx == 6 ? 2 : vid.dupx == 5 ? 6 : (vid.dupx == 3 ? 4 : vid.dupx)))); + fixed_t presc = max(1, min(6, (vid.dupx == 5 ? 6 : (vid.dupx == 3 ? 4 : vid.dupx)))); fixed_t sc = (curttmode == TTMODE_ALACROIX ? FRACUNIT / presc : FRACUNIT / max(1, curttscale)); @@ -2481,59 +2502,73 @@ void F_TitleScreenDrawer(void) ALICE ANIMATION CODE GOES HERE */ -#define TTEMBL (presc == 6 ? t6embl : presc == 4 ? t4embl : presc == 2 ? t2embl : t1embl) -#define TTRIBB (presc == 6 ? t6ribb : presc == 4 ? t4ribb : presc == 2 ? t2ribb : t1ribb) -#define TTSONT (presc == 6 ? t6sont : presc == 4 ? t4sont : presc == 2 ? t2sont : t1sont) -#define TTROBO (presc == 6 ? t6robo : presc == 4 ? t4robo : presc == 2 ? t2robo : t1robo) -#define TTTWOT (presc == 6 ? t6twot : presc == 4 ? t4twot : presc == 2 ? t2twot : t1twot) - - // Start at black background, then at 8 tics, white flash to title background. - // Why 8 tics: The fanfare starts at 1.5 secs from O__TITLE. - // 1.5 secs * 35 tics/sec = 52.5 tics - // The music starts at the FIRST of two screen wipes. The standard screen wipe is 22 tics in duration. - // 52.5 tics - (22 tics * 2 wipes) = 8.5 tics - // Ergo, start the flash at tic 8, upon the fanfare. - if (max(0, finalecount) <= 7) + // Start at black background. Draw it until tic 30, where we replace with a white flash. + // + // TODO: How to NOT draw the titlemap while this background is drawn? + // + if (finalecount <= 29) V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - else if (max(0, finalecount) > 7 && 17-finalecount > 0 && 17-finalecount < 10) - V_DrawFadeScreen(0, 17-finalecount); // Draw emblem V_DrawSciencePatch(40< 9) + // Animate SONIC ROBO BLAST 2 before the white flash at tic 30. + if (finalecount <= 29) { - // Fade value for ROBO BLAST - INT32 fadeval = 0; + // Ribbon unfurls, revealing SONIC text, from tic 0 to tic 24. SONIC text is pre-baked into this ribbon graphic. + V_DrawSciencePatch(40<= 0) + V_DrawSciencePatch(90< 9) { - UINT8 fadecounter = 20-finalecount; - switch(fadecounter) + INT32 fadeval = 0; + + // Fade between tic 10 and tic 29. + if (finalecount < 30) { - case 10: fadeval = V_90TRANS; break; - case 9: fadeval = V_80TRANS; break; - case 8: fadeval = V_70TRANS; break; - case 7: fadeval = V_60TRANS; break; - case 6: fadeval = V_TRANSLUCENT; break; - case 5: fadeval = V_40TRANS; break; - case 4: fadeval = V_30TRANS; break; - case 3: fadeval = V_20TRANS; break; - case 2: fadeval = V_10TRANS; break; + UINT8 fadecounter = 30-finalecount; + switch(fadecounter) + { + case 20: case 19: fadeval = V_90TRANS; break; + case 18: case 17: fadeval = V_80TRANS; break; + case 16: case 15: fadeval = V_70TRANS; break; + case 14: case 13: fadeval = V_60TRANS; break; + case 12: case 11: fadeval = V_TRANSLUCENT; break; + case 10: case 9: fadeval = V_40TRANS; break; + case 8: case 7: fadeval = V_30TRANS; break; + case 6: case 5: fadeval = V_20TRANS; break; + case 4: case 3: fadeval = V_10TRANS; break; + } } + V_DrawSciencePatch(80< 15) + V_DrawSciencePatch(107< 34) + V_DrawSciencePatch(40< 29 && finalecount < 35) + V_DrawFadeScreen(0, 9); + else if (finalecount > 34 && 44-finalecount > 0 && 44-finalecount < 10) + V_DrawFadeScreen(0, 44-finalecount); + break; case TTMODE_USER: From 96a80c51d39ba0708c72eeb9e0cdf21dbe92be79 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 2 Nov 2019 21:32:45 -0400 Subject: [PATCH 16/50] TTMODE_USER logic --- src/f_finale.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index 24a738d01..62037481f 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -88,7 +88,7 @@ UINT8 ttscale = 1; // FRACUNIT / ttscale char ttname[9]; INT16 ttx = 0; INT16 tty = 0; -INT16 ttloop = 0; +INT16 ttloop = -1; UINT16 tttics = 1; boolean curhidepics; @@ -156,6 +156,7 @@ static patch_t *t6rbtx[TTMAX_ALACROIX]; // ttmode user static patch_t *ttuser[TTMAX_USER]; +static INT32 ttuser_count = 0; static boolean goodending; static patch_t *endbrdr[2]; // border - blue, white, pink - where have i seen those colours before? @@ -2250,6 +2251,7 @@ void F_StartTitleScreen(void) if (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS) { + ttuser_count = 0; if (curttmode == TTMODE_ALACROIX) finalecount = -3; // hack so that frames don't advance during the entry wipe else @@ -2572,10 +2574,20 @@ void F_TitleScreenDrawer(void) break; case TTMODE_USER: - /* - * USER DEFINED ANIMATION CODE GOES HERE - */ - //V_DrawSciencePatch(curttx< -1 && ttuser[curttloop]) + ttuser_count = curttloop; + else if (ttuser[max(0, ttuser_count-1)]) + ttuser_count = max(0, ttuser_count-1); + else + break; // draw nothing + } + + V_DrawSciencePatch(curttx< Date: Sun, 3 Nov 2019 06:26:39 -0500 Subject: [PATCH 17/50] Load Alacroix character frames --- src/f_finale.c | 177 ++++++++++++++++++++++++++++++++++++++++++++++++- src/f_finale.h | 2 +- 2 files changed, 176 insertions(+), 3 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index 62037481f..51572f573 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -125,6 +125,22 @@ static patch_t *t1robo[TTMAX_ALACROIX]; static patch_t *t1twot[TTMAX_ALACROIX]; static patch_t *t1embl[TTMAX_ALACROIX]; static patch_t *t1rbtx[TTMAX_ALACROIX]; +static patch_t *t1soib[TTMAX_ALACROIX]; +static patch_t *t1soif[TTMAX_ALACROIX]; +static patch_t *t1soba[TTMAX_ALACROIX]; +static patch_t *t1sobk[TTMAX_ALACROIX]; +static patch_t *t1sodh[TTMAX_ALACROIX]; +static patch_t *t1taib[TTMAX_ALACROIX]; +static patch_t *t1taif[TTMAX_ALACROIX]; +static patch_t *t1taba[TTMAX_ALACROIX]; +static patch_t *t1tabk[TTMAX_ALACROIX]; +static patch_t *t1tabt[TTMAX_ALACROIX]; +static patch_t *t1taft[TTMAX_ALACROIX]; +static patch_t *t1knib[TTMAX_ALACROIX]; +static patch_t *t1knif[TTMAX_ALACROIX]; +static patch_t *t1knba[TTMAX_ALACROIX]; +static patch_t *t1knbk[TTMAX_ALACROIX]; +static patch_t *t1kndh[TTMAX_ALACROIX]; static patch_t *t2ribb[TTMAX_ALACROIX]; static patch_t *t2sont[TTMAX_ALACROIX]; @@ -132,6 +148,22 @@ static patch_t *t2robo[TTMAX_ALACROIX]; static patch_t *t2twot[TTMAX_ALACROIX]; static patch_t *t2embl[TTMAX_ALACROIX]; static patch_t *t2rbtx[TTMAX_ALACROIX]; +static patch_t *t2soib[TTMAX_ALACROIX]; +static patch_t *t2soif[TTMAX_ALACROIX]; +static patch_t *t2soba[TTMAX_ALACROIX]; +static patch_t *t2sobk[TTMAX_ALACROIX]; +static patch_t *t2sodh[TTMAX_ALACROIX]; +static patch_t *t2taib[TTMAX_ALACROIX]; +static patch_t *t2taif[TTMAX_ALACROIX]; +static patch_t *t2taba[TTMAX_ALACROIX]; +static patch_t *t2tabk[TTMAX_ALACROIX]; +static patch_t *t2tabt[TTMAX_ALACROIX]; +static patch_t *t2taft[TTMAX_ALACROIX]; +static patch_t *t2knib[TTMAX_ALACROIX]; +static patch_t *t2knif[TTMAX_ALACROIX]; +static patch_t *t2knba[TTMAX_ALACROIX]; +static patch_t *t2knbk[TTMAX_ALACROIX]; +static patch_t *t2kndh[TTMAX_ALACROIX]; static patch_t *t4ribb[TTMAX_ALACROIX]; static patch_t *t4sont[TTMAX_ALACROIX]; @@ -139,6 +171,22 @@ static patch_t *t4robo[TTMAX_ALACROIX]; static patch_t *t4twot[TTMAX_ALACROIX]; static patch_t *t4embl[TTMAX_ALACROIX]; static patch_t *t4rbtx[TTMAX_ALACROIX]; +static patch_t *t4soib[TTMAX_ALACROIX]; +static patch_t *t4soif[TTMAX_ALACROIX]; +static patch_t *t4soba[TTMAX_ALACROIX]; +static patch_t *t4sobk[TTMAX_ALACROIX]; +static patch_t *t4sodh[TTMAX_ALACROIX]; +static patch_t *t4taib[TTMAX_ALACROIX]; +static patch_t *t4taif[TTMAX_ALACROIX]; +static patch_t *t4taba[TTMAX_ALACROIX]; +static patch_t *t4tabk[TTMAX_ALACROIX]; +static patch_t *t4tabt[TTMAX_ALACROIX]; +static patch_t *t4taft[TTMAX_ALACROIX]; +static patch_t *t4knib[TTMAX_ALACROIX]; +static patch_t *t4knif[TTMAX_ALACROIX]; +static patch_t *t4knba[TTMAX_ALACROIX]; +static patch_t *t4knbk[TTMAX_ALACROIX]; +static patch_t *t4kndh[TTMAX_ALACROIX]; static patch_t *t6ribb[TTMAX_ALACROIX]; static patch_t *t6sont[TTMAX_ALACROIX]; @@ -146,6 +194,22 @@ static patch_t *t6robo[TTMAX_ALACROIX]; static patch_t *t6twot[TTMAX_ALACROIX]; static patch_t *t6embl[TTMAX_ALACROIX]; static patch_t *t6rbtx[TTMAX_ALACROIX]; +static patch_t *t6soib[TTMAX_ALACROIX]; +static patch_t *t6soif[TTMAX_ALACROIX]; +static patch_t *t6soba[TTMAX_ALACROIX]; +static patch_t *t6sobk[TTMAX_ALACROIX]; +static patch_t *t6sodh[TTMAX_ALACROIX]; +static patch_t *t6taib[TTMAX_ALACROIX]; +static patch_t *t6taif[TTMAX_ALACROIX]; +static patch_t *t6taba[TTMAX_ALACROIX]; +static patch_t *t6tabk[TTMAX_ALACROIX]; +static patch_t *t6tabt[TTMAX_ALACROIX]; +static patch_t *t6taft[TTMAX_ALACROIX]; +static patch_t *t6knib[TTMAX_ALACROIX]; +static patch_t *t6knif[TTMAX_ALACROIX]; +static patch_t *t6knba[TTMAX_ALACROIX]; +static patch_t *t6knbk[TTMAX_ALACROIX]; +static patch_t *t6kndh[TTMAX_ALACROIX]; #define TTEMBL (presc == 6 ? t6embl : presc == 4 ? t4embl : presc == 2 ? t2embl : t1embl) #define TTRIBB (presc == 6 ? t6ribb : presc == 4 ? t4ribb : presc == 2 ? t2ribb : t1ribb) @@ -153,6 +217,22 @@ static patch_t *t6rbtx[TTMAX_ALACROIX]; #define TTROBO (presc == 6 ? t6robo : presc == 4 ? t4robo : presc == 2 ? t2robo : t1robo) #define TTTWOT (presc == 6 ? t6twot : presc == 4 ? t4twot : presc == 2 ? t2twot : t1twot) #define TTRBTX (presc == 6 ? t6rbtx : presc == 4 ? t4rbtx : presc == 2 ? t2rbtx : t1rbtx) +#define TTSOIB (presc == 6 ? t6soib : presc == 4 ? t4soib : presc == 2 ? t2soib : t1soib) +#define TTSOIF (presc == 6 ? t6soif : presc == 4 ? t4soif : presc == 2 ? t2soif : t1soif) +#define TTSOBA (presc == 6 ? t6soba : presc == 4 ? t4soba : presc == 2 ? t2soba : t1soba) +#define TTSOBK (presc == 6 ? t6sobk : presc == 4 ? t4sobk : presc == 2 ? t2sobk : t1sobk) +#define TTSODH (presc == 6 ? t6sodh : presc == 4 ? t4sodh : presc == 2 ? t2sodh : t1sodh) +#define TTTAIB (presc == 6 ? t6taib : presc == 4 ? t4taib : presc == 2 ? t2taib : t1taib) +#define TTTAIF (presc == 6 ? t6taif : presc == 4 ? t4taif : presc == 2 ? t2taif : t1taif) +#define TTTABA (presc == 6 ? t6taba : presc == 4 ? t4taba : presc == 2 ? t2taba : t1taba) +#define TTTABK (presc == 6 ? t6tabk : presc == 4 ? t4tabk : presc == 2 ? t2tabk : t1tabk) +#define TTTABT (presc == 6 ? t6tabt : presc == 4 ? t4tabt : presc == 2 ? t2tabt : t1tabt) +#define TTTAFT (presc == 6 ? t6taft : presc == 4 ? t4taft : presc == 2 ? t2taft : t1taft) +#define TTKNIB (presc == 6 ? t6knib : presc == 4 ? t4knib : presc == 2 ? t2knib : t1knib) +#define TTKNIF (presc == 6 ? t6knif : presc == 4 ? t4knif : presc == 2 ? t2knif : t1knif) +#define TTKNBA (presc == 6 ? t6knba : presc == 4 ? t4knba : presc == 2 ? t2knba : t1knba) +#define TTKNBK (presc == 6 ? t6knbk : presc == 4 ? t4knbk : presc == 2 ? t2knbk : t1knbk) +#define TTKNDH (presc == 6 ? t6kndh : presc == 4 ? t4kndh : presc == 2 ? t2kndh : t1kndh) // ttmode user static patch_t *ttuser[TTMAX_USER]; @@ -2389,6 +2469,22 @@ else \ LOADTTGFX(t1robo, "T1ROBO", TTMAX_ALACROIX) LOADTTGFX(t1twot, "T1TWOT", TTMAX_ALACROIX) LOADTTGFX(t1rbtx, "T1RBTX", TTMAX_ALACROIX) + LOADTTGFX(t1soib, "T1SOIB", TTMAX_ALACROIX) + LOADTTGFX(t1soif, "T1SOIF", TTMAX_ALACROIX) + LOADTTGFX(t1soba, "T1SOBA", TTMAX_ALACROIX) + LOADTTGFX(t1sobk, "T1SOBK", TTMAX_ALACROIX) + LOADTTGFX(t1sodh, "T1SODH", TTMAX_ALACROIX) + LOADTTGFX(t1taib, "T1TAIB", TTMAX_ALACROIX) + LOADTTGFX(t1taif, "T1TAIF", TTMAX_ALACROIX) + LOADTTGFX(t1taba, "T1TABA", TTMAX_ALACROIX) + LOADTTGFX(t1tabk, "T1TABK", TTMAX_ALACROIX) + LOADTTGFX(t1tabt, "T1TABT", TTMAX_ALACROIX) + LOADTTGFX(t1taft, "T1TAFT", TTMAX_ALACROIX) + LOADTTGFX(t1knib, "T1KNIB", TTMAX_ALACROIX) + LOADTTGFX(t1knif, "T1KNIF", TTMAX_ALACROIX) + LOADTTGFX(t1knba, "T1KNBA", TTMAX_ALACROIX) + LOADTTGFX(t1knbk, "T1KNBK", TTMAX_ALACROIX) + LOADTTGFX(t1kndh, "T1KNDH", TTMAX_ALACROIX) LOADTTGFX(t2embl, "T2EMBL", TTMAX_ALACROIX) LOADTTGFX(t2ribb, "T2RIBB", TTMAX_ALACROIX) @@ -2396,6 +2492,22 @@ else \ LOADTTGFX(t2robo, "T2ROBO", TTMAX_ALACROIX) LOADTTGFX(t2twot, "T2TWOT", TTMAX_ALACROIX) LOADTTGFX(t2rbtx, "T2RBTX", TTMAX_ALACROIX) + LOADTTGFX(t2soib, "T2SOIB", TTMAX_ALACROIX) + LOADTTGFX(t2soif, "T2SOIF", TTMAX_ALACROIX) + LOADTTGFX(t2soba, "T2SOBA", TTMAX_ALACROIX) + LOADTTGFX(t2sobk, "T2SOBK", TTMAX_ALACROIX) + LOADTTGFX(t2sodh, "T2SODH", TTMAX_ALACROIX) + LOADTTGFX(t2taib, "T2TAIB", TTMAX_ALACROIX) + LOADTTGFX(t2taif, "T2TAIF", TTMAX_ALACROIX) + LOADTTGFX(t2taba, "T2TABA", TTMAX_ALACROIX) + LOADTTGFX(t2tabk, "T2TABK", TTMAX_ALACROIX) + LOADTTGFX(t2tabt, "T2TABT", TTMAX_ALACROIX) + LOADTTGFX(t2taft, "T2TAFT", TTMAX_ALACROIX) + LOADTTGFX(t2knib, "T2KNIB", TTMAX_ALACROIX) + LOADTTGFX(t2knif, "T2KNIF", TTMAX_ALACROIX) + LOADTTGFX(t2knba, "T2KNBA", TTMAX_ALACROIX) + LOADTTGFX(t2knbk, "T2KNBK", TTMAX_ALACROIX) + LOADTTGFX(t2kndh, "T2KNDH", TTMAX_ALACROIX) LOADTTGFX(t4embl, "T4EMBL", TTMAX_ALACROIX) LOADTTGFX(t4ribb, "T4RIBB", TTMAX_ALACROIX) @@ -2403,6 +2515,22 @@ else \ LOADTTGFX(t4robo, "T4ROBO", TTMAX_ALACROIX) LOADTTGFX(t4twot, "T4TWOT", TTMAX_ALACROIX) LOADTTGFX(t4rbtx, "T4RBTX", TTMAX_ALACROIX) + LOADTTGFX(t4soib, "T4SOIB", TTMAX_ALACROIX) + LOADTTGFX(t4soif, "T4SOIF", TTMAX_ALACROIX) + LOADTTGFX(t4soba, "T4SOBA", TTMAX_ALACROIX) + LOADTTGFX(t4sobk, "T4SOBK", TTMAX_ALACROIX) + LOADTTGFX(t4sodh, "T4SODH", TTMAX_ALACROIX) + LOADTTGFX(t4taib, "T4TAIB", TTMAX_ALACROIX) + LOADTTGFX(t4taif, "T4TAIF", TTMAX_ALACROIX) + LOADTTGFX(t4taba, "T4TABA", TTMAX_ALACROIX) + LOADTTGFX(t4tabk, "T4TABK", TTMAX_ALACROIX) + LOADTTGFX(t4tabt, "T4TABT", TTMAX_ALACROIX) + LOADTTGFX(t4taft, "T4TAFT", TTMAX_ALACROIX) + LOADTTGFX(t4knib, "T4KNIB", TTMAX_ALACROIX) + LOADTTGFX(t4knif, "T4KNIF", TTMAX_ALACROIX) + LOADTTGFX(t4knba, "T4KNBA", TTMAX_ALACROIX) + LOADTTGFX(t4knbk, "T4KNBK", TTMAX_ALACROIX) + LOADTTGFX(t4kndh, "T4KNDH", TTMAX_ALACROIX) LOADTTGFX(t6embl, "T6EMBL", TTMAX_ALACROIX) LOADTTGFX(t6ribb, "T6RIBB", TTMAX_ALACROIX) @@ -2410,6 +2538,22 @@ else \ LOADTTGFX(t6robo, "T6ROBO", TTMAX_ALACROIX) LOADTTGFX(t6twot, "T6TWOT", TTMAX_ALACROIX) LOADTTGFX(t6rbtx, "T6RBTX", TTMAX_ALACROIX) + LOADTTGFX(t6soib, "T6SOIB", TTMAX_ALACROIX) + LOADTTGFX(t6soif, "T6SOIF", TTMAX_ALACROIX) + LOADTTGFX(t6soba, "T6SOBA", TTMAX_ALACROIX) + LOADTTGFX(t6sobk, "T6SOBK", TTMAX_ALACROIX) + LOADTTGFX(t6sodh, "T6SODH", TTMAX_ALACROIX) + LOADTTGFX(t6taib, "T6TAIB", TTMAX_ALACROIX) + LOADTTGFX(t6taif, "T6TAIF", TTMAX_ALACROIX) + LOADTTGFX(t6taba, "T6TABA", TTMAX_ALACROIX) + LOADTTGFX(t6tabk, "T6TABK", TTMAX_ALACROIX) + LOADTTGFX(t6tabt, "T6TABT", TTMAX_ALACROIX) + LOADTTGFX(t6taft, "T6TAFT", TTMAX_ALACROIX) + LOADTTGFX(t6knib, "T6KNIB", TTMAX_ALACROIX) + LOADTTGFX(t6knif, "T6KNIF", TTMAX_ALACROIX) + LOADTTGFX(t6knba, "T6KNBA", TTMAX_ALACROIX) + LOADTTGFX(t6knbk, "T6KNBK", TTMAX_ALACROIX) + LOADTTGFX(t6kndh, "T6KNDH", TTMAX_ALACROIX) break; } @@ -2555,15 +2699,44 @@ void F_TitleScreenDrawer(void) } // - // TODO: CHARACTERS GO HERE + // TODO: ALACROIX CHARACTER FRAMES + // + // Start all animation from tic 34 (or whenever the white flash begins to fade; see below.) + // + // NOTE: CHARACTER GFX COORDINATES: + // All frames share the same X/Y coord per character. + // + // Sonic: X 89, Y 13 + // Tails: X 35, Y 19 + // Knux : X 167, Y 17 + // + + // + // TODO: BACK TAIL GFX GO HERE + // + + // + // TODO: FRONT TAIL GFX GO HERE + // + + // + // TODO: BACK LAYER GFX GO HERE + // + + // + // LOGO LAYER // // After tic 34, starting when the flash fades, - // draw the combined ribbon and SONIC ROBO BLAST 2 bake. Note the different Y value, because this + // draw the combined ribbon and SONIC ROBO BLAST 2 logo. Note the different Y value, because this // graphic is cropped differently from the unfurling ribbon. if (finalecount > 34) V_DrawSciencePatch(40< 29 && finalecount < 35) diff --git a/src/f_finale.h b/src/f_finale.h index ca1de9225..a14ee6184 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -85,7 +85,7 @@ typedef enum TTMODE_USER } ttmode_enum; -#define TTMAX_ALACROIX 100 +#define TTMAX_ALACROIX 29 // max frames for SONIC typeface #define TTMAX_USER 100 extern ttmode_enum ttmode; From 82b65c87b841167f70cf27fa7300b7f9ef156c7c Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 3 Nov 2019 10:29:42 -0500 Subject: [PATCH 18/50] Alacroix title screen character frames --- src/f_finale.c | 594 +++++++++++++++++++++++++++++++++++++++++++++++-- src/f_finale.h | 2 +- 2 files changed, 572 insertions(+), 24 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index 51572f573..9971a16e3 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -234,6 +234,22 @@ static patch_t *t6kndh[TTMAX_ALACROIX]; #define TTKNBK (presc == 6 ? t6knbk : presc == 4 ? t4knbk : presc == 2 ? t2knbk : t1knbk) #define TTKNDH (presc == 6 ? t6kndh : presc == 4 ? t4kndh : presc == 2 ? t2kndh : t1kndh) +static boolean sonic_blink = false; +static boolean sonic_blink_twice = false; +static boolean sonic_blinked_already = false; +static INT32 sonic_idle_start = 0; +static INT32 sonic_idle_end = 0; +static boolean tails_blink = false; +static boolean tails_blink_twice = false; +static boolean tails_blinked_already = false; +static INT32 tails_idle_start = 0; +static INT32 tails_idle_end = 0; +static boolean knux_blink = false; +static boolean knux_blink_twice = false; +static boolean knux_blinked_already = false; +static INT32 knux_idle_start = 0; +static INT32 knux_idle_end = 0; + // ttmode user static patch_t *ttuser[TTMAX_USER]; static INT32 ttuser_count = 0; @@ -2331,7 +2347,13 @@ void F_StartTitleScreen(void) if (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS) { - ttuser_count = 0; + ttuser_count =\ + sonic_blink = sonic_blink_twice = sonic_idle_start = sonic_idle_end =\ + tails_blink = tails_blink_twice = tails_idle_start = tails_idle_end =\ + knux_blink = knux_blink_twice = knux_idle_start = knux_idle_end = 0; + + sonic_blinked_already = tails_blinked_already = knux_blinked_already = 1; // don't blink on the first idle cycle + if (curttmode == TTMODE_ALACROIX) finalecount = -3; // hack so that frames don't advance during the entry wipe else @@ -2644,9 +2666,9 @@ void F_TitleScreenDrawer(void) break; case TTMODE_ALACROIX: - /* - ALICE ANIMATION CODE GOES HERE - */ + // + // PRE-INTRO: WING ON BLACK BACKGROUND + // // Start at black background. Draw it until tic 30, where we replace with a white flash. // @@ -2662,11 +2684,11 @@ void F_TitleScreenDrawer(void) if (finalecount <= 29) { // Ribbon unfurls, revealing SONIC text, from tic 0 to tic 24. SONIC text is pre-baked into this ribbon graphic. - V_DrawSciencePatch(40<= 0) - V_DrawSciencePatch(90< 9) @@ -2690,39 +2712,417 @@ void F_TitleScreenDrawer(void) case 4: case 3: fadeval = V_10TRANS; break; } } - V_DrawSciencePatch(80< 15) - V_DrawSciencePatch(107<= KNUXIDLE) + { + if (!knux_idle_start || !((finalecount - knux_idle_start) % knux_idle_end)) + { + if (knux_blink) + { + knux_blink = false; // don't run the cycle twice in a row + knux_blinked_already = true; + } + else if (knux_blinked_already) // or after the first non-blink cycle, either. + knux_blinked_already = false; + else + { + // make this chance higher than Sonic/Tails because Knux's idle cycle is longer + knux_blink = !(M_RandomKey(100) % 2); + knux_blink_twice = knux_blink ? !(M_RandomKey(100) % 5) : false; + } + knux_idle_start = finalecount; + } + + knux_idle_end = knux_blink ? (knux_blink_twice ? 17 : 7) : 46; + } + + if (finalecount >= TAILSIDLE) + { + if (!tails_idle_start || !((finalecount - tails_idle_start) % tails_idle_end)) + { + if (tails_blink) + { + tails_blink = false; // don't run the cycle twice in a row + tails_blinked_already = true; + } + else if (tails_blinked_already) // or after the first non-blink cycle, either. + tails_blinked_already = false; + else + { + tails_blink = !(M_RandomKey(100) % 3); + tails_blink_twice = tails_blink ? !(M_RandomKey(100) % 5) : false; + } + tails_idle_start = finalecount; + } + + // Tails does not actually have a non-blink idle cycle, but make up a number + // so he can still blink. + tails_idle_end = tails_blink ? (tails_blink_twice ? 17 : 7) : 35; + } + + if (finalecount >= SONICIDLE) + { + if (!sonic_idle_start || !((finalecount - sonic_idle_start) % sonic_idle_end)) + { + if (sonic_blink) + { + sonic_blink = false; // don't run the cycle twice in a row + sonic_blinked_already = true; + } + else if (sonic_blinked_already) // or after the first non-blink cycle, either. + sonic_blinked_already = false; + else + { + sonic_blink = !(M_RandomKey(100) % 3); + sonic_blink_twice = sonic_blink ? !(M_RandomKey(100) % 5) : false; + } + sonic_idle_start = finalecount; + } + + sonic_idle_end = sonic_blink ? (sonic_blink_twice ? 17 : 7) : 25; + } + // - // TODO: FRONT TAIL GFX GO HERE + // BACK TAIL LAYER // + if (finalecount >= TAILSSTART) + { + if (finalecount >= TAILSIDLE) + { + // + // Tails Back Tail Layer Idle + // + SINT8 taftcount = (finalecount - (TAILSIDLE)) % 41; + if (taftcount >= 0 && taftcount < 5 ) + V_DrawSciencePatch(TAILSX<= 5 && taftcount < 9 ) + V_DrawSciencePatch(TAILSX<= 9 && taftcount < 12 ) + V_DrawSciencePatch(TAILSX<= 12 && taftcount < 14 ) + V_DrawSciencePatch(TAILSX<= 14 && taftcount < 17 ) + V_DrawSciencePatch(TAILSX<= 17 && taftcount < 21 ) + V_DrawSciencePatch(TAILSX<= 21 && taftcount < 24 ) + V_DrawSciencePatch(TAILSX<= 24 && taftcount < 25 ) + V_DrawSciencePatch(TAILSX<= 25 && taftcount < 28 ) + V_DrawSciencePatch(TAILSX<= 28 && taftcount < 31 ) + V_DrawSciencePatch(TAILSX<= 31 && taftcount < 35 ) + V_DrawSciencePatch(TAILSX<= 35 && taftcount < 41 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART) + { + if (finalecount >= TAILSIDLE) + { + // + // Tails Front Tail Layer Idle + // + SINT8 tabtcount = (finalecount - (TAILSIDLE)) % 41; + if (tabtcount >= 0 && tabtcount < 6 ) + V_DrawSciencePatch(TAILSX<= 6 && tabtcount < 11 ) + V_DrawSciencePatch(TAILSX<= 11 && tabtcount < 15 ) + V_DrawSciencePatch(TAILSX<= 15 && tabtcount < 18 ) + V_DrawSciencePatch(TAILSX<= 18 && tabtcount < 19 ) + V_DrawSciencePatch(TAILSX<= 19 && tabtcount < 22 ) + V_DrawSciencePatch(TAILSX<= 22 && tabtcount < 27 ) + V_DrawSciencePatch(TAILSX<= 27 && tabtcount < 30 ) + V_DrawSciencePatch(TAILSX<= 30 && tabtcount < 31 ) + V_DrawSciencePatch(TAILSX<= 31 && tabtcount < 34 ) + V_DrawSciencePatch(TAILSX<= 34 && tabtcount < 37 ) + V_DrawSciencePatch(TAILSX<= 37 && tabtcount < 41 ) + V_DrawSciencePatch(TAILSX<= KNUXSTART) + { + if (finalecount < KNUXIDLE) + { + // + // Knux Back Layer Intro + // + if (finalecount >= KNUXSTART+0 && finalecount < KNUXSTART+6 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+6 && finalecount < KNUXSTART+10 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+10 && finalecount < KNUXSTART+13 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+13 && finalecount < KNUXSTART+15 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+15 && finalecount < KNUXSTART+18 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+18 && finalecount < KNUXSTART+22 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+22 && finalecount < KNUXSTART+28 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+28 && finalecount < KNUXSTART+32 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+32 && finalecount < KNUXSTART+35 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+35 && finalecount < KNUXSTART+40 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+40 && finalecount < KNUXSTART+41 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+41 && finalecount < KNUXSTART+44 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+44 && finalecount < KNUXSTART+50 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+50 && finalecount < KNUXSTART+56 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+56 && finalecount < KNUXSTART+57 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+57 && finalecount < KNUXSTART+60 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+60 && finalecount < KNUXSTART+63 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+63 && finalecount < KNUXSTART+67 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+67 && finalecount < KNUXSTART+70 ) + V_DrawSciencePatch(KNUXX<= 0 && idlecount < 2 ) + V_DrawSciencePatch(KNUXX<= 2 && idlecount < 6 ) + V_DrawSciencePatch(KNUXX<= 6 && idlecount < 7 ) + V_DrawSciencePatch(KNUXX<= 7 && idlecount < 10) + V_DrawSciencePatch(KNUXX<= 10 && idlecount < 12) + V_DrawSciencePatch(KNUXX<= 12 && idlecount < 16) + V_DrawSciencePatch(KNUXX<= 16 && idlecount < 17) + V_DrawSciencePatch(KNUXX<= TAILSSTART) + { + if (finalecount < TAILSIDLE) + { + // + // Tails Back Layer Intro + // + if (finalecount >= TAILSSTART+0 && finalecount < TAILSSTART+6 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+6 && finalecount < TAILSSTART+10 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+10 && finalecount < TAILSSTART+12 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+12 && finalecount < TAILSSTART+16 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+16 && finalecount < TAILSSTART+22 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+22 && finalecount < TAILSSTART+23 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+23 && finalecount < TAILSSTART+26 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+26 && finalecount < TAILSSTART+30 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+30 && finalecount < TAILSSTART+35 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+35 && finalecount < TAILSSTART+41 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+41 && finalecount < TAILSSTART+43 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+43 && finalecount < TAILSSTART+47 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+47 && finalecount < TAILSSTART+51 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+51 && finalecount < TAILSSTART+53 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+53 && finalecount < TAILSSTART+56 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+56 && finalecount < TAILSSTART+60 ) + V_DrawSciencePatch(TAILSX<= +0 && idlecount < +2 ) + V_DrawSciencePatch(TAILSX<= +2 && idlecount < +6 ) + V_DrawSciencePatch(TAILSX<= +6 && idlecount < +7 ) + V_DrawSciencePatch(TAILSX<= +7 && idlecount < +10) + V_DrawSciencePatch(TAILSX<= +10 && idlecount < +12) + V_DrawSciencePatch(TAILSX<= +12 && idlecount < +16) + V_DrawSciencePatch(TAILSX<= +16 && idlecount < +17) + V_DrawSciencePatch(TAILSX<= SONICSTART) + { + if (finalecount < SONICIDLE) + { + // + // Sonic Back Layer Intro + // + if (finalecount >= SONICSTART+0 && finalecount < SONICSTART+6 ) + V_DrawSciencePatch(SONICX<= SONICSTART+6 && finalecount < SONICSTART+11 ) + V_DrawSciencePatch(SONICX<= SONICSTART+11 && finalecount < SONICSTART+14 ) + V_DrawSciencePatch(SONICX<= SONICSTART+14 && finalecount < SONICSTART+18 ) + V_DrawSciencePatch(SONICX<= SONICSTART+18 && finalecount < SONICSTART+19 ) + V_DrawSciencePatch(SONICX<= SONICSTART+19 && finalecount < SONICSTART+27 ) + V_DrawSciencePatch(SONICX<= SONICSTART+27 && finalecount < SONICSTART+31 ) + V_DrawSciencePatch(SONICX<= SONICSTART+31 && finalecount < SONICSTART+33 ) + // Frame is blank + // V_DrawSciencePatch(SONICX<= SONICSTART+33 && finalecount < SONICSTART+36 ) + V_DrawSciencePatch(SONICX<= SONICSTART+36 && finalecount < SONICSTART+40 ) + V_DrawSciencePatch(SONICX<= SONICSTART+40 && finalecount < SONICSTART+44 ) + V_DrawSciencePatch(SONICX<= SONICSTART+44 && finalecount < SONICSTART+47 ) + V_DrawSciencePatch(SONICX<= SONICSTART+47 && finalecount < SONICSTART+49 ) + V_DrawSciencePatch(SONICX<= SONICSTART+49 && finalecount < SONICSTART+50 ) + V_DrawSciencePatch(SONICX<= SONICSTART+50 && finalecount < SONICSTART+53 ) + V_DrawSciencePatch(SONICX<= SONICSTART+53 && finalecount < SONICSTART+57 ) + V_DrawSciencePatch(SONICX<= 0 && idlecount < 2 ) + V_DrawSciencePatch(SONICX<= 2 && idlecount < 6 ) + V_DrawSciencePatch(SONICX<= 6 && idlecount < 7 ) + V_DrawSciencePatch(SONICX<= 7 && idlecount < 10) + V_DrawSciencePatch(SONICX<= 10 && idlecount < 12) + V_DrawSciencePatch(SONICX<= 12 && idlecount < 16) + V_DrawSciencePatch(SONICX<= 16 && idlecount < 17) + V_DrawSciencePatch(SONICX< 34) - V_DrawSciencePatch(40<= KNUXSTART) + { + if (finalecount < KNUXIDLE) + { + // + // Knux Front Layer Intro + // + if (finalecount >= KNUXSTART+22 && finalecount < KNUXSTART+28 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+28 && finalecount < KNUXSTART+32 ) + V_DrawSciencePatch(KNUXX<= KNUXSTART+32 && finalecount < KNUXSTART+35 ) + V_DrawSciencePatch(KNUXX<= 0 && idlecount < 5 ) + V_DrawSciencePatch(KNUXX<= 5 && idlecount < 10) + V_DrawSciencePatch(KNUXX<= 10 && idlecount < 13) + V_DrawSciencePatch(KNUXX<= 13 && idlecount < 14) + V_DrawSciencePatch(KNUXX<= 14 && idlecount < 17) + V_DrawSciencePatch(KNUXX<= 17 && idlecount < 21) + V_DrawSciencePatch(KNUXX<= 21 && idlecount < 27) + V_DrawSciencePatch(KNUXX<= 27 && idlecount < 32) + V_DrawSciencePatch(KNUXX<= 32 && idlecount < 34) + V_DrawSciencePatch(KNUXX<= 34 && idlecount < 37) + V_DrawSciencePatch(KNUXX<= 37 && idlecount < 39) + V_DrawSciencePatch(KNUXX<= 39 && idlecount < 42) + V_DrawSciencePatch(KNUXX<= 42 && idlecount < 46) + V_DrawSciencePatch(KNUXX<= TAILSSTART) + { + if (finalecount < TAILSIDLE) + { + // + // Tails Front Layer Intro + // + if (finalecount >= TAILSSTART+26 && finalecount < TAILSSTART+30 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+30 && finalecount < TAILSSTART+35 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+35 && finalecount < TAILSSTART+41 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+41 && finalecount < TAILSSTART+43 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+43 && finalecount < TAILSSTART+47 ) + V_DrawSciencePatch(TAILSX<= TAILSSTART+47 && finalecount < TAILSSTART+51 ) + V_DrawSciencePatch(TAILSX<= SONICSTART) + { + if (finalecount < SONICIDLE) + { + // + // Sonic Front Layer Intro + // + if (finalecount >= SONICSTART+19 && finalecount < SONICSTART+27 ) + V_DrawSciencePatch(SONICX<= SONICSTART+27 && finalecount < SONICSTART+31 ) + V_DrawSciencePatch(SONICX<= SONICSTART+31 && finalecount < SONICSTART+33 ) + V_DrawSciencePatch(SONICX<= SONICSTART+33 && finalecount < SONICSTART+36 ) + V_DrawSciencePatch(SONICX<= SONICSTART+36 && finalecount < SONICSTART+40 ) + V_DrawSciencePatch(SONICX<= SONICSTART+40 && finalecount < SONICSTART+44 ) + V_DrawSciencePatch(SONICX<= SONICSTART+44 && finalecount < SONICSTART+47 ) + V_DrawSciencePatch(SONICX<= SONICSTART+53 && finalecount < SONICSTART+57 ) + V_DrawSciencePatch(SONICX<= 0 && idlecount < 5 ) + V_DrawSciencePatch(SONICX<= 5 && idlecount < 8 ) + V_DrawSciencePatch(SONICX<= 8 && idlecount < 9 ) + V_DrawSciencePatch(SONICX<= 9 && idlecount < 12) + V_DrawSciencePatch(SONICX<= 12 && idlecount < 17) + V_DrawSciencePatch(SONICX<= 17 && idlecount < 19) + V_DrawSciencePatch(SONICX<= 19 && idlecount < 21) + V_DrawSciencePatch(SONICX<= 21 && idlecount < 22) + V_DrawSciencePatch(SONICX<= 22 && idlecount < 25) + V_DrawSciencePatch(SONICX< 29 && finalecount < 35) @@ -2744,6 +3278,20 @@ void F_TitleScreenDrawer(void) else if (finalecount > 34 && 44-finalecount > 0 && 44-finalecount < 10) V_DrawFadeScreen(0, 44-finalecount); +#undef CHARSTART +#undef SONICSTART +#undef SONICIDLE +#undef SONICX +#undef SONICY +#undef TAILSSTART +#undef TAILSIDLE +#undef TAILSX +#undef TAILSY +#undef KNUXSTART +#undef KNUXIDLE +#undef KNUXX +#undef KNUXY + break; case TTMODE_USER: diff --git a/src/f_finale.h b/src/f_finale.h index a14ee6184..0a599fa2d 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -85,7 +85,7 @@ typedef enum TTMODE_USER } ttmode_enum; -#define TTMAX_ALACROIX 29 // max frames for SONIC typeface +#define TTMAX_ALACROIX 30 // max frames for SONIC typeface, plus one for NULL terminating entry #define TTMAX_USER 100 extern ttmode_enum ttmode; From 05ac1a1a216eb6134cdc3a55080333d88bc9a11a Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 3 Nov 2019 14:20:49 -0500 Subject: [PATCH 19/50] Alacroix gfx optimization; dynamic loading/unloading of title gfx resolutions --- src/dehacked.c | 22 +++ src/f_finale.c | 456 +++++++++++++++++++++++-------------------------- src/f_finale.h | 2 + 3 files changed, 242 insertions(+), 238 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 37df6176c..61c6969d5 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -2113,6 +2113,7 @@ static void readmenu(MYFILE *f, INT32 num) } else if (fastcmp(word, "TITLEPICSSCALE")) { + // Don't handle Alacroix special case here; see Maincfg section. menupres[num].ttscale = max(1, min(8, (UINT8)get_number(word2))); titlechanged = true; } @@ -3564,6 +3565,27 @@ static void readmaincfg(MYFILE *f) ttscale = max(1, min(8, (UINT8)get_number(word2))); titlechanged = true; } + else if (fastcmp(word, "TITLEPICSSCALESAVAILABLE")) + { + // SPECIAL CASE for Alacroix: Comma-separated list of resolutions that are available + // for gfx loading. + ttavailable[0] = ttavailable[1] = ttavailable[2] = ttavailable[3] =\ + ttavailable[4] = ttavailable[5] = false; + + if (strstr(word2, "1") != NULL) + ttavailable[0] = true; + if (strstr(word2, "2") != NULL) + ttavailable[1] = true; + if (strstr(word2, "3") != NULL) + ttavailable[2] = true; + if (strstr(word2, "4") != NULL) + ttavailable[3] = true; + if (strstr(word2, "5") != NULL) + ttavailable[4] = true; + if (strstr(word2, "6") != NULL) + ttavailable[5] = true; + titlechanged = true; + } else if (fastcmp(word, "TITLEPICSNAME")) { strncpy(ttname, word2, 9); diff --git a/src/f_finale.c b/src/f_finale.c index 9971a16e3..354bd6fef 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -119,120 +119,56 @@ static patch_t *ttspop6; static patch_t *ttspop7; // ttmode alacroix -static patch_t *t1ribb[TTMAX_ALACROIX]; -static patch_t *t1sont[TTMAX_ALACROIX]; -static patch_t *t1robo[TTMAX_ALACROIX]; -static patch_t *t1twot[TTMAX_ALACROIX]; -static patch_t *t1embl[TTMAX_ALACROIX]; -static patch_t *t1rbtx[TTMAX_ALACROIX]; -static patch_t *t1soib[TTMAX_ALACROIX]; -static patch_t *t1soif[TTMAX_ALACROIX]; -static patch_t *t1soba[TTMAX_ALACROIX]; -static patch_t *t1sobk[TTMAX_ALACROIX]; -static patch_t *t1sodh[TTMAX_ALACROIX]; -static patch_t *t1taib[TTMAX_ALACROIX]; -static patch_t *t1taif[TTMAX_ALACROIX]; -static patch_t *t1taba[TTMAX_ALACROIX]; -static patch_t *t1tabk[TTMAX_ALACROIX]; -static patch_t *t1tabt[TTMAX_ALACROIX]; -static patch_t *t1taft[TTMAX_ALACROIX]; -static patch_t *t1knib[TTMAX_ALACROIX]; -static patch_t *t1knif[TTMAX_ALACROIX]; -static patch_t *t1knba[TTMAX_ALACROIX]; -static patch_t *t1knbk[TTMAX_ALACROIX]; -static patch_t *t1kndh[TTMAX_ALACROIX]; +static SINT8 testttscale = 0; +static SINT8 activettscale = 0; +boolean ttavailable[6]; +boolean ttloaded[6]; -static patch_t *t2ribb[TTMAX_ALACROIX]; -static patch_t *t2sont[TTMAX_ALACROIX]; -static patch_t *t2robo[TTMAX_ALACROIX]; -static patch_t *t2twot[TTMAX_ALACROIX]; -static patch_t *t2embl[TTMAX_ALACROIX]; -static patch_t *t2rbtx[TTMAX_ALACROIX]; -static patch_t *t2soib[TTMAX_ALACROIX]; -static patch_t *t2soif[TTMAX_ALACROIX]; -static patch_t *t2soba[TTMAX_ALACROIX]; -static patch_t *t2sobk[TTMAX_ALACROIX]; -static patch_t *t2sodh[TTMAX_ALACROIX]; -static patch_t *t2taib[TTMAX_ALACROIX]; -static patch_t *t2taif[TTMAX_ALACROIX]; -static patch_t *t2taba[TTMAX_ALACROIX]; -static patch_t *t2tabk[TTMAX_ALACROIX]; -static patch_t *t2tabt[TTMAX_ALACROIX]; -static patch_t *t2taft[TTMAX_ALACROIX]; -static patch_t *t2knib[TTMAX_ALACROIX]; -static patch_t *t2knif[TTMAX_ALACROIX]; -static patch_t *t2knba[TTMAX_ALACROIX]; -static patch_t *t2knbk[TTMAX_ALACROIX]; -static patch_t *t2kndh[TTMAX_ALACROIX]; +static patch_t *ttribb[6][TTMAX_ALACROIX]; +static patch_t *ttsont[6][TTMAX_ALACROIX]; +static patch_t *ttrobo[6][TTMAX_ALACROIX]; +static patch_t *tttwot[6][TTMAX_ALACROIX]; +static patch_t *ttembl[6][TTMAX_ALACROIX]; +static patch_t *ttrbtx[6][TTMAX_ALACROIX]; +static patch_t *ttsoib[6][TTMAX_ALACROIX]; +static patch_t *ttsoif[6][TTMAX_ALACROIX]; +static patch_t *ttsoba[6][TTMAX_ALACROIX]; +static patch_t *ttsobk[6][TTMAX_ALACROIX]; +static patch_t *ttsodh[6][TTMAX_ALACROIX]; +static patch_t *tttaib[6][TTMAX_ALACROIX]; +static patch_t *tttaif[6][TTMAX_ALACROIX]; +static patch_t *tttaba[6][TTMAX_ALACROIX]; +static patch_t *tttabk[6][TTMAX_ALACROIX]; +static patch_t *tttabt[6][TTMAX_ALACROIX]; +static patch_t *tttaft[6][TTMAX_ALACROIX]; +static patch_t *ttknib[6][TTMAX_ALACROIX]; +static patch_t *ttknif[6][TTMAX_ALACROIX]; +static patch_t *ttknba[6][TTMAX_ALACROIX]; +static patch_t *ttknbk[6][TTMAX_ALACROIX]; +static patch_t *ttkndh[6][TTMAX_ALACROIX]; -static patch_t *t4ribb[TTMAX_ALACROIX]; -static patch_t *t4sont[TTMAX_ALACROIX]; -static patch_t *t4robo[TTMAX_ALACROIX]; -static patch_t *t4twot[TTMAX_ALACROIX]; -static patch_t *t4embl[TTMAX_ALACROIX]; -static patch_t *t4rbtx[TTMAX_ALACROIX]; -static patch_t *t4soib[TTMAX_ALACROIX]; -static patch_t *t4soif[TTMAX_ALACROIX]; -static patch_t *t4soba[TTMAX_ALACROIX]; -static patch_t *t4sobk[TTMAX_ALACROIX]; -static patch_t *t4sodh[TTMAX_ALACROIX]; -static patch_t *t4taib[TTMAX_ALACROIX]; -static patch_t *t4taif[TTMAX_ALACROIX]; -static patch_t *t4taba[TTMAX_ALACROIX]; -static patch_t *t4tabk[TTMAX_ALACROIX]; -static patch_t *t4tabt[TTMAX_ALACROIX]; -static patch_t *t4taft[TTMAX_ALACROIX]; -static patch_t *t4knib[TTMAX_ALACROIX]; -static patch_t *t4knif[TTMAX_ALACROIX]; -static patch_t *t4knba[TTMAX_ALACROIX]; -static patch_t *t4knbk[TTMAX_ALACROIX]; -static patch_t *t4kndh[TTMAX_ALACROIX]; - -static patch_t *t6ribb[TTMAX_ALACROIX]; -static patch_t *t6sont[TTMAX_ALACROIX]; -static patch_t *t6robo[TTMAX_ALACROIX]; -static patch_t *t6twot[TTMAX_ALACROIX]; -static patch_t *t6embl[TTMAX_ALACROIX]; -static patch_t *t6rbtx[TTMAX_ALACROIX]; -static patch_t *t6soib[TTMAX_ALACROIX]; -static patch_t *t6soif[TTMAX_ALACROIX]; -static patch_t *t6soba[TTMAX_ALACROIX]; -static patch_t *t6sobk[TTMAX_ALACROIX]; -static patch_t *t6sodh[TTMAX_ALACROIX]; -static patch_t *t6taib[TTMAX_ALACROIX]; -static patch_t *t6taif[TTMAX_ALACROIX]; -static patch_t *t6taba[TTMAX_ALACROIX]; -static patch_t *t6tabk[TTMAX_ALACROIX]; -static patch_t *t6tabt[TTMAX_ALACROIX]; -static patch_t *t6taft[TTMAX_ALACROIX]; -static patch_t *t6knib[TTMAX_ALACROIX]; -static patch_t *t6knif[TTMAX_ALACROIX]; -static patch_t *t6knba[TTMAX_ALACROIX]; -static patch_t *t6knbk[TTMAX_ALACROIX]; -static patch_t *t6kndh[TTMAX_ALACROIX]; - -#define TTEMBL (presc == 6 ? t6embl : presc == 4 ? t4embl : presc == 2 ? t2embl : t1embl) -#define TTRIBB (presc == 6 ? t6ribb : presc == 4 ? t4ribb : presc == 2 ? t2ribb : t1ribb) -#define TTSONT (presc == 6 ? t6sont : presc == 4 ? t4sont : presc == 2 ? t2sont : t1sont) -#define TTROBO (presc == 6 ? t6robo : presc == 4 ? t4robo : presc == 2 ? t2robo : t1robo) -#define TTTWOT (presc == 6 ? t6twot : presc == 4 ? t4twot : presc == 2 ? t2twot : t1twot) -#define TTRBTX (presc == 6 ? t6rbtx : presc == 4 ? t4rbtx : presc == 2 ? t2rbtx : t1rbtx) -#define TTSOIB (presc == 6 ? t6soib : presc == 4 ? t4soib : presc == 2 ? t2soib : t1soib) -#define TTSOIF (presc == 6 ? t6soif : presc == 4 ? t4soif : presc == 2 ? t2soif : t1soif) -#define TTSOBA (presc == 6 ? t6soba : presc == 4 ? t4soba : presc == 2 ? t2soba : t1soba) -#define TTSOBK (presc == 6 ? t6sobk : presc == 4 ? t4sobk : presc == 2 ? t2sobk : t1sobk) -#define TTSODH (presc == 6 ? t6sodh : presc == 4 ? t4sodh : presc == 2 ? t2sodh : t1sodh) -#define TTTAIB (presc == 6 ? t6taib : presc == 4 ? t4taib : presc == 2 ? t2taib : t1taib) -#define TTTAIF (presc == 6 ? t6taif : presc == 4 ? t4taif : presc == 2 ? t2taif : t1taif) -#define TTTABA (presc == 6 ? t6taba : presc == 4 ? t4taba : presc == 2 ? t2taba : t1taba) -#define TTTABK (presc == 6 ? t6tabk : presc == 4 ? t4tabk : presc == 2 ? t2tabk : t1tabk) -#define TTTABT (presc == 6 ? t6tabt : presc == 4 ? t4tabt : presc == 2 ? t2tabt : t1tabt) -#define TTTAFT (presc == 6 ? t6taft : presc == 4 ? t4taft : presc == 2 ? t2taft : t1taft) -#define TTKNIB (presc == 6 ? t6knib : presc == 4 ? t4knib : presc == 2 ? t2knib : t1knib) -#define TTKNIF (presc == 6 ? t6knif : presc == 4 ? t4knif : presc == 2 ? t2knif : t1knif) -#define TTKNBA (presc == 6 ? t6knba : presc == 4 ? t4knba : presc == 2 ? t2knba : t1knba) -#define TTKNBK (presc == 6 ? t6knbk : presc == 4 ? t4knbk : presc == 2 ? t2knbk : t1knbk) -#define TTKNDH (presc == 6 ? t6kndh : presc == 4 ? t4kndh : presc == 2 ? t2kndh : t1kndh) +#define TTEMBL (ttembl[activettscale-1]) +#define TTRIBB (ttribb[activettscale-1]) +#define TTSONT (ttsont[activettscale-1]) +#define TTROBO (ttrobo[activettscale-1]) +#define TTTWOT (tttwot[activettscale-1]) +#define TTRBTX (ttrbtx[activettscale-1]) +#define TTSOIB (ttsoib[activettscale-1]) +#define TTSOIF (ttsoif[activettscale-1]) +#define TTSOBA (ttsoba[activettscale-1]) +#define TTSOBK (ttsobk[activettscale-1]) +#define TTSODH (ttsodh[activettscale-1]) +#define TTTAIB (tttaib[activettscale-1]) +#define TTTAIF (tttaif[activettscale-1]) +#define TTTABA (tttaba[activettscale-1]) +#define TTTABK (tttabk[activettscale-1]) +#define TTTABT (tttabt[activettscale-1]) +#define TTTAFT (tttaft[activettscale-1]) +#define TTKNIB (ttknib[activettscale-1]) +#define TTKNIF (ttknif[activettscale-1]) +#define TTKNBA (ttknba[activettscale-1]) +#define TTKNBK (ttknbk[activettscale-1]) +#define TTKNDH (ttkndh[activettscale-1]) static boolean sonic_blink = false; static boolean sonic_blink_twice = false; @@ -2338,6 +2274,32 @@ void F_SkyScroll(INT32 scrollxspeed, INT32 scrollyspeed, const char *patchname) W_UnlockCachedPatch(pat); } +#define LOADTTGFX(arr, name, maxf) \ +lumpnum = W_CheckNumForName(name); \ +if (lumpnum != LUMPERROR) \ +{ \ + arr[0] = W_CachePatchName(name, PU_LEVEL); \ + arr[min(1, maxf-1)] = 0; \ +} \ +else if (strlen(name) <= 6) \ +{ \ + fixed_t cnt = strlen(name); \ + strncpy(lumpname, name, 7); \ + for (i = 0; i < maxf-1; i++) \ + { \ + sprintf(&lumpname[cnt], "%.2hu", (UINT16)(i+1)); \ + lumpname[8] = 0; \ + lumpnum = W_CheckNumForName(lumpname); \ + if (lumpnum != LUMPERROR) \ + arr[i] = W_CachePatchName(lumpname, PU_LEVEL); \ + else \ + break; \ + } \ + arr[min(i, maxf-1)] = 0; \ +} \ +else \ + arr[0] = 0; + void F_StartTitleScreen(void) { if (menupres[MN_MAIN].musname[0]) @@ -2348,6 +2310,8 @@ void F_StartTitleScreen(void) if (gamestate != GS_TITLESCREEN && gamestate != GS_WAITINGPLAYERS) { ttuser_count =\ + ttloaded[0] = ttloaded[1] = ttloaded[2] = ttloaded[3] = ttloaded[4] = ttloaded[5] =\ + testttscale = activettscale =\ sonic_blink = sonic_blink_twice = sonic_idle_start = sonic_idle_end =\ tails_blink = tails_blink_twice = tails_idle_start = tails_idle_end =\ knux_blink = knux_blink_twice = knux_idle_start = knux_idle_end = 0; @@ -2432,32 +2396,6 @@ void F_StartTitleScreen(void) demoDelayLeft = demoDelayTime; demoIdleLeft = demoIdleTime; -#define LOADTTGFX(arr, name, maxf) \ -lumpnum = W_CheckNumForName(name); \ -if (lumpnum != LUMPERROR) \ -{ \ - arr[0] = W_CachePatchName(name, PU_LEVEL); \ - arr[min(1, maxf-1)] = 0; \ -} \ -else if (strlen(name) <= 6) \ -{ \ - fixed_t cnt = strlen(name); \ - strncpy(lumpname, name, 7); \ - for (i = 0; i < maxf-1; i++) \ - { \ - sprintf(&lumpname[cnt], "%.2hu", (UINT16)(i+1)); \ - lumpname[8] = 0; \ - lumpnum = W_CheckNumForName(lumpname); \ - if (lumpnum != LUMPERROR) \ - arr[i] = W_CachePatchName(lumpname, PU_LEVEL); \ - else \ - break; \ - } \ - arr[min(i, maxf-1)] = 0; \ -} \ -else \ - arr[0] = 0; - switch(curttmode) { case TTMODE_OLD: @@ -2479,105 +2417,9 @@ else \ ttspop7 = W_CachePatchName("TTSPOP7", PU_LEVEL); break; + // don't load alacroix gfx yet; we do that upon first draw. case TTMODE_ALACROIX: - { - UINT16 i; - lumpnum_t lumpnum; - char lumpname[9]; - - LOADTTGFX(t1embl, "T1EMBL", TTMAX_ALACROIX) - LOADTTGFX(t1ribb, "T1RIBB", TTMAX_ALACROIX) - LOADTTGFX(t1sont, "T1SONT", TTMAX_ALACROIX) - LOADTTGFX(t1robo, "T1ROBO", TTMAX_ALACROIX) - LOADTTGFX(t1twot, "T1TWOT", TTMAX_ALACROIX) - LOADTTGFX(t1rbtx, "T1RBTX", TTMAX_ALACROIX) - LOADTTGFX(t1soib, "T1SOIB", TTMAX_ALACROIX) - LOADTTGFX(t1soif, "T1SOIF", TTMAX_ALACROIX) - LOADTTGFX(t1soba, "T1SOBA", TTMAX_ALACROIX) - LOADTTGFX(t1sobk, "T1SOBK", TTMAX_ALACROIX) - LOADTTGFX(t1sodh, "T1SODH", TTMAX_ALACROIX) - LOADTTGFX(t1taib, "T1TAIB", TTMAX_ALACROIX) - LOADTTGFX(t1taif, "T1TAIF", TTMAX_ALACROIX) - LOADTTGFX(t1taba, "T1TABA", TTMAX_ALACROIX) - LOADTTGFX(t1tabk, "T1TABK", TTMAX_ALACROIX) - LOADTTGFX(t1tabt, "T1TABT", TTMAX_ALACROIX) - LOADTTGFX(t1taft, "T1TAFT", TTMAX_ALACROIX) - LOADTTGFX(t1knib, "T1KNIB", TTMAX_ALACROIX) - LOADTTGFX(t1knif, "T1KNIF", TTMAX_ALACROIX) - LOADTTGFX(t1knba, "T1KNBA", TTMAX_ALACROIX) - LOADTTGFX(t1knbk, "T1KNBK", TTMAX_ALACROIX) - LOADTTGFX(t1kndh, "T1KNDH", TTMAX_ALACROIX) - - LOADTTGFX(t2embl, "T2EMBL", TTMAX_ALACROIX) - LOADTTGFX(t2ribb, "T2RIBB", TTMAX_ALACROIX) - LOADTTGFX(t2sont, "T2SONT", TTMAX_ALACROIX) - LOADTTGFX(t2robo, "T2ROBO", TTMAX_ALACROIX) - LOADTTGFX(t2twot, "T2TWOT", TTMAX_ALACROIX) - LOADTTGFX(t2rbtx, "T2RBTX", TTMAX_ALACROIX) - LOADTTGFX(t2soib, "T2SOIB", TTMAX_ALACROIX) - LOADTTGFX(t2soif, "T2SOIF", TTMAX_ALACROIX) - LOADTTGFX(t2soba, "T2SOBA", TTMAX_ALACROIX) - LOADTTGFX(t2sobk, "T2SOBK", TTMAX_ALACROIX) - LOADTTGFX(t2sodh, "T2SODH", TTMAX_ALACROIX) - LOADTTGFX(t2taib, "T2TAIB", TTMAX_ALACROIX) - LOADTTGFX(t2taif, "T2TAIF", TTMAX_ALACROIX) - LOADTTGFX(t2taba, "T2TABA", TTMAX_ALACROIX) - LOADTTGFX(t2tabk, "T2TABK", TTMAX_ALACROIX) - LOADTTGFX(t2tabt, "T2TABT", TTMAX_ALACROIX) - LOADTTGFX(t2taft, "T2TAFT", TTMAX_ALACROIX) - LOADTTGFX(t2knib, "T2KNIB", TTMAX_ALACROIX) - LOADTTGFX(t2knif, "T2KNIF", TTMAX_ALACROIX) - LOADTTGFX(t2knba, "T2KNBA", TTMAX_ALACROIX) - LOADTTGFX(t2knbk, "T2KNBK", TTMAX_ALACROIX) - LOADTTGFX(t2kndh, "T2KNDH", TTMAX_ALACROIX) - - LOADTTGFX(t4embl, "T4EMBL", TTMAX_ALACROIX) - LOADTTGFX(t4ribb, "T4RIBB", TTMAX_ALACROIX) - LOADTTGFX(t4sont, "T4SONT", TTMAX_ALACROIX) - LOADTTGFX(t4robo, "T4ROBO", TTMAX_ALACROIX) - LOADTTGFX(t4twot, "T4TWOT", TTMAX_ALACROIX) - LOADTTGFX(t4rbtx, "T4RBTX", TTMAX_ALACROIX) - LOADTTGFX(t4soib, "T4SOIB", TTMAX_ALACROIX) - LOADTTGFX(t4soif, "T4SOIF", TTMAX_ALACROIX) - LOADTTGFX(t4soba, "T4SOBA", TTMAX_ALACROIX) - LOADTTGFX(t4sobk, "T4SOBK", TTMAX_ALACROIX) - LOADTTGFX(t4sodh, "T4SODH", TTMAX_ALACROIX) - LOADTTGFX(t4taib, "T4TAIB", TTMAX_ALACROIX) - LOADTTGFX(t4taif, "T4TAIF", TTMAX_ALACROIX) - LOADTTGFX(t4taba, "T4TABA", TTMAX_ALACROIX) - LOADTTGFX(t4tabk, "T4TABK", TTMAX_ALACROIX) - LOADTTGFX(t4tabt, "T4TABT", TTMAX_ALACROIX) - LOADTTGFX(t4taft, "T4TAFT", TTMAX_ALACROIX) - LOADTTGFX(t4knib, "T4KNIB", TTMAX_ALACROIX) - LOADTTGFX(t4knif, "T4KNIF", TTMAX_ALACROIX) - LOADTTGFX(t4knba, "T4KNBA", TTMAX_ALACROIX) - LOADTTGFX(t4knbk, "T4KNBK", TTMAX_ALACROIX) - LOADTTGFX(t4kndh, "T4KNDH", TTMAX_ALACROIX) - - LOADTTGFX(t6embl, "T6EMBL", TTMAX_ALACROIX) - LOADTTGFX(t6ribb, "T6RIBB", TTMAX_ALACROIX) - LOADTTGFX(t6sont, "T6SONT", TTMAX_ALACROIX) - LOADTTGFX(t6robo, "T6ROBO", TTMAX_ALACROIX) - LOADTTGFX(t6twot, "T6TWOT", TTMAX_ALACROIX) - LOADTTGFX(t6rbtx, "T6RBTX", TTMAX_ALACROIX) - LOADTTGFX(t6soib, "T6SOIB", TTMAX_ALACROIX) - LOADTTGFX(t6soif, "T6SOIF", TTMAX_ALACROIX) - LOADTTGFX(t6soba, "T6SOBA", TTMAX_ALACROIX) - LOADTTGFX(t6sobk, "T6SOBK", TTMAX_ALACROIX) - LOADTTGFX(t6sodh, "T6SODH", TTMAX_ALACROIX) - LOADTTGFX(t6taib, "T6TAIB", TTMAX_ALACROIX) - LOADTTGFX(t6taif, "T6TAIF", TTMAX_ALACROIX) - LOADTTGFX(t6taba, "T6TABA", TTMAX_ALACROIX) - LOADTTGFX(t6tabk, "T6TABK", TTMAX_ALACROIX) - LOADTTGFX(t6tabt, "T6TABT", TTMAX_ALACROIX) - LOADTTGFX(t6taft, "T6TAFT", TTMAX_ALACROIX) - LOADTTGFX(t6knib, "T6KNIB", TTMAX_ALACROIX) - LOADTTGFX(t6knif, "T6KNIF", TTMAX_ALACROIX) - LOADTTGFX(t6knba, "T6KNBA", TTMAX_ALACROIX) - LOADTTGFX(t6knbk, "T6KNBK", TTMAX_ALACROIX) - LOADTTGFX(t6kndh, "T6KNDH", TTMAX_ALACROIX) break; - } case TTMODE_USER: { @@ -2589,17 +2431,148 @@ else \ break; } } +} + +static void F_UnloadAlacroixGraphics(SINT8 oldttscale) +{ + // This all gets freed by PU_LEVEL when exiting the menus. + // When re-visiting the menus (e.g., from exiting in-game), the gfx are force-reloaded. + // So leftover addresses here should not be a problem. + + UINT16 i; + oldttscale--; // zero-based index + for (i = 0; i < TTMAX_ALACROIX; i++) + { + if(ttembl[oldttscale][i]) { Z_Free(ttembl[oldttscale][i]); ttembl[oldttscale][i] = 0; } + if(ttribb[oldttscale][i]) { Z_Free(ttribb[oldttscale][i]); ttribb[oldttscale][i] = 0; } + if(ttsont[oldttscale][i]) { Z_Free(ttsont[oldttscale][i]); ttsont[oldttscale][i] = 0; } + if(ttrobo[oldttscale][i]) { Z_Free(ttrobo[oldttscale][i]); ttrobo[oldttscale][i] = 0; } + if(tttwot[oldttscale][i]) { Z_Free(tttwot[oldttscale][i]); tttwot[oldttscale][i] = 0; } + if(ttrbtx[oldttscale][i]) { Z_Free(ttrbtx[oldttscale][i]); ttrbtx[oldttscale][i] = 0; } + if(ttsoib[oldttscale][i]) { Z_Free(ttsoib[oldttscale][i]); ttsoib[oldttscale][i] = 0; } + if(ttsoif[oldttscale][i]) { Z_Free(ttsoif[oldttscale][i]); ttsoif[oldttscale][i] = 0; } + if(ttsoba[oldttscale][i]) { Z_Free(ttsoba[oldttscale][i]); ttsoba[oldttscale][i] = 0; } + if(ttsobk[oldttscale][i]) { Z_Free(ttsobk[oldttscale][i]); ttsobk[oldttscale][i] = 0; } + if(ttsodh[oldttscale][i]) { Z_Free(ttsodh[oldttscale][i]); ttsodh[oldttscale][i] = 0; } + if(tttaib[oldttscale][i]) { Z_Free(tttaib[oldttscale][i]); tttaib[oldttscale][i] = 0; } + if(tttaif[oldttscale][i]) { Z_Free(tttaif[oldttscale][i]); tttaif[oldttscale][i] = 0; } + if(tttaba[oldttscale][i]) { Z_Free(tttaba[oldttscale][i]); tttaba[oldttscale][i] = 0; } + if(tttabk[oldttscale][i]) { Z_Free(tttabk[oldttscale][i]); tttabk[oldttscale][i] = 0; } + if(tttabt[oldttscale][i]) { Z_Free(tttabt[oldttscale][i]); tttabt[oldttscale][i] = 0; } + if(tttaft[oldttscale][i]) { Z_Free(tttaft[oldttscale][i]); tttaft[oldttscale][i] = 0; } + if(ttknib[oldttscale][i]) { Z_Free(ttknib[oldttscale][i]); ttknib[oldttscale][i] = 0; } + if(ttknif[oldttscale][i]) { Z_Free(ttknif[oldttscale][i]); ttknif[oldttscale][i] = 0; } + if(ttknba[oldttscale][i]) { Z_Free(ttknba[oldttscale][i]); ttknba[oldttscale][i] = 0; } + if(ttknbk[oldttscale][i]) { Z_Free(ttknbk[oldttscale][i]); ttknbk[oldttscale][i] = 0; } + if(ttkndh[oldttscale][i]) { Z_Free(ttkndh[oldttscale][i]); ttkndh[oldttscale][i] = 0; } + } + ttloaded[oldttscale] = false; +} + +static void F_LoadAlacroixGraphics(SINT8 newttscale) +{ + UINT16 i, j; + lumpnum_t lumpnum; + char lumpname[9]; + char names[22][5] = { + "EMBL", + "RIBB", + "SONT", + "ROBO", + "TWOT", + "RBTX", + "SOIB", + "SOIF", + "SOBA", + "SOBK", + "SODH", + "TAIB", + "TAIF", + "TABA", + "TABK", + "TABT", + "TAFT", + "KNIB", + "KNIF", + "KNBA", + "KNBK", + "KNDH" + }; + char lumpnames[22][7]; + + newttscale--; // 0-based index + + if (!ttloaded[newttscale]) + { + for (j = 0; j < 22; j++) + sprintf(&lumpnames[j][0], "T%.1hu%s", (UINT8)newttscale+1, names[j]); + + LOADTTGFX(ttembl[newttscale], lumpnames[0], TTMAX_ALACROIX) + LOADTTGFX(ttribb[newttscale], lumpnames[1], TTMAX_ALACROIX) + LOADTTGFX(ttsont[newttscale], lumpnames[2], TTMAX_ALACROIX) + LOADTTGFX(ttrobo[newttscale], lumpnames[3], TTMAX_ALACROIX) + LOADTTGFX(tttwot[newttscale], lumpnames[4], TTMAX_ALACROIX) + LOADTTGFX(ttrbtx[newttscale], lumpnames[5], TTMAX_ALACROIX) + LOADTTGFX(ttsoib[newttscale], lumpnames[6], TTMAX_ALACROIX) + LOADTTGFX(ttsoif[newttscale], lumpnames[7], TTMAX_ALACROIX) + LOADTTGFX(ttsoba[newttscale], lumpnames[8], TTMAX_ALACROIX) + LOADTTGFX(ttsobk[newttscale], lumpnames[9], TTMAX_ALACROIX) + LOADTTGFX(ttsodh[newttscale], lumpnames[10], TTMAX_ALACROIX) + LOADTTGFX(tttaib[newttscale], lumpnames[11], TTMAX_ALACROIX) + LOADTTGFX(tttaif[newttscale], lumpnames[12], TTMAX_ALACROIX) + LOADTTGFX(tttaba[newttscale], lumpnames[13], TTMAX_ALACROIX) + LOADTTGFX(tttabk[newttscale], lumpnames[14], TTMAX_ALACROIX) + LOADTTGFX(tttabt[newttscale], lumpnames[15], TTMAX_ALACROIX) + LOADTTGFX(tttaft[newttscale], lumpnames[16], TTMAX_ALACROIX) + LOADTTGFX(ttknib[newttscale], lumpnames[17], TTMAX_ALACROIX) + LOADTTGFX(ttknif[newttscale], lumpnames[18], TTMAX_ALACROIX) + LOADTTGFX(ttknba[newttscale], lumpnames[19], TTMAX_ALACROIX) + LOADTTGFX(ttknbk[newttscale], lumpnames[20], TTMAX_ALACROIX) + LOADTTGFX(ttkndh[newttscale], lumpnames[21], TTMAX_ALACROIX) + + ttloaded[newttscale] = true; + } +} #undef LOADTTGFX + +static void F_FigureActiveTtScale(void) +{ + SINT8 newttscale = max(1, min(6, vid.dupx)); + SINT8 oldttscale = activettscale; + + if (newttscale == testttscale) + return; + testttscale = newttscale; + + // If ttscale is unavailable: look for lower scales, then higher scales. + for (; newttscale >= 1; newttscale--) + { + if (ttavailable[newttscale-1]) + break; + } + + for (; newttscale <= 6; newttscale++) + { + if (ttavailable[newttscale-1]) + break; + } + + activettscale = (newttscale >= 1 && newttscale <= 6) ? newttscale : 0; + + // We have a new ttscale, so load gfx + if(oldttscale > 0) + F_UnloadAlacroixGraphics(oldttscale); + + if(activettscale > 0) + F_LoadAlacroixGraphics(activettscale); } // (no longer) De-Demo'd Title Screen void F_TitleScreenDrawer(void) { boolean hidepics; - fixed_t presc = max(1, min(6, (vid.dupx == 5 ? 6 : (vid.dupx == 3 ? 4 : vid.dupx)))); - fixed_t sc = (curttmode == TTMODE_ALACROIX ? FRACUNIT / presc - : FRACUNIT / max(1, curttscale)); + fixed_t sc = FRACUNIT / max(1, curttscale); if (modeattacking) return; // We likely came here from retrying. Don't do a damn thing. @@ -2670,6 +2643,13 @@ void F_TitleScreenDrawer(void) // PRE-INTRO: WING ON BLACK BACKGROUND // + // Figure the gfx scale and load gfx if necessary + F_FigureActiveTtScale(); + + if (!activettscale) // invalid scale, draw nothing + break; + sc = FRACUNIT / activettscale; + // Start at black background. Draw it until tic 30, where we replace with a white flash. // // TODO: How to NOT draw the titlemap while this background is drawn? diff --git a/src/f_finale.h b/src/f_finale.h index 0a599fa2d..5d01880c4 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -96,6 +96,8 @@ extern INT16 ttx; extern INT16 tty; extern INT16 ttloop; extern UINT16 tttics; +extern boolean ttavailable[6]; + typedef enum { From cb6bc67944be5f6228b8b9e1e97d6d491bb44d82 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sun, 3 Nov 2019 18:36:48 -0500 Subject: [PATCH 20/50] Alacroix title: Give Tails his back tails --- src/f_finale.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index 354bd6fef..db443c70c 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -2808,29 +2808,29 @@ void F_TitleScreenDrawer(void) // SINT8 taftcount = (finalecount - (TAILSIDLE)) % 41; if (taftcount >= 0 && taftcount < 5 ) - V_DrawSciencePatch(TAILSX<= 5 && taftcount < 9 ) - V_DrawSciencePatch(TAILSX<= 9 && taftcount < 12 ) - V_DrawSciencePatch(TAILSX<= 12 && taftcount < 14 ) - V_DrawSciencePatch(TAILSX<= 14 && taftcount < 17 ) - V_DrawSciencePatch(TAILSX<= 17 && taftcount < 21 ) - V_DrawSciencePatch(TAILSX<= 21 && taftcount < 24 ) - V_DrawSciencePatch(TAILSX<= 24 && taftcount < 25 ) - V_DrawSciencePatch(TAILSX<= 25 && taftcount < 28 ) - V_DrawSciencePatch(TAILSX<= 28 && taftcount < 31 ) - V_DrawSciencePatch(TAILSX<= 31 && taftcount < 35 ) - V_DrawSciencePatch(TAILSX<= 35 && taftcount < 41 ) - V_DrawSciencePatch(TAILSX< Date: Sun, 3 Nov 2019 19:53:05 -0500 Subject: [PATCH 21/50] Frame 4 typos --- src/f_finale.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index db443c70c..dc8d453b6 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -2816,7 +2816,7 @@ void F_TitleScreenDrawer(void) else if (taftcount >= 12 && taftcount < 14 ) V_DrawSciencePatch(TAILSX<= 14 && taftcount < 17 ) - V_DrawSciencePatch(TAILSX<= 17 && taftcount < 21 ) V_DrawSciencePatch(TAILSX<= 21 && taftcount < 24 ) @@ -2855,7 +2855,7 @@ void F_TitleScreenDrawer(void) else if (tabtcount >= 15 && tabtcount < 18 ) V_DrawSciencePatch(TAILSX<= 18 && tabtcount < 19 ) - V_DrawSciencePatch(TAILSX<= 19 && tabtcount < 22 ) V_DrawSciencePatch(TAILSX<= 22 && tabtcount < 27 ) @@ -2893,7 +2893,7 @@ void F_TitleScreenDrawer(void) else if (finalecount >= KNUXSTART+13 && finalecount < KNUXSTART+15 ) V_DrawSciencePatch(KNUXX<= KNUXSTART+15 && finalecount < KNUXSTART+18 ) - V_DrawSciencePatch(KNUXX<= KNUXSTART+18 && finalecount < KNUXSTART+22 ) V_DrawSciencePatch(KNUXX<= KNUXSTART+22 && finalecount < KNUXSTART+28 ) @@ -2972,7 +2972,7 @@ void F_TitleScreenDrawer(void) else if (finalecount >= TAILSSTART+12 && finalecount < TAILSSTART+16 ) V_DrawSciencePatch(TAILSX<= TAILSSTART+16 && finalecount < TAILSSTART+22 ) - V_DrawSciencePatch(TAILSX<= TAILSSTART+22 && finalecount < TAILSSTART+23 ) V_DrawSciencePatch(TAILSX<= TAILSSTART+23 && finalecount < TAILSSTART+26 ) @@ -3045,7 +3045,7 @@ void F_TitleScreenDrawer(void) else if (finalecount >= SONICSTART+14 && finalecount < SONICSTART+18 ) V_DrawSciencePatch(SONICX<= SONICSTART+18 && finalecount < SONICSTART+19 ) - V_DrawSciencePatch(SONICX<= SONICSTART+19 && finalecount < SONICSTART+27 ) V_DrawSciencePatch(SONICX<= SONICSTART+27 && finalecount < SONICSTART+31 ) From 16c107e2ac3ac3590bbf2b5822bb425dd27f6cc5 Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Sun, 3 Nov 2019 21:43:09 -0500 Subject: [PATCH 22/50] Fix garbage string being drawn on record attack menu Pretty silly of me to assume it would be NUL-terminated by default. --- src/m_menu.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/m_menu.c b/src/m_menu.c index 8fe782cac..e736cc6f7 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -8723,6 +8723,10 @@ void M_DrawTimeAttackMenu(void) char beststr[40]; char reqscore[40], reqtime[40], reqrings[40]; + strcpy(reqscore, "\0"); + strcpy(reqtime, "\0"); + strcpy(reqrings, "\0"); + M_DrawLevelPlatterHeader(32-lsheadingheight/2, cv_nextmap.string, true, false); // A 160x100 image of the level as entry MAPxxP From 43fff92c82e5050d36f1da4bba24709c23e1cc24 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 4 Nov 2019 02:43:48 -0500 Subject: [PATCH 23/50] Alacroix: Fix our heroes' arms disappearing due to dropped frames --- src/f_finale.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index dc8d453b6..8847f2924 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -2727,7 +2727,7 @@ void F_TitleScreenDrawer(void) if (finalecount >= KNUXIDLE) { - if (!knux_idle_start || !((finalecount - knux_idle_start) % knux_idle_end)) + if (!knux_idle_start || finalecount - knux_idle_start >= knux_idle_end) { if (knux_blink) { @@ -2750,7 +2750,7 @@ void F_TitleScreenDrawer(void) if (finalecount >= TAILSIDLE) { - if (!tails_idle_start || !((finalecount - tails_idle_start) % tails_idle_end)) + if (!tails_idle_start || finalecount - tails_idle_start >= tails_idle_end) { if (tails_blink) { @@ -2769,12 +2769,12 @@ void F_TitleScreenDrawer(void) // Tails does not actually have a non-blink idle cycle, but make up a number // so he can still blink. - tails_idle_end = tails_blink ? (tails_blink_twice ? 17 : 7) : 35; + tails_idle_end = tails_blink ? (tails_blink_twice ? 17 : 7) : 30; } if (finalecount >= SONICIDLE) { - if (!sonic_idle_start || !((finalecount - sonic_idle_start) % sonic_idle_end)) + if (!sonic_idle_start || finalecount - sonic_idle_start >= sonic_idle_end) { if (sonic_blink) { From 5e03d40b3320bcf66d3333ec52cd24f232b33d12 Mon Sep 17 00:00:00 2001 From: lachwright Date: Mon, 4 Nov 2019 16:28:44 +0800 Subject: [PATCH 24/50] New end-of-level signpost logic --- src/dehacked.c | 61 +++------------- src/info.c | 74 ++++--------------- src/info.h | 61 +++------------- src/p_enemy.c | 188 ++++++++++++++++++++++++++++++++++++++++--------- src/p_mobj.c | 7 +- src/p_spec.c | 6 +- 6 files changed, 193 insertions(+), 204 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 34ee1f170..2b3194f1c 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -2308,6 +2308,7 @@ static actionpointer_t actionpointers[] = {{A_ThrownRing}, "A_THROWNRING"}, {{A_SetSolidSteam}, "A_SETSOLIDSTEAM"}, {{A_UnsetSolidSteam}, "A_UNSETSOLIDSTEAM"}, + {{A_SignSpin}, "S_SIGNSPIN"}, {{A_SignPlayer}, "A_SIGNPLAYER"}, {{A_OverlayThink}, "A_OVERLAYTHINK"}, {{A_JetChase}, "A_JETCHASE"}, @@ -5385,59 +5386,13 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_BUBBLES4", // Level End Sign - "S_SIGN1", - "S_SIGN2", - "S_SIGN3", - "S_SIGN4", - "S_SIGN5", - "S_SIGN6", - "S_SIGN7", - "S_SIGN8", - "S_SIGN9", - "S_SIGN10", - "S_SIGN11", - "S_SIGN12", - "S_SIGN13", - "S_SIGN14", - "S_SIGN15", - "S_SIGN16", - "S_SIGN17", - "S_SIGN18", - "S_SIGN19", - "S_SIGN20", - "S_SIGN21", - "S_SIGN22", - "S_SIGN23", - "S_SIGN24", - "S_SIGN25", - "S_SIGN26", - "S_SIGN27", - "S_SIGN28", - "S_SIGN29", - "S_SIGN30", - "S_SIGN31", - "S_SIGN32", - "S_SIGN33", - "S_SIGN34", - "S_SIGN35", - "S_SIGN36", - "S_SIGN37", - "S_SIGN38", - "S_SIGN39", - "S_SIGN40", - "S_SIGN41", - "S_SIGN42", - "S_SIGN43", - "S_SIGN44", - "S_SIGN45", - "S_SIGN46", - "S_SIGN47", - "S_SIGN48", - "S_SIGN49", - "S_SIGN50", - "S_SIGN51", - "S_SIGN52", // Eggman - "S_SIGN53", + "S_SIGN", + "S_SIGNSPIN", + "S_SIGNSPINLOOP", + "S_SIGNROULETTE", + "S_SIGNPLAYER", + "S_SIGNBOARD", + "S_EGGMANSIGN", // Spike Ball "S_SPIKEBALL1", diff --git a/src/info.c b/src/info.c index cfaad552d..23048e49c 100644 --- a/src/info.c +++ b/src/info.c @@ -808,7 +808,7 @@ state_t states[NUMSTATES] = {SPR_PLAY, SPR2_LIFE, 20, {NULL}, 0, 4, S_NULL}, // S_PLAY_ICON3 // Level end sign (uses player sprite) - {SPR_PLAY, SPR2_SIGN, 1, {NULL}, 0, 24, S_PLAY_SIGN}, // S_PLAY_SIGN + {SPR_PLAY, SPR2_SIGN|FF_PAPERSPRITE, -1, {NULL}, 0, 29, S_PLAY_SIGN}, // S_PLAY_SIGN // NiGHTS Player, transforming {SPR_PLAY, SPR2_TRNS|FF_ANIMATE, 7, {NULL}, 0, 4, S_PLAY_NIGHTS_TRANS2}, // S_PLAY_NIGHTS_TRANS1 @@ -1925,59 +1925,13 @@ state_t states[NUMSTATES] = {SPR_BBLS, 3, 8, {A_BubbleCheck}, 0, 0, S_BUBBLES1}, // S_BUBBLES4 // Level End Sign - {SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN2}, // S_SIGN1 - {SPR_SIGN, 1, 1, {NULL}, 0, 0, S_SIGN3}, // S_SIGN2 - {SPR_SIGN, 2, 1, {NULL}, 0, 0, S_SIGN4}, // S_SIGN3 - {SPR_SIGN, 5, 1, {NULL}, 0, 0, S_SIGN5}, // S_SIGN4 - {SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN6}, // S_SIGN5 - {SPR_SIGN, 1, 1, {NULL}, 0, 0, S_SIGN7}, // S_SIGN6 - {SPR_SIGN, 2, 1, {NULL}, 0, 0, S_SIGN8}, // S_SIGN7 - {SPR_SIGN, 3, 1, {NULL}, 0, 0, S_SIGN9}, // S_SIGN8 - {SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN10}, // S_SIGN9 - {SPR_SIGN, 1, 1, {NULL}, 0, 0, S_SIGN11}, // S_SIGN10 - {SPR_SIGN, 2, 1, {NULL}, 0, 0, S_SIGN12}, // S_SIGN11 - {SPR_SIGN, 4, 1, {NULL}, 0, 0, S_SIGN13}, // S_SIGN12 - {SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN14}, // S_SIGN13 - {SPR_SIGN, 1, 1, {NULL}, 0, 0, S_SIGN15}, // S_SIGN14 - {SPR_SIGN, 2, 1, {NULL}, 0, 0, S_SIGN16}, // S_SIGN15 - {SPR_SIGN, 3, 1, {NULL}, 0, 0, S_SIGN17}, // S_SIGN16 - {SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN18}, // S_SIGN17 - {SPR_SIGN, 1, 1, {NULL}, 0, 0, S_SIGN19}, // S_SIGN18 - {SPR_SIGN, 2, 1, {NULL}, 0, 0, S_SIGN20}, // S_SIGN19 - {SPR_SIGN, 6, 1, {NULL}, 0, 0, S_SIGN21}, // S_SIGN20 - {SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN22}, // S_SIGN21 - {SPR_SIGN, 1, 1, {NULL}, 0, 0, S_SIGN23}, // S_SIGN22 - {SPR_SIGN, 2, 1, {NULL}, 0, 0, S_SIGN24}, // S_SIGN23 - {SPR_SIGN, 3, 1, {NULL}, 0, 0, S_SIGN25}, // S_SIGN24 - {SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN26}, // S_SIGN25 - {SPR_SIGN, 1, 1, {NULL}, 0, 0, S_SIGN27}, // S_SIGN26 - {SPR_SIGN, 2, 1, {NULL}, 0, 0, S_SIGN28}, // S_SIGN27 - {SPR_SIGN, 5, 1, {NULL}, 0, 0, S_SIGN29}, // S_SIGN28 - {SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN30}, // S_SIGN29 - {SPR_SIGN, 1, 1, {NULL}, 0, 0, S_SIGN31}, // S_SIGN30 - {SPR_SIGN, 2, 1, {NULL}, 0, 0, S_SIGN32}, // S_SIGN31 - {SPR_SIGN, 3, 1, {NULL}, 0, 0, S_SIGN33}, // S_SIGN32 - {SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN34}, // S_SIGN33 - {SPR_SIGN, 1, 1, {NULL}, 0, 0, S_SIGN35}, // S_SIGN34 - {SPR_SIGN, 2, 1, {NULL}, 0, 0, S_SIGN36}, // S_SIGN35 - {SPR_SIGN, 4, 1, {NULL}, 0, 0, S_SIGN37}, // S_SIGN36 - {SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN38}, // S_SIGN37 - {SPR_SIGN, 1, 1, {NULL}, 0, 0, S_SIGN39}, // S_SIGN38 - {SPR_SIGN, 2, 1, {NULL}, 0, 0, S_SIGN40}, // S_SIGN39 - {SPR_SIGN, 3, 1, {NULL}, 0, 0, S_SIGN41}, // S_SIGN40 - {SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN42}, // S_SIGN41 - {SPR_SIGN, 1, 1, {NULL}, 0, 0, S_SIGN43}, // S_SIGN42 - {SPR_SIGN, 2, 1, {NULL}, 0, 0, S_SIGN44}, // S_SIGN43 - {SPR_SIGN, 6, 1, {NULL}, 0, 0, S_SIGN45}, // S_SIGN44 - {SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN46}, // S_SIGN45 - {SPR_SIGN, 1, 1, {NULL}, 0, 0, S_SIGN47}, // S_SIGN46 - {SPR_SIGN, 2, 1, {NULL}, 0, 0, S_SIGN48}, // S_SIGN47 - {SPR_SIGN, 3, 1, {NULL}, 0, 0, S_SIGN49}, // S_SIGN48 - {SPR_SIGN, 0, 1, {NULL}, 0, 0, S_SIGN50}, // S_SIGN49 - {SPR_SIGN, 1, 1, {NULL}, 0, 0, S_SIGN51}, // S_SIGN50 - {SPR_SIGN, 2, 1, {NULL}, 0, 0, S_SIGN53}, // S_SIGN51 - {SPR_SIGN, 3, -1, {NULL}, 0, 0, S_NULL}, // S_SIGN52 Eggman - {SPR_SIGN, 7, -1, {A_SignPlayer}, 0, 0, S_NULL}, // S_SIGN53 Blank + {SPR_SIGN, 0, -1, {A_SignPlayer}, -3, 0, S_NULL}, // S_SIGN + {SPR_SIGN, 0, 1, {A_SignSpin}, 30, S_SIGNPLAYER, S_SIGNSPINLOOP}, // S_SIGNSPIN + {SPR_SIGN, 0, 0, {A_Repeat}, 4, S_SIGNSPIN, S_SIGNROULETTE}, // S_SIGNSPINLOOP + {SPR_SIGN, 0, 0, {A_SignPlayer}, -2, 0, S_SIGNSPIN}, // S_SIGNROULETTE + {SPR_SIGN, 0, -1, {A_SignPlayer}, -1, 0, S_NULL}, // S_SIGNPLAYER + {SPR_SIGN, FF_PAPERSPRITE|2, -1, {NULL}, 0, 0, S_NULL}, // S_SIGNBOARD + {SPR_SIGN, FF_PAPERSPRITE|1, -1, {NULL}, 0, 29, S_NULL}, // S_EGGMANSIGN // Spike Ball {SPR_SPIK, 0, 1, {NULL}, 0, 0, S_SPIKEBALL2}, // S_SPIKEBALL1 @@ -7832,29 +7786,29 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { // MT_SIGN 501, // doomednum - S_SIGN52, // spawnstate + S_SIGN, // spawnstate 1000, // spawnhealth S_PLAY_SIGN, // seestate sfx_lvpass, // seesound 8, // reactiontime sfx_None, // attacksound S_NULL, // painstate - 0, // painchance + MT_SPARK, // painchance sfx_None, // painsound - S_NULL, // meleestate + S_EGGMANSIGN, // meleestate S_NULL, // missilestate S_NULL, // deathstate S_NULL, // xdeathstate sfx_None, // deathsound 8, // speed - 8*FRACUNIT, // radius + 32*FRACUNIT, // radius 32*FRACUNIT, // height 0, // display offset 16, // mass 0, // damage sfx_None, // activesound - MF_NOCLIP|MF_SCENERY, // flags - S_NULL // raisestate + MF_NOCLIP|MF_SCENERY|MF_BOUNCE|MF_RUNSPAWNFUNC, // flags + S_SIGNBOARD // raisestate }, { // MT_SPIKEBALL diff --git a/src/info.h b/src/info.h index e7f41f585..c23d05ebc 100644 --- a/src/info.h +++ b/src/info.h @@ -63,6 +63,7 @@ void A_FishJump(); // Fish Jump void A_ThrownRing(); // Sparkle trail for red ring void A_SetSolidSteam(); void A_UnsetSolidSteam(); +void A_SignSpin(); void A_SignPlayer(); void A_OverlayThink(); void A_JetChase(); @@ -2058,59 +2059,13 @@ typedef enum state S_BUBBLES4, // Level End Sign - S_SIGN1, - S_SIGN2, - S_SIGN3, - S_SIGN4, - S_SIGN5, - S_SIGN6, - S_SIGN7, - S_SIGN8, - S_SIGN9, - S_SIGN10, - S_SIGN11, - S_SIGN12, - S_SIGN13, - S_SIGN14, - S_SIGN15, - S_SIGN16, - S_SIGN17, - S_SIGN18, - S_SIGN19, - S_SIGN20, - S_SIGN21, - S_SIGN22, - S_SIGN23, - S_SIGN24, - S_SIGN25, - S_SIGN26, - S_SIGN27, - S_SIGN28, - S_SIGN29, - S_SIGN30, - S_SIGN31, - S_SIGN32, - S_SIGN33, - S_SIGN34, - S_SIGN35, - S_SIGN36, - S_SIGN37, - S_SIGN38, - S_SIGN39, - S_SIGN40, - S_SIGN41, - S_SIGN42, - S_SIGN43, - S_SIGN44, - S_SIGN45, - S_SIGN46, - S_SIGN47, - S_SIGN48, - S_SIGN49, - S_SIGN50, - S_SIGN51, - S_SIGN52, // Eggman - S_SIGN53, + S_SIGN, + S_SIGNSPIN, + S_SIGNSPINLOOP, + S_SIGNROULETTE, + S_SIGNPLAYER, + S_SIGNBOARD, + S_EGGMANSIGN, // Spike Ball S_SPIKEBALL1, diff --git a/src/p_enemy.c b/src/p_enemy.c index cc2d64e8b..a6860e823 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -129,6 +129,7 @@ void A_FishJump(mobj_t *actor); void A_ThrownRing(mobj_t *actor); void A_SetSolidSteam(mobj_t *actor); void A_UnsetSolidSteam(mobj_t *actor); +void A_SignSpin(mobj_t *actor); void A_SignPlayer(mobj_t *actor); void A_OverlayThink(mobj_t *actor); void A_JetChase(mobj_t *actor); @@ -5006,59 +5007,176 @@ void A_UnsetSolidSteam(mobj_t *actor) actor->flags |= MF_NOCLIP; } +// Function: A_SignSpin +// +// Description: Spins a signpost until it hits the ground and reaches its mapthing's angle. +// +// var1 = degrees to rotate object +// var2 = state to set object to once spinning stops +// +void A_SignSpin(mobj_t *actor) +{ +#ifdef HAVE_BLUA + if (LUA_CallAction("A_SignSpin", actor)) + return; +#endif + INT32 locvar1 = var1; + INT32 locvar2 = var2; + INT16 i; + angle_t rotateangle = FixedAngle(locvar1 << FRACBITS); + + if (P_IsObjectOnGround(actor) && P_MobjFlip(actor) * actor->momz <= 0) + { + if (actor->spawnpoint) + { + angle_t mapangle = FixedAngle(actor->spawnpoint->angle << FRACBITS); + angle_t diff = mapangle - actor->angle; + if (diff < rotateangle) + { + actor->angle = mapangle; + P_SetMobjState(actor, locvar2); + return; + } + } + else // no mapthing? just finish in your current angle + { + P_SetMobjState(actor, locvar2); + return; + } + } + actor->angle += rotateangle; + if (leveltime & 1 || actor->tracer == NULL) return; + for (i = -1; i < 2; i += 2) + { + P_SpawnMobjFromMobj(actor, + P_ReturnThrustX(actor, actor->tracer->angle, i * actor->radius), + P_ReturnThrustY(actor, actor->tracer->angle, i * actor->radius), + (actor->eflags & MFE_VERTICALFLIP) ? 0 : actor->height, + actor->info->painchance); + } +} + // Function: A_SignPlayer // // Description: Changes the state of a level end sign to reflect the player that hit it. +// Also used to display Eggman or the skin roulette whilst spinning. // -// var1 = unused +// var1 = number of skin to display (e.g. 2 = Knuckles; special cases: -1 = target's skin, -2 = skin roulette, -3 = Eggman) // var2 = unused // void A_SignPlayer(mobj_t *actor) { + INT32 locvar1 = var1; + INT32 locvar2 = var2; + skin_t *skin = NULL; mobj_t *ov; - skin_t *skin; + UINT8 facecolor, signcolor; + UINT32 signframe = states[actor->info->raisestate].frame; + #ifdef HAVE_BLUA if (LUA_CallAction("A_SignPlayer", actor)) return; #endif - if (!actor->target) + + if (actor->tracer == NULL || locvar1 < -3 || locvar1 >= numskins) return; - if (!actor->target->player) - return; - - skin = &skins[actor->target->player->skin]; - - if ((actor->target->player->skincolor == skin->prefcolor) && (skin->prefoppositecolor)) // Set it as the skin's preferred oppositecolor? + // if no face overlay, spawn one + if (actor->tracer->tracer == NULL || P_MobjWasRemoved(actor->tracer->tracer)) { - actor->color = skin->prefoppositecolor; - /* - If you're here from the comment above Color_Opposite, - the following line is the one which is dependent on the - array being symmetrical. It gets the opposite of the - opposite of your desired colour just so it can get the - brightness frame for the End Sign. It's not a great - design choice, but it's constant time array access and - the idea that the colours should be OPPOSITES is kind - of in the name. If you have a better idea, feel free - to let me know. ~toast 2016/07/20 - */ - actor->frame += (15 - Color_Opposite[Color_Opposite[skin->prefoppositecolor - 1][0] - 1][1]); - } - else if (actor->target->player->skincolor) // Set the sign to be an appropriate background color for this player's skincolor. - { - actor->color = Color_Opposite[actor->target->player->skincolor - 1][0]; - actor->frame += (15 - Color_Opposite[actor->target->player->skincolor - 1][1]); - } - - if (skin->sprites[SPR2_SIGN].numframes) - { - // spawn an overlay of the player's face. ov = P_SpawnMobj(actor->x, actor->y, actor->z, MT_OVERLAY); - P_SetTarget(&ov->target, actor); - ov->color = actor->target->player->skincolor; + P_SetTarget(&ov->target, actor->tracer); + P_SetTarget(&actor->tracer->tracer, ov); + } + else + ov = actor->tracer->tracer; + + if (locvar1 == -1) // set to target's skin + { + if (!actor->target) + return; + + if (!actor->target->player) + return; + + skin = &skins[actor->target->player->skin]; + facecolor = actor->target->player->skincolor; + + if ((actor->target->player->skincolor == skin->prefcolor) && (skin->prefoppositecolor)) // Set it as the skin's preferred oppositecolor? + { + signcolor = skin->prefoppositecolor; + /* + If you're here from the comment above Color_Opposite, + the following line is the one which is dependent on the + array being symmetrical. It gets the opposite of the + opposite of your desired colour just so it can get the + brightness frame for the End Sign. It's not a great + design choice, but it's constant time array access and + the idea that the colours should be OPPOSITES is kind + of in the name. If you have a better idea, feel free + to let me know. ~toast 2016/07/20 + */ + signframe += (15 - Color_Opposite[Color_Opposite[skin->prefoppositecolor - 1][0] - 1][1]); + } + else if (actor->target->player->skincolor) // Set the sign to be an appropriate background color for this player's skincolor. + { + signcolor = Color_Opposite[actor->target->player->skincolor - 1][0]; + signframe += (15 - Color_Opposite[actor->target->player->skincolor - 1][1]); + } + } + else if (locvar1 != -3) // set to a defined skin + { + // I turned this function into a fucking mess. I'm so sorry. -Lach + if (locvar1 == -2) // next skin + { + if (ov->skin == NULL) // start at Sonic + skin = &skins[0]; + else + { + UINT8 skinnum = (skin_t*)ov->skin-skins + 1; + player_t *player = actor->target ? actor->target->player : NULL; + while (skinnum < numskins && (player ? !R_SkinUsable(player-players, skinnum) : skins[skinnum].availability > 0)) + skinnum++; + if (skinnum < numskins) + skin = &skins[skinnum]; + // leave skin NULL if we go past the skin count, this will display Eggman + } + } + else // specific skin + { + skin = &skins[locvar1]; + } + + if (skin != NULL) // if not Eggman, get the appropriate colors + { + facecolor = skin->prefcolor; + if (skin->prefoppositecolor) + { + signcolor = skin->prefoppositecolor; + } + else + { + signcolor = Color_Opposite[facecolor - 1][0]; + } + signframe += (15 - Color_Opposite[Color_Opposite[signcolor - 1][0] - 1][1]); + } + } + + if (skin != NULL && skin->sprites[SPR2_SIGN].numframes) // player face + { + ov->color = facecolor; ov->skin = skin; P_SetMobjState(ov, actor->info->seestate); // S_PLAY_SIGN + actor->tracer->color = signcolor; + actor->tracer->frame = signframe; + } + else // Eggman face + { + ov->color = SKINCOLOR_NONE; + ov->skin = NULL; + P_SetMobjState(ov, actor->info->meleestate); // S_EGGMANSIGN + actor->tracer->color = signcolor = SKINCOLOR_CARBON; + actor->tracer->frame = signframe += (15 - Color_Opposite[Color_Opposite[signcolor - 1][0] - 1][1]); } } @@ -5106,7 +5224,7 @@ void A_OverlayThink(mobj_t *actor) actor->z = actor->target->z + actor->target->height - mobjinfo[actor->type].height - ((var2>>16) ? -1 : 1)*(var2&0xFFFF)*FRACUNIT; else actor->z = actor->target->z + ((var2>>16) ? -1 : 1)*(var2&0xFFFF)*FRACUNIT; - actor->angle = actor->target->angle; + actor->angle = actor->target->angle + actor->movedir; actor->eflags = actor->target->eflags; actor->momx = actor->target->momx; diff --git a/src/p_mobj.c b/src/p_mobj.c index 5735dc27b..171ce2e36 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6914,7 +6914,7 @@ void P_RunOverlays(void) mo->eflags = (mo->eflags & ~MFE_VERTICALFLIP) | (mo->target->eflags & MFE_VERTICALFLIP); mo->scale = mo->destscale = mo->target->scale; - mo->angle = mo->target->angle; + mo->angle = mo->target->angle + mo->movedir; if (!(mo->state->frame & FF_ANIMATE)) zoffs = FixedMul(((signed)mo->state->var2)*FRACUNIT, mo->scale); @@ -10441,6 +10441,11 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) mobj->extravalue2 = 0; mobj->fuse = 100; break; + case MT_SIGN: + P_SetTarget(&mobj->tracer, P_SpawnMobjFromMobj(mobj, 0, 0, 0, MT_OVERLAY)); + P_SetTarget(&mobj->tracer->target, mobj); + P_SetMobjState(mobj->tracer, S_SIGNBOARD); + mobj->tracer->movedir = ANGLE_90; default: break; } diff --git a/src/p_spec.c b/src/p_spec.c index 50939ae5b..db8ab930c 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4058,7 +4058,8 @@ void P_SetupSignExit(player_t *player) continue; P_SetTarget(&thing->target, player->mo); - P_SetMobjState(thing, S_SIGN1); + P_SetObjectMomZ(thing, 12*FRACUNIT, false); + P_SetMobjState(thing, S_SIGNSPIN); if (thing->info->seesound) S_StartSound(thing, thing->info->seesound); @@ -4083,7 +4084,8 @@ void P_SetupSignExit(player_t *player) continue; P_SetTarget(&thing->target, player->mo); - P_SetMobjState(thing, S_SIGN1); + P_SetObjectMomZ(thing, 12*FRACUNIT, false); + P_SetMobjState(thing, S_SIGNSPIN); if (thing->info->seesound) S_StartSound(thing, thing->info->seesound); From eb6d3b3dbe844476a1b2cd53650ff8cd0e41c2d3 Mon Sep 17 00:00:00 2001 From: lachwright Date: Mon, 4 Nov 2019 23:10:13 +0800 Subject: [PATCH 25/50] Improve A_SignSpin --- src/info.c | 12 +++++++----- src/info.h | 2 ++ src/p_enemy.c | 21 ++++++++++++++------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/info.c b/src/info.c index 23048e49c..ddb3d5ca7 100644 --- a/src/info.c +++ b/src/info.c @@ -1926,10 +1926,12 @@ state_t states[NUMSTATES] = // Level End Sign {SPR_SIGN, 0, -1, {A_SignPlayer}, -3, 0, S_NULL}, // S_SIGN - {SPR_SIGN, 0, 1, {A_SignSpin}, 30, S_SIGNPLAYER, S_SIGNSPINLOOP}, // S_SIGNSPIN + {SPR_SIGN, 0, 1, {A_SignSpin}, 30, 0, S_SIGNSPINLOOP}, // S_SIGNSPIN {SPR_SIGN, 0, 0, {A_Repeat}, 4, S_SIGNSPIN, S_SIGNROULETTE}, // S_SIGNSPINLOOP {SPR_SIGN, 0, 0, {A_SignPlayer}, -2, 0, S_SIGNSPIN}, // S_SIGNROULETTE - {SPR_SIGN, 0, -1, {A_SignPlayer}, -1, 0, S_NULL}, // S_SIGNPLAYER + {SPR_SIGN, 0, 1, {A_SignPlayer}, -1, 0, S_SIGNSLOW}, // S_SIGNPLAYER + {SPR_SIGN, 0, 1, {A_SignSpin}, 30, 0, S_SIGNSLOW}, // S_SIGNSLOW + {SPR_SIGN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SIGNSTOP {SPR_SIGN, FF_PAPERSPRITE|2, -1, {NULL}, 0, 0, S_NULL}, // S_SIGNBOARD {SPR_SIGN, FF_PAPERSPRITE|1, -1, {NULL}, 0, 29, S_NULL}, // S_EGGMANSIGN @@ -7792,16 +7794,16 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = sfx_lvpass, // seesound 8, // reactiontime sfx_None, // attacksound - S_NULL, // painstate + S_SIGNPLAYER, // painstate MT_SPARK, // painchance sfx_None, // painsound S_EGGMANSIGN, // meleestate S_NULL, // missilestate - S_NULL, // deathstate + S_SIGNSTOP, // deathstate S_NULL, // xdeathstate sfx_None, // deathsound 8, // speed - 32*FRACUNIT, // radius + 36*FRACUNIT, // radius 32*FRACUNIT, // height 0, // display offset 16, // mass diff --git a/src/info.h b/src/info.h index c23d05ebc..548ce81d9 100644 --- a/src/info.h +++ b/src/info.h @@ -2064,6 +2064,8 @@ typedef enum state S_SIGNSPINLOOP, S_SIGNROULETTE, S_SIGNPLAYER, + S_SIGNSLOW, + S_SIGNSTOP, S_SIGNBOARD, S_EGGMANSIGN, diff --git a/src/p_enemy.c b/src/p_enemy.c index a6860e823..b52ad61a7 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5011,8 +5011,8 @@ void A_UnsetSolidSteam(mobj_t *actor) // // Description: Spins a signpost until it hits the ground and reaches its mapthing's angle. // -// var1 = degrees to rotate object -// var2 = state to set object to once spinning stops +// var1 = degrees to rotate object (must be positive, because I'm lazy) +// var2 = unused // void A_SignSpin(mobj_t *actor) { @@ -5031,12 +5031,15 @@ void A_SignSpin(mobj_t *actor) { angle_t mapangle = FixedAngle(actor->spawnpoint->angle << FRACBITS); angle_t diff = mapangle - actor->angle; - if (diff < rotateangle) + if (diff < ANG2) { actor->angle = mapangle; - P_SetMobjState(actor, locvar2); + P_SetMobjState(actor, actor->info->deathstate); return; } + if (actor->state-states != actor->info->painstate) + P_SetMobjState(actor, actor->info->painstate); + actor->movedir = min((mapangle - actor->angle) >> 2, actor->movedir); } else // no mapthing? just finish in your current angle { @@ -5044,15 +5047,19 @@ void A_SignSpin(mobj_t *actor) return; } } - actor->angle += rotateangle; - if (leveltime & 1 || actor->tracer == NULL) return; + else + { + actor->movedir = rotateangle; + } + actor->angle += actor->movedir; + if (actor->tracer == NULL || P_MobjWasRemoved(actor->tracer)) return; for (i = -1; i < 2; i += 2) { P_SpawnMobjFromMobj(actor, P_ReturnThrustX(actor, actor->tracer->angle, i * actor->radius), P_ReturnThrustY(actor, actor->tracer->angle, i * actor->radius), (actor->eflags & MFE_VERTICALFLIP) ? 0 : actor->height, - actor->info->painchance); + actor->info->painchance)->destscale >>= 1; } } From cf39e181bb66a6e8f42a05a6e49e65d262be5985 Mon Sep 17 00:00:00 2001 From: lachwright Date: Tue, 5 Nov 2019 01:33:09 +0800 Subject: [PATCH 26/50] Display Eggman more frequently during skin roulette --- src/dehacked.c | 9 ++++++--- src/info.c | 9 ++++++--- src/info.h | 9 ++++++--- src/p_enemy.c | 35 ++++++++++++++--------------------- src/p_spec.c | 4 ++-- 5 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 2b3194f1c..a909b1858 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -5387,9 +5387,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit // Level End Sign "S_SIGN", - "S_SIGNSPIN", - "S_SIGNSPINLOOP", - "S_SIGNROULETTE", + "S_SIGNSPIN1", + "S_SIGNSPIN2", + "S_SIGNSPIN3", + "S_SIGNSPIN4", + "S_SIGNSPIN5", + "S_SIGNSPIN6", "S_SIGNPLAYER", "S_SIGNBOARD", "S_EGGMANSIGN", diff --git a/src/info.c b/src/info.c index ddb3d5ca7..273efcd16 100644 --- a/src/info.c +++ b/src/info.c @@ -1926,9 +1926,12 @@ state_t states[NUMSTATES] = // Level End Sign {SPR_SIGN, 0, -1, {A_SignPlayer}, -3, 0, S_NULL}, // S_SIGN - {SPR_SIGN, 0, 1, {A_SignSpin}, 30, 0, S_SIGNSPINLOOP}, // S_SIGNSPIN - {SPR_SIGN, 0, 0, {A_Repeat}, 4, S_SIGNSPIN, S_SIGNROULETTE}, // S_SIGNSPINLOOP - {SPR_SIGN, 0, 0, {A_SignPlayer}, -2, 0, S_SIGNSPIN}, // S_SIGNROULETTE + {SPR_SIGN, 0, 1, {A_SignSpin}, 30, 0, S_SIGNSPIN2}, // S_SIGNSPIN1 + {SPR_SIGN, 0, 0, {A_Repeat}, 4, S_SIGNSPIN1, S_SIGNSPIN3}, // S_SIGNSPIN2 + {SPR_SIGN, 0, 0, {A_SignPlayer}, -2, 0, S_SIGNSPIN4}, // S_SIGNSPIN3 + {SPR_SIGN, 0, 1, {A_SignSpin}, 30, 0, S_SIGNSPIN5}, // S_SIGNSPIN4 + {SPR_SIGN, 0, 0, {A_Repeat}, 4, S_SIGNSPIN4, S_SIGNSPIN6}, // S_SIGNSPIN5 + {SPR_SIGN, 0, 0, {A_SignPlayer}, -3, 0, S_SIGNSPIN1}, // S_SIGNSPIN6 {SPR_SIGN, 0, 1, {A_SignPlayer}, -1, 0, S_SIGNSLOW}, // S_SIGNPLAYER {SPR_SIGN, 0, 1, {A_SignSpin}, 30, 0, S_SIGNSLOW}, // S_SIGNSLOW {SPR_SIGN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SIGNSTOP diff --git a/src/info.h b/src/info.h index 548ce81d9..ba8c6f805 100644 --- a/src/info.h +++ b/src/info.h @@ -2060,9 +2060,12 @@ typedef enum state // Level End Sign S_SIGN, - S_SIGNSPIN, - S_SIGNSPINLOOP, - S_SIGNROULETTE, + S_SIGNSPIN1, + S_SIGNSPIN2, + S_SIGNSPIN3, + S_SIGNSPIN4, + S_SIGNSPIN5, + S_SIGNSPIN6, S_SIGNPLAYER, S_SIGNSLOW, S_SIGNSTOP, diff --git a/src/p_enemy.c b/src/p_enemy.c index b52ad61a7..d215e608d 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5136,17 +5136,14 @@ void A_SignPlayer(mobj_t *actor) // I turned this function into a fucking mess. I'm so sorry. -Lach if (locvar1 == -2) // next skin { - if (ov->skin == NULL) // start at Sonic - skin = &skins[0]; - else + if (ov->skin == NULL) // pick a random skin to start with! + skin = &skins[P_RandomKey(numskins)]; + else // otherwise, advance 1 skin { - UINT8 skinnum = (skin_t*)ov->skin-skins + 1; + UINT8 skinnum = (skin_t*)ov->skin-skins; player_t *player = actor->target ? actor->target->player : NULL; - while (skinnum < numskins && (player ? !R_SkinUsable(player-players, skinnum) : skins[skinnum].availability > 0)) - skinnum++; - if (skinnum < numskins) - skin = &skins[skinnum]; - // leave skin NULL if we go past the skin count, this will display Eggman + while ((skinnum = (skinnum + 1) % numskins) && (player ? !R_SkinUsable(player-players, skinnum) : skins[skinnum].availability > 0)); + skin = &skins[skinnum]; } } else // specific skin @@ -5154,19 +5151,16 @@ void A_SignPlayer(mobj_t *actor) skin = &skins[locvar1]; } - if (skin != NULL) // if not Eggman, get the appropriate colors + facecolor = skin->prefcolor; + if (skin->prefoppositecolor) { - facecolor = skin->prefcolor; - if (skin->prefoppositecolor) - { - signcolor = skin->prefoppositecolor; - } - else - { - signcolor = Color_Opposite[facecolor - 1][0]; - } - signframe += (15 - Color_Opposite[Color_Opposite[signcolor - 1][0] - 1][1]); + signcolor = skin->prefoppositecolor; } + else + { + signcolor = Color_Opposite[facecolor - 1][0]; + } + signframe += (15 - Color_Opposite[Color_Opposite[signcolor - 1][0] - 1][1]); } if (skin != NULL && skin->sprites[SPR2_SIGN].numframes) // player face @@ -5180,7 +5174,6 @@ void A_SignPlayer(mobj_t *actor) else // Eggman face { ov->color = SKINCOLOR_NONE; - ov->skin = NULL; P_SetMobjState(ov, actor->info->meleestate); // S_EGGMANSIGN actor->tracer->color = signcolor = SKINCOLOR_CARBON; actor->tracer->frame = signframe += (15 - Color_Opposite[Color_Opposite[signcolor - 1][0] - 1][1]); diff --git a/src/p_spec.c b/src/p_spec.c index db8ab930c..86381e151 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4059,7 +4059,7 @@ void P_SetupSignExit(player_t *player) P_SetTarget(&thing->target, player->mo); P_SetObjectMomZ(thing, 12*FRACUNIT, false); - P_SetMobjState(thing, S_SIGNSPIN); + P_SetMobjState(thing, S_SIGNSPIN1); if (thing->info->seesound) S_StartSound(thing, thing->info->seesound); @@ -4085,7 +4085,7 @@ void P_SetupSignExit(player_t *player) P_SetTarget(&thing->target, player->mo); P_SetObjectMomZ(thing, 12*FRACUNIT, false); - P_SetMobjState(thing, S_SIGNSPIN); + P_SetMobjState(thing, S_SIGNSPIN1); if (thing->info->seesound) S_StartSound(thing, thing->info->seesound); From ed967f077c0ef88f9772e36e72f68851c01add4f Mon Sep 17 00:00:00 2001 From: Jaime Passos Date: Tue, 5 Nov 2019 17:04:57 -0300 Subject: [PATCH 27/50] Restore the last gameplay frame while on the intermission screen --- src/d_main.c | 1 + src/y_inter.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++++-- src/y_inter.h | 1 + 3 files changed, 121 insertions(+), 4 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 52f1d2997..eff608281 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -415,6 +415,7 @@ static void D_Display(void) if (rendermode == render_soft) { VID_BlitLinearScreen(screens[0], screens[1], vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.rowbytes); + Y_ConsiderScreenBuffer(); usebuffer = true; } lastdraw = false; diff --git a/src/y_inter.c b/src/y_inter.c index 2fed35de3..335b2a43b 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -143,9 +143,21 @@ static patch_t *widebgpatch = NULL; // INTERSCW static patch_t *bgtile = NULL; // SPECTILE/SRB2BACK static patch_t *interpic = NULL; // custom picture defined in map header static boolean usetile; +static INT32 timer; + +typedef struct +{ + INT32 source_width, source_height; + INT32 source_bpp, source_rowbytes; + UINT8 *source_picture; + INT32 target_width, target_height; + INT32 target_bpp, target_rowbytes; + UINT8 *target_picture; +} y_buffer_t; + boolean usebuffer = false; static boolean useinterpic; -static INT32 timer; +static y_buffer_t *y_buffer; static INT32 intertic; static INT32 tallydonetic = -1; @@ -153,6 +165,8 @@ static INT32 endtic = -1; intertype_t intertype = int_none; +static void Y_RescaleScreenBuffer(void); +static void Y_CleanupScreenBuffer(void); static void Y_AwardCoopBonuses(void); static void Y_AwardSpecialStageBonus(void); static void Y_CalculateCompetitionWinners(void); @@ -207,6 +221,94 @@ static void Y_IntermissionTokenDrawer(void) V_DrawCroppedPatch(32<width), calc); } +// +// Y_ConsiderScreenBuffer +// +// Can we copy the current screen +// to a buffer? +// +void Y_ConsiderScreenBuffer(void) +{ + if (gameaction != ga_completed) + return; + + if (y_buffer == NULL) + y_buffer = Z_Calloc(sizeof(y_buffer_t), PU_STATIC, NULL); + else + return; + + y_buffer->source_width = vid.width; + y_buffer->source_height = vid.height; + y_buffer->source_bpp = vid.bpp; + y_buffer->source_rowbytes = vid.rowbytes; + y_buffer->source_picture = ZZ_Alloc(y_buffer->source_width*vid.bpp * y_buffer->source_height); + VID_BlitLinearScreen(screens[1], y_buffer->source_picture, vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.rowbytes); + + // Make the rescaled screen buffer + Y_RescaleScreenBuffer(); +} + +// +// Y_RescaleScreenBuffer +// +// Write the rescaled source picture, +// to the destination picture that +// has the current screen's resolutions. +// +static void Y_RescaleScreenBuffer(void) +{ + INT32 sx, sy; // source + INT32 dx, dy; // dest + fixed_t scalefac, yscalefac; + fixed_t rowfrac, colfrac; + UINT8 *dest; + + // Who knows? + if (y_buffer == NULL) + return; + + if (y_buffer->target_picture) + Z_Free(y_buffer->target_picture); + + y_buffer->target_width = vid.width; + y_buffer->target_height = vid.height; + y_buffer->target_rowbytes = vid.rowbytes; + y_buffer->target_bpp = vid.bpp; + y_buffer->target_picture = ZZ_Alloc(y_buffer->target_width*vid.bpp * y_buffer->target_height); + dest = y_buffer->target_picture; + + scalefac = FixedDiv(y_buffer->target_width*FRACUNIT, y_buffer->source_width*FRACUNIT); + yscalefac = FixedDiv(y_buffer->target_height*FRACUNIT, y_buffer->source_height*FRACUNIT); + + rowfrac = FixedDiv(FRACUNIT, yscalefac); + colfrac = FixedDiv(FRACUNIT, scalefac); + + for (sy = 0, dy = 0; sy < (y_buffer->source_height << FRACBITS) && dy < y_buffer->target_height; sy += rowfrac, dy++) + for (sx = 0, dx = 0; sx < (y_buffer->source_width << FRACBITS) && dx < y_buffer->target_width; sx += colfrac, dx += y_buffer->target_bpp) + dest[(dy * y_buffer->target_rowbytes) + dx] = y_buffer->source_picture[((sy>>FRACBITS) * y_buffer->source_width) + (sx>>FRACBITS)]; +} + +// +// Y_CleanupScreenBuffer +// +// Free all related memory. +// +static void Y_CleanupScreenBuffer(void) +{ + // Who knows? + if (y_buffer == NULL) + return; + + if (y_buffer->target_picture) + Z_Free(y_buffer->target_picture); + + if (y_buffer->source_picture) + Z_Free(y_buffer->source_picture); + + Z_Free(y_buffer); + y_buffer = NULL; +} + // // Y_IntermissionDrawer // @@ -229,12 +331,23 @@ void Y_IntermissionDrawer(void) else if (!usetile) { if (rendermode == render_soft && usebuffer) - VID_BlitLinearScreen(screens[1], screens[0], vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.rowbytes); + { + // no y_buffer + if (y_buffer == NULL) + VID_BlitLinearScreen(screens[1], screens[0], vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.rowbytes); + else + { + // Maybe the resolution changed? + if ((y_buffer->target_width != vid.width) || (y_buffer->target_height != vid.height)) + Y_RescaleScreenBuffer(); + + // Blit the already-scaled screen buffer to the current screen + VID_BlitLinearScreen(y_buffer->target_picture, screens[0], vid.width*vid.bpp, vid.height, vid.width*vid.bpp, vid.rowbytes); + } + } #ifdef HWRENDER else if(rendermode != render_soft && usebuffer) - { HWR_DrawIntermissionBG(); - } #endif else { @@ -2096,6 +2209,8 @@ static void Y_UnloadData(void) if (rendermode != render_soft) return; + Y_CleanupScreenBuffer(); + // unload the background patches UNLOAD(bgpatch); UNLOAD(widebgpatch); diff --git a/src/y_inter.h b/src/y_inter.h index 4c6ad2bdf..ccb48dbd4 100644 --- a/src/y_inter.h +++ b/src/y_inter.h @@ -15,6 +15,7 @@ void Y_IntermissionDrawer(void); void Y_Ticker(void); void Y_StartIntermission(void); void Y_EndIntermission(void); +void Y_ConsiderScreenBuffer(void); typedef enum { From 6d024b712489b992f702b99f28702094afaebf25 Mon Sep 17 00:00:00 2001 From: Jaime Passos Date: Tue, 5 Nov 2019 17:35:16 -0300 Subject: [PATCH 28/50] I guess I'll have to do at least SOMETHING about OpenGL --- src/d_main.c | 7 +++++++ src/y_inter.c | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/d_main.c b/src/d_main.c index eff608281..ca40fcb24 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -227,7 +227,14 @@ static void D_Display(void) SCR_SetMode(); // change video mode if (vid.recalc) + { SCR_Recalc(); // NOTE! setsizeneeded is set by SCR_Recalc() +#ifdef HWRENDER + // Shoot! The screen texture was flushed! + if ((rendermode == render_opengl) && (gamestate == GS_INTERMISSION)) + usebuffer = false; +#endif + } // change the view size if needed if (setsizeneeded) diff --git a/src/y_inter.c b/src/y_inter.c index 335b2a43b..0a6e3b3fe 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -346,7 +346,7 @@ void Y_IntermissionDrawer(void) } } #ifdef HWRENDER - else if(rendermode != render_soft && usebuffer) + else if (rendermode != render_soft && usebuffer) HWR_DrawIntermissionBG(); #endif else From c43551384dff1d52e93949cd3ee832dcdf05891f Mon Sep 17 00:00:00 2001 From: lachwright Date: Thu, 7 Nov 2019 16:00:44 +0800 Subject: [PATCH 29/50] Reduce RVZ particle spawns when no players are in proximity --- src/info.c | 12 ++++++------ src/p_enemy.c | 27 +++++++++++++++++++++++---- src/p_mobj.c | 12 +++++++----- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/info.c b/src/info.c index cfaad552d..64160b849 100644 --- a/src/info.c +++ b/src/info.c @@ -5294,7 +5294,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_NOCLIPTHING|MF_NOBLOCKMAP|MF_RUNSPAWNFUNC, // flags + MF_NOGRAVITY|MF_NOCLIPTHING|MF_NOBLOCKMAP|MF_RUNSPAWNFUNC|MF_SCENERY, // flags S_NULL // raisestate }, @@ -5321,7 +5321,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_NOCLIPTHING|MF_NOBLOCKMAP|MF_RUNSPAWNFUNC, // flags + MF_NOGRAVITY|MF_NOCLIPTHING|MF_NOBLOCKMAP|MF_RUNSPAWNFUNC|MF_SCENERY, // flags S_NULL // raisestate }, @@ -13300,7 +13300,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // deathstate S_NULL, // xdeathstate sfx_None, // deathsound - 0, // speed + 3200*FRACUNIT, // speed 30*FRACUNIT, // radius 32*FRACUNIT, // height 1, // display offset @@ -13388,7 +13388,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_SPAWNCEILING, // flags + MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_SPAWNCEILING|MF_SCENERY, // flags S_NULL // raisestate }, @@ -19038,7 +19038,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // deathstate S_PUMA_DOWN3, // xdeathstate sfx_None, // deathsound - 0, // speed + 2000*FRACUNIT, // speed 8*FRACUNIT, // radius 16*FRACUNIT, // height 0, // display offset @@ -19072,7 +19072,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY, // flags + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags S_NULL // raisestate }, diff --git a/src/p_enemy.c b/src/p_enemy.c index cc2d64e8b..9a5d6d036 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -4759,7 +4759,7 @@ void A_DropMine(mobj_t *actor) // Description: Makes the stupid harmless fish in Greenflower Zone jump. // // var1 = Jump strength (in FRACBITS), if specified. Otherwise, uses the angle value. -// var2 = unused +// var2 = Trail object to spawn, if desired. // void A_FishJump(mobj_t *actor) { @@ -4772,8 +4772,17 @@ void A_FishJump(mobj_t *actor) if (locvar2) { - fixed_t rad = actor->radius>>FRACBITS; - P_SpawnMobjFromMobj(actor, P_RandomRange(rad, -rad)<x - players[i].mo->x, actor->y - players[i].mo->y) < (actor->info->speed)) + break; // Stop looking. + if (i < MAXPLAYERS) + { + fixed_t rad = actor->radius>>FRACBITS; + P_SpawnMobjFromMobj(actor, P_RandomRange(rad, -rad)<z <= actor->floorz) || (actor->z <= actor->watertop - FixedMul((64 << FRACBITS), actor->scale))) @@ -14024,7 +14033,7 @@ void A_LavafallRocks(mobj_t *actor) // Don't spawn rocks unless a player is relatively close by. for (i = 0; i < MAXPLAYERS; ++i) if (playeringame[i] && players[i].mo - && P_AproxDistance(actor->x - players[i].mo->x, actor->y - players[i].mo->y) < (1600 << FRACBITS)) + && P_AproxDistance(actor->x - players[i].mo->x, actor->y - players[i].mo->y) < (actor->info->speed >> 1)) break; // Stop looking. if (i < MAXPLAYERS) @@ -14047,6 +14056,7 @@ void A_LavafallRocks(mobj_t *actor) void A_LavafallLava(mobj_t *actor) { mobj_t *lavafall; + UINT8 i; #ifdef HAVE_BLUA if (LUA_CallAction("A_LavafallLava", actor)) @@ -14056,6 +14066,15 @@ void A_LavafallLava(mobj_t *actor) if ((40 - actor->fuse) % (2*(actor->scale >> FRACBITS))) return; + // Don't spawn lava unless a player is nearby. + for (i = 0; i < MAXPLAYERS; ++i) + if (playeringame[i] && players[i].mo + && P_AproxDistance(actor->x - players[i].mo->x, actor->y - players[i].mo->y) < (actor->info->speed)) + break; // Stop looking. + + if (i >= MAXPLAYERS) + return; + lavafall = P_SpawnMobjFromMobj(actor, 0, 0, -8*FRACUNIT, MT_LAVAFALL_LAVA); lavafall->momz = -P_MobjFlip(actor)*25*FRACUNIT; } diff --git a/src/p_mobj.c b/src/p_mobj.c index 5735dc27b..137b759f0 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9436,6 +9436,13 @@ void P_MobjThinker(mobj_t *mobj) hdist = R_PointToDist2(mobj->x, mobj->y, mobj->target->x, mobj->target->y); + if (hdist > 1500*FRACUNIT) + { + mobj->flags2 &= ~MF2_BOSSNOTRAP; + P_SetTarget(&mobj->target, NULL); + break; + } + if (!(mobj->flags2 & MF2_BOSSNOTRAP) && hdist <= 450*FRACUNIT) mobj->flags2 |= MF2_BOSSNOTRAP; @@ -9455,11 +9462,6 @@ void P_MobjThinker(mobj_t *mobj) mobj->momx = 0; mobj->momy = 0; mobj->momz = 0; - if (hdist >= 1500*FRACUNIT) - { - mobj->flags2 &= ~MF2_BOSSNOTRAP; - P_SetTarget(&mobj->target, NULL); - } } break; } From d2c6d6ad73681b28f181ee6dafe94357b3f06081 Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 7 Nov 2019 14:06:27 +0000 Subject: [PATCH 30/50] Prevent infinite lives rollover to extremely negative numbers. (Discovered while messing around with pandora's box recently.) --- src/p_user.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/p_user.c b/src/p_user.c index f81f6d956..d207670f9 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1240,6 +1240,8 @@ void P_GivePlayerLives(player_t *player, INT32 numlives) numlives = (numlives + prevlives - player->lives); } } + else if (player->lives == INFLIVES) + return; player->lives += numlives; From f11fc92fd77ec5feefa0886349c0054ea6468615 Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 7 Nov 2019 17:10:59 +0000 Subject: [PATCH 31/50] Fix pmomz being set to 0 in the wrong place. (P_PlayerAfterThink is after every moving sector has changed its height, while P_MovePlayer is before it...) --- src/p_user.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index f81f6d956..d70a93584 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8598,6 +8598,9 @@ static void P_MovePlayer(player_t *player) // Look for Quicksand! if (CheckForQuicksand) P_CheckQuicksand(player); + + if (P_IsObjectOnGround(player->mo)) + player->mo->pmomz = 0; } static void P_DoZoomTube(player_t *player) @@ -12385,9 +12388,6 @@ void P_PlayerAfterThink(player_t *player) player->mo->flags |= MF_NOGRAVITY; } - if (P_IsObjectOnGround(player->mo)) - player->mo->pmomz = 0; - if (player->followmobj && (player->spectator || player->mo->health <= 0 || player->followmobj->type != player->followitem)) { P_RemoveMobj(player->followmobj); From be7dcccb71c01e7350d38746430dc73d5adb1385 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 7 Nov 2019 13:02:33 -0800 Subject: [PATCH 32/50] Declarations after Lua calls --- src/p_enemy.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index d215e608d..c1d35f43e 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5016,15 +5016,16 @@ void A_UnsetSolidSteam(mobj_t *actor) // void A_SignSpin(mobj_t *actor) { -#ifdef HAVE_BLUA - if (LUA_CallAction("A_SignSpin", actor)) - return; -#endif INT32 locvar1 = var1; INT32 locvar2 = var2; INT16 i; angle_t rotateangle = FixedAngle(locvar1 << FRACBITS); +#ifdef HAVE_BLUA + if (LUA_CallAction("A_SignSpin", actor)) + return; +#endif + if (P_IsObjectOnGround(actor) && P_MobjFlip(actor) * actor->momz <= 0) { if (actor->spawnpoint) From fff38da832b9a0135b0c1ea2d67d1b37dd15ed05 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 7 Nov 2019 13:05:50 -0800 Subject: [PATCH 33/50] var2 unused, so remove it; signcolor can be unset --- src/p_enemy.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index c1d35f43e..bf9e01348 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5075,10 +5075,9 @@ void A_SignSpin(mobj_t *actor) void A_SignPlayer(mobj_t *actor) { INT32 locvar1 = var1; - INT32 locvar2 = var2; skin_t *skin = NULL; mobj_t *ov; - UINT8 facecolor, signcolor; + UINT8 facecolor, signcolor = SKINCOLOR_NONE; UINT32 signframe = states[actor->info->raisestate].frame; #ifdef HAVE_BLUA From 872e662618d85a138eefd982060d103d86fc5731 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 7 Nov 2019 13:42:54 -0800 Subject: [PATCH 34/50] That's a lot of whitespace --- src/dehacked.c | 4 ++-- src/f_finale.c | 10 +++++----- src/f_finale.h | 2 +- src/m_menu.h | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 61c6969d5..24a99d5d0 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -2131,7 +2131,7 @@ static void readmenu(MYFILE *f, INT32 num) { menupres[num].tty = (INT16)get_number(word2); titlechanged = true; - } + } else if (fastcmp(word, "TITLEPICSLOOP")) { menupres[num].ttloop = (INT16)get_number(word2); @@ -3600,7 +3600,7 @@ static void readmaincfg(MYFILE *f) { tty = (INT16)get_number(word2); titlechanged = true; - } + } else if (fastcmp(word, "TITLEPICSLOOP")) { ttloop = (INT16)get_number(word2); diff --git a/src/f_finale.c b/src/f_finale.c index 8847f2924..ace3e9a54 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -2194,7 +2194,7 @@ void F_InitMenuPresValues(void) curbgxspeed = (gamestate == GS_TIMEATTACK) ? 0 : titlescrollxspeed; curbgyspeed = (gamestate == GS_TIMEATTACK) ? 22 : titlescrollyspeed; curbghide = (gamestate == GS_TIMEATTACK) ? false : true; - + curhidepics = hidetitlepics; curttmode = ttmode; curttscale = ttscale; @@ -2416,7 +2416,7 @@ void F_StartTitleScreen(void) ttspop6 = W_CachePatchName("TTSPOP6", PU_LEVEL); ttspop7 = W_CachePatchName("TTSPOP7", PU_LEVEL); break; - + // don't load alacroix gfx yet; we do that upon first draw. case TTMODE_ALACROIX: break; @@ -2438,7 +2438,7 @@ static void F_UnloadAlacroixGraphics(SINT8 oldttscale) // This all gets freed by PU_LEVEL when exiting the menus. // When re-visiting the menus (e.g., from exiting in-game), the gfx are force-reloaded. // So leftover addresses here should not be a problem. - + UINT16 i; oldttscale--; // zero-based index for (i = 0; i < TTMAX_ALACROIX; i++) @@ -2506,7 +2506,7 @@ static void F_LoadAlacroixGraphics(SINT8 newttscale) { for (j = 0; j < 22; j++) sprintf(&lumpnames[j][0], "T%.1hu%s", (UINT8)newttscale+1, names[j]); - + LOADTTGFX(ttembl[newttscale], lumpnames[0], TTMAX_ALACROIX) LOADTTGFX(ttribb[newttscale], lumpnames[1], TTMAX_ALACROIX) LOADTTGFX(ttsont[newttscale], lumpnames[2], TTMAX_ALACROIX) @@ -2665,7 +2665,7 @@ void F_TitleScreenDrawer(void) { // Ribbon unfurls, revealing SONIC text, from tic 0 to tic 24. SONIC text is pre-baked into this ribbon graphic. V_DrawSciencePatch(39<= 0) V_DrawSciencePatch(89< Date: Thu, 7 Nov 2019 14:44:42 -0800 Subject: [PATCH 35/50] Better account for the uninitialised signcolor --- src/p_enemy.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index bf9e01348..1abf1271e 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5077,7 +5077,7 @@ void A_SignPlayer(mobj_t *actor) INT32 locvar1 = var1; skin_t *skin = NULL; mobj_t *ov; - UINT8 facecolor, signcolor = SKINCOLOR_NONE; + UINT8 facecolor, signcolor; UINT32 signframe = states[actor->info->raisestate].frame; #ifdef HAVE_BLUA @@ -5130,6 +5130,8 @@ void A_SignPlayer(mobj_t *actor) signcolor = Color_Opposite[actor->target->player->skincolor - 1][0]; signframe += (15 - Color_Opposite[actor->target->player->skincolor - 1][1]); } + else + signcolor = SKINCOLOR_NONE; } else if (locvar1 != -3) // set to a defined skin { From b157c21a35cb6246974864c4b096b5e914314270 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 7 Nov 2019 14:56:42 -0800 Subject: [PATCH 36/50] There's some whitespace... --- src/hardware/hw_light.c | 2 +- src/info.h | 2 +- src/p_floor.c | 2 +- src/p_map.c | 4 ++-- src/p_spec.c | 2 +- src/p_user.c | 28 ++++++++++++++-------------- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/hardware/hw_light.c b/src/hardware/hw_light.c index fa66536b6..8f62f7763 100644 --- a/src/hardware/hw_light.c +++ b/src/hardware/hw_light.c @@ -406,7 +406,7 @@ light_t *t_lspr[NUMSPRITES] = &lspr[NOLIGHT], // SPR_HHPL &lspr[NOLIGHT], // SPR_SHRM &lspr[NOLIGHT], // SPR_HHZM - + // Azure Temple Scenery &lspr[NOLIGHT], // SPR_BGAR &lspr[NOLIGHT], // SPR_RCRY diff --git a/src/info.h b/src/info.h index e7f41f585..57943c389 100644 --- a/src/info.h +++ b/src/info.h @@ -556,7 +556,7 @@ typedef enum sprite SPR_HHPL, // Dr Seuss Trees SPR_SHRM, // Mushroom SPR_HHZM, // Misc - + // Azure Temple Scenery SPR_BGAR, // ATZ Gargoyles SPR_RCRY, // ATZ Red Crystal (Target) diff --git a/src/p_floor.c b/src/p_floor.c index 1360375a7..423fc1b70 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -2459,7 +2459,7 @@ void T_RaiseSector(levelspecthink_t *raise) break; } } - + if (raise->vars[9]) // Dynamically Sinking Platform^tm { #define shaketime 10 diff --git a/src/p_map.c b/src/p_map.c index 159489f70..33ac20265 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1040,7 +1040,7 @@ static boolean PIT_CheckThing(mobj_t *thing) { if (tmthing->z > thing->z + thing->height || thing->z > tmthing->z + tmthing->height || !thing->health) return true; - + if (thing == tmthing->tracer) // don't collide with rider return true; @@ -1054,7 +1054,7 @@ static boolean PIT_CheckThing(mobj_t *thing) P_KillMobj(thing, tmthing, tmthing->tracer, 0); return true; } - + if (thing->type == tmthing->type // bounce against other rollout rocks && (tmthing->momx || tmthing->momy || thing->momx || thing->momy)) { diff --git a/src/p_spec.c b/src/p_spec.c index 50939ae5b..7b23ecbe7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6068,7 +6068,7 @@ static void P_AddAirbob(sector_t *sec, line_t *sourceline, boolean noadjust, boo airbob->vars[5] = sec->ceilingheight; airbob->vars[4] = airbob->vars[5] - (sec->ceilingheight - sec->floorheight); - + airbob->vars[9] = dynamic ? 1 : 0; airbob->sourceline = sourceline; diff --git a/src/p_user.c b/src/p_user.c index f81f6d956..561183cd5 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1096,7 +1096,7 @@ boolean P_PlayerCanDamage(player_t *player, mobj_t *thing) // Spinning. if (player->pflags & PF_SPINNING) return true; - + if (player->dashmode >= DASHMODE_THRESHOLD && (player->charflags & (SF_DASHMODE|SF_MACHINE)) == (SF_DASHMODE|SF_MACHINE)) return true; @@ -7820,7 +7820,7 @@ static void P_MovePlayer(player_t *player) if (!(player->powers[pw_nocontrol] & (1<<15))) player->pflags |= PF_JUMPSTASIS; } - + if (player->charability == CA_GLIDEANDCLIMB && player->mo->state-states == S_PLAY_GLIDE_LANDING) { player->pflags |= PF_STASIS; @@ -10978,19 +10978,19 @@ static void P_DoMetalJetFume(player_t *player, mobj_t *fume) tic_t dashmode = player->dashmode; boolean underwater = mo->eflags & MFE_UNDERWATER; statenum_t stat = fume->state-states; - + if (panim != PA_WALK && panim != PA_RUN && panim != PA_DASH) // turn invisible when not in a coherent movement state { if (stat != fume->info->spawnstate) P_SetMobjState(fume, fume->info->spawnstate); return; } - + if (underwater) // No fume underwater; spawn bubbles instead! { fume->movedir += FixedAngle(FixedDiv(2 * player->speed, 3 * mo->scale)); fume->movefactor += player->speed; - + if (fume->movefactor > FixedDiv(2 * player->normalspeed, 3 * mo->scale)) { INT16 i; @@ -11000,7 +11000,7 @@ static void P_DoMetalJetFume(player_t *player, mobj_t *fume) fixed_t factorX = P_ReturnThrustX(mo, angle + ANGLE_90, mo->scale); fixed_t factorY = P_ReturnThrustY(mo, angle + ANGLE_90, mo->scale); fixed_t offsetH, offsetV, x, y, z; - + for (i = -1; i < 2; i += 2) { offsetH = i*P_ReturnThrustX(fume, fume->movedir, radiusV); @@ -11010,10 +11010,10 @@ static void P_DoMetalJetFume(player_t *player, mobj_t *fume) z = mo->z + (mo->height >> 1) + offsetV; P_SpawnMobj(x, y, z, MT_SMALLBUBBLE)->scale = mo->scale >> 1; } - + fume->movefactor = 0; } - + if (panim == PA_WALK) { if (stat != fume->info->spawnstate) @@ -11021,13 +11021,13 @@ static void P_DoMetalJetFume(player_t *player, mobj_t *fume) return; } } - + if (stat == fume->info->spawnstate) // If currently inivisble, activate! { P_SetMobjState(fume, (stat = fume->info->seestate)); P_SetScale(fume, mo->scale); } - + if (dashmode > DASHMODE_THRESHOLD && stat != fume->info->seestate) // If in dashmode, grow really big and flash { fume->destscale = mo->scale; @@ -11044,19 +11044,19 @@ static void P_DoMetalJetFume(player_t *player, mobj_t *fume) fume->flags2 = (fume->flags2 & ~MF2_DONTDRAW) | (mo->flags2 & MF2_DONTDRAW); fume->destscale = (mo->scale + FixedDiv(player->speed, player->normalspeed)) / (underwater ? 6 : 3); fume->color = FUME_SKINCOLORS[(dashmode * sizeof(FUME_SKINCOLORS)) / (DASHMODE_MAX + 1)]; - + if (underwater) { fume->frame = (fume->frame & FF_FRAMEMASK) | FF_ANIMATE | (P_RandomRange(0, 9) * FF_TRANS10); } } - + fume->movecount = dashmode; // keeps track of previous dashmode value so we know whether Metal is entering or leaving it fume->eflags = (fume->eflags & ~MFE_VERTICALFLIP) | (mo->eflags & MFE_VERTICALFLIP); // Make sure to flip in reverse gravity! - + // Finally, set its position dist = -mo->radius - FixedMul(fume->info->radius, fume->destscale - mo->scale/3); - + P_UnsetThingPosition(fume); fume->x = mo->x + P_ReturnThrustX(fume, angle, dist); fume->y = mo->y + P_ReturnThrustY(fume, angle, dist); From 7a770fa63c6e06601bcce2f2402a81373430de9a Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 7 Nov 2019 16:22:25 -0800 Subject: [PATCH 37/50] Lol it's the wrong union! --- src/y_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/y_inter.c b/src/y_inter.c index 209ab5014..21e4bc56e 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -2131,7 +2131,7 @@ static void Y_AwardSpecialStageBonus(void) data.spec.score = players[consoleplayer].score; memset(data.spec.bonuses, 0, sizeof(data.spec.bonuses)); - memset(data.spec.bonuspatches, 0, sizeof(data.coop.bonuspatches)); + memset(data.spec.bonuspatches, 0, sizeof(data.spec.bonuspatches)); for (i = 0; i < MAXPLAYERS; i++) { From ceb8d298c2ae9a6000fa4d22e381085c6bf77cd6 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 7 Nov 2019 16:29:58 -0800 Subject: [PATCH 38/50] Fix misaligned pointers --- src/r_data.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/r_data.c b/src/r_data.c index d37f7822d..15ea511e2 100644 --- a/src/r_data.c +++ b/src/r_data.c @@ -459,7 +459,7 @@ static UINT8 *R_GenerateTexture(size_t texnum) int x, x1, x2, i, width, height; size_t blocksize; column_t *patchcol; - UINT32 *colofs; + UINT8 *colofs; UINT16 wadnum; lumpnum_t lumpnum; @@ -496,10 +496,10 @@ static UINT8 *R_GenerateTexture(size_t texnum) // Check the patch for holes. if (texture->width > SHORT(realpatch->width) || texture->height > SHORT(realpatch->height)) holey = true; - colofs = (UINT32 *)realpatch->columnofs; + colofs = (UINT8 *)realpatch->columnofs; for (x = 0; x < texture->width && !holey; x++) { - column_t *col = (column_t *)((UINT8 *)realpatch + LONG(colofs[x])); + column_t *col = (column_t *)((UINT8 *)realpatch + LONG(*(UINT32 *)&colofs[x<<2])); INT32 topdelta, prevdelta = -1, y = 0; while (col->topdelta != 0xff) { @@ -528,19 +528,19 @@ static UINT8 *R_GenerateTexture(size_t texnum) texturememory += blocksize; // use the patch's column lookup - colofs = (UINT32 *)(void *)(block + 8); - texturecolumnofs[texnum] = colofs; + colofs = (block + 8); + texturecolumnofs[texnum] = (UINT32 *)colofs; blocktex = block; if (patch->flip & 1) // flip the patch horizontally { - UINT32 *realcolofs = (UINT32 *)realpatch->columnofs; + UINT8 *realcolofs = (UINT8 *)realpatch->columnofs; for (x = 0; x < texture->width; x++) - colofs[x] = realcolofs[texture->width-1-x]; // swap with the offset of the other side of the texture + *(UINT32 *)&colofs[x<<2] = realcolofs[( texture->width-1-x )<<2]; // swap with the offset of the other side of the texture } // we can't as easily flip the patch vertically sadly though, // we have wait until the texture itself is drawn to do that for (x = 0; x < texture->width; x++) - colofs[x] = LONG(LONG(colofs[x]) + 3); + *(UINT32 *)&colofs[x<<2] = LONG(LONG(*(UINT32 *)&colofs[x<<2]) + 3); goto done; } @@ -560,8 +560,8 @@ static UINT8 *R_GenerateTexture(size_t texnum) memset(block, TRANSPARENTPIXEL, blocksize+1); // Transparency hack // columns lookup table - colofs = (UINT32 *)(void *)block; - texturecolumnofs[texnum] = colofs; + colofs = block; + texturecolumnofs[texnum] = (UINT32 *)colofs; // texture data after the lookup table blocktex = block + (texture->width*4); @@ -616,8 +616,8 @@ static UINT8 *R_GenerateTexture(size_t texnum) patchcol = (column_t *)((UINT8 *)realpatch + LONG(realpatch->columnofs[x-x1])); // generate column ofset lookup - colofs[x] = LONG((x * texture->height) + (texture->width*4)); - ColumnDrawerPointer(patchcol, block + LONG(colofs[x]), patch, texture->height, height); + *(UINT32 *)&colofs[x<<2] = LONG((x * texture->height) + (texture->width*4)); + ColumnDrawerPointer(patchcol, block + LONG(*(UINT32 *)&colofs[x<<2]), patch, texture->height, height); } } From d2a7a87c7f39bd423fde7f8b4228082d12839583 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 7 Nov 2019 16:30:29 -0800 Subject: [PATCH 39/50] Fix nonpacked to packed cast for OpenGL --- src/hardware/hw_cache.c | 51 ++++++++++++------------- src/hardware/hw_data.h | 4 +- src/hardware/hw_light.c | 27 +++++++------- src/hardware/hw_md2.c | 82 ++++++++++++++++++++--------------------- src/w_wad.c | 8 ++-- 5 files changed, 87 insertions(+), 85 deletions(-) diff --git a/src/hardware/hw_cache.c b/src/hardware/hw_cache.c index 5cfd0f61c..b74f949a5 100644 --- a/src/hardware/hw_cache.c +++ b/src/hardware/hw_cache.c @@ -825,10 +825,10 @@ static void FreeMipmapColormap(INT32 patchnum, void *patch) { GLPatch_t* const grpatch = patch; (void)patchnum; //unused - while (grpatch->mipmap.nextcolormap) + while (grpatch->mipmap->nextcolormap) { - GLMipmap_t *grmip = grpatch->mipmap.nextcolormap; - grpatch->mipmap.nextcolormap = grmip->nextcolormap; + GLMipmap_t *grmip = grpatch->mipmap->nextcolormap; + grpatch->mipmap->nextcolormap = grmip->nextcolormap; if (grmip->grInfo.data) Z_Free(grmip->grInfo.data); free(grmip); } @@ -1005,7 +1005,7 @@ void HWR_GetFlat(lumpnum_t flatlumpnum) { GLMipmap_t *grmip; - grmip = &HWR_GetCachedGLPatch(flatlumpnum)->mipmap; + grmip = HWR_GetCachedGLPatch(flatlumpnum)->mipmap; if (!grmip->downloaded && !grmip->grInfo.data) HWR_CacheFlat(grmip, flatlumpnum); @@ -1088,22 +1088,22 @@ static void HWR_LoadMappedPatch(GLMipmap_t *grmip, GLPatch_t *gpatch) void HWR_GetPatch(GLPatch_t *gpatch) { // is it in hardware cache - if (!gpatch->mipmap.downloaded && !gpatch->mipmap.grInfo.data) + if (!gpatch->mipmap->downloaded && !gpatch->mipmap->grInfo.data) { // load the software patch, PU_STATIC or the Z_Malloc for hardware patch will // flush the software patch before the conversion! oh yeah I suffered patch_t *ptr = W_CacheLumpNumPwad(gpatch->wadnum, gpatch->lumpnum, PU_STATIC); - HWR_MakePatch(ptr, gpatch, &gpatch->mipmap, true); + HWR_MakePatch(ptr, gpatch, gpatch->mipmap, true); // this is inefficient.. but the hardware patch in heap is purgeable so it should // not fragment memory, and besides the REAL cache here is the hardware memory Z_Free(ptr); } - HWD.pfnSetTexture(&gpatch->mipmap); + HWD.pfnSetTexture(gpatch->mipmap); // The system-memory patch data can be purged now. - Z_ChangeTag(gpatch->mipmap.grInfo.data, PU_HWRCACHE_UNLOCKED); + Z_ChangeTag(gpatch->mipmap->grInfo.data, PU_HWRCACHE_UNLOCKED); } @@ -1123,7 +1123,7 @@ void HWR_GetMappedPatch(GLPatch_t *gpatch, const UINT8 *colormap) // search for the mimmap // skip the first (no colormap translated) - for (grmip = &gpatch->mipmap; grmip->nextcolormap; ) + for (grmip = gpatch->mipmap; grmip->nextcolormap; ) { grmip = grmip->nextcolormap; if (grmip->colormap == colormap) @@ -1153,7 +1153,7 @@ void HWR_UnlockCachedPatch(GLPatch_t *gpatch) if (!gpatch) return; - Z_ChangeTag(gpatch->mipmap.grInfo.data, PU_HWRCACHE_UNLOCKED); + Z_ChangeTag(gpatch->mipmap->grInfo.data, PU_HWRCACHE_UNLOCKED); Z_ChangeTag(gpatch, PU_HWRPATCHINFO_UNLOCKED); } @@ -1241,7 +1241,7 @@ GLPatch_t *HWR_GetPic(lumpnum_t lumpnum) grpatch = HWR_GetCachedGLPatch(lumpnum); - if (!grpatch->mipmap.downloaded && !grpatch->mipmap.grInfo.data) + if (!grpatch->mipmap->downloaded && !grpatch->mipmap->grInfo.data) { pic_t *pic; UINT8 *block; @@ -1257,19 +1257,19 @@ GLPatch_t *HWR_GetPic(lumpnum_t lumpnum) grpatch->topoffset = 0; // find the good 3dfx size (boring spec) - HWR_ResizeBlock (grpatch->width, grpatch->height, &grpatch->mipmap.grInfo); - grpatch->mipmap.width = (UINT16)blockwidth; - grpatch->mipmap.height = (UINT16)blockheight; + HWR_ResizeBlock (grpatch->width, grpatch->height, &grpatch->mipmap->grInfo); + grpatch->mipmap->width = (UINT16)blockwidth; + grpatch->mipmap->height = (UINT16)blockheight; if (pic->mode == PALETTE) - grpatch->mipmap.grInfo.format = textureformat; // can be set by driver + grpatch->mipmap->grInfo.format = textureformat; // can be set by driver else - grpatch->mipmap.grInfo.format = picmode2GR[pic->mode]; + grpatch->mipmap->grInfo.format = picmode2GR[pic->mode]; - Z_Free(grpatch->mipmap.grInfo.data); + Z_Free(grpatch->mipmap->grInfo.data); // allocate block - block = MakeBlock(&grpatch->mipmap); + block = MakeBlock(grpatch->mipmap); // if rounddown, rounddown patches as well as textures if (cv_grrounddown.value) @@ -1299,25 +1299,25 @@ GLPatch_t *HWR_GetPic(lumpnum_t lumpnum) if (grpatch->width == blockwidth && grpatch->height == blockheight && - format2bpp[grpatch->mipmap.grInfo.format] == format2bpp[picmode2GR[pic->mode]]) + format2bpp[grpatch->mipmap->grInfo.format] == format2bpp[picmode2GR[pic->mode]]) { // no conversion needed - M_Memcpy(grpatch->mipmap.grInfo.data, pic->data,len); + M_Memcpy(grpatch->mipmap->grInfo.data, pic->data,len); } else HWR_DrawPicInCache(block, newwidth, newheight, - blockwidth*format2bpp[grpatch->mipmap.grInfo.format], + blockwidth*format2bpp[grpatch->mipmap->grInfo.format], pic, - format2bpp[grpatch->mipmap.grInfo.format]); + format2bpp[grpatch->mipmap->grInfo.format]); Z_Unlock(pic); Z_ChangeTag(block, PU_HWRCACHE_UNLOCKED); - grpatch->mipmap.flags = 0; + grpatch->mipmap->flags = 0; grpatch->max_s = (float)newwidth / (float)blockwidth; grpatch->max_t = (float)newheight / (float)blockheight; } - HWD.pfnSetTexture(&grpatch->mipmap); + HWD.pfnSetTexture(grpatch->mipmap); //CONS_Debug(DBG_RENDER, "picloaded at %x as texture %d\n",grpatch->mipmap.grInfo.data, grpatch->mipmap.downloaded); return grpatch; @@ -1333,6 +1333,7 @@ GLPatch_t *HWR_GetCachedGLPatchPwad(UINT16 wadnum, UINT16 lumpnum) grpatch = Z_Calloc(sizeof(GLPatch_t), PU_HWRPATCHINFO, NULL); grpatch->wadnum = wadnum; grpatch->lumpnum = lumpnum; + grpatch->mipmap = Z_Calloc(sizeof(GLMipmap_t), PU_HWRPATCHINFO, NULL); M_AATreeSet(hwrcache, lumpnum, grpatch); } @@ -1436,7 +1437,7 @@ void HWR_GetFadeMask(lumpnum_t fademasklumpnum) { GLMipmap_t *grmip; - grmip = &HWR_GetCachedGLPatch(fademasklumpnum)->mipmap; + grmip = HWR_GetCachedGLPatch(fademasklumpnum)->mipmap; if (!grmip->downloaded && !grmip->grInfo.data) HWR_CacheFadeMask(grmip, fademasklumpnum); diff --git a/src/hardware/hw_data.h b/src/hardware/hw_data.h index 44929dd67..629861c23 100644 --- a/src/hardware/hw_data.h +++ b/src/hardware/hw_data.h @@ -83,8 +83,8 @@ struct GLPatch_s float max_s,max_t; UINT16 wadnum; // the software patch lump num for when the hardware patch UINT16 lumpnum; // was flushed, and we need to re-create it - GLMipmap_t mipmap; -}; + GLMipmap_t *mipmap; +} ATTRPACK; typedef struct GLPatch_s GLPatch_t; #endif //_HWR_DATA_ diff --git a/src/hardware/hw_light.c b/src/hardware/hw_light.c index 8f62f7763..491cb739f 100644 --- a/src/hardware/hw_light.c +++ b/src/hardware/hw_light.c @@ -1205,7 +1205,8 @@ void HWR_DL_AddLight(gr_vissprite_t *spr, GLPatch_t *patch) dynlights->nb++; } -static GLPatch_t lightmappatch; +static GLMipmap_t lightmappatchmipmap; +static GLPatch_t lightmappatch = { .mipmap = &lightmappatchmipmap }; void HWR_InitLight(void) { @@ -1215,7 +1216,7 @@ void HWR_InitLight(void) for (i = 0;i < NUMLIGHTS;i++) lspr[i].dynamic_sqrradius = lspr[i].dynamic_radius*lspr[i].dynamic_radius; - lightmappatch.mipmap.downloaded = false; + lightmappatch.mipmap->downloaded = false; coronalumpnum = W_CheckNumForName("CORONA"); } @@ -1226,10 +1227,10 @@ static void HWR_SetLight(void) { int i, j; - if (!lightmappatch.mipmap.downloaded && !lightmappatch.mipmap.grInfo.data) + if (!lightmappatch.mipmap->downloaded && !lightmappatch.mipmap->grInfo.data) { - UINT16 *Data = Z_Malloc(129*128*sizeof (UINT16), PU_HWRCACHE, &lightmappatch.mipmap.grInfo.data); + UINT16 *Data = Z_Malloc(129*128*sizeof (UINT16), PU_HWRCACHE, &lightmappatch.mipmap->grInfo.data); for (i = 0; i < 128; i++) { @@ -1242,23 +1243,23 @@ static void HWR_SetLight(void) Data[i*128+j] = 0; } } - lightmappatch.mipmap.grInfo.format = GR_TEXFMT_ALPHA_INTENSITY_88; + lightmappatch.mipmap->grInfo.format = GR_TEXFMT_ALPHA_INTENSITY_88; lightmappatch.width = 128; lightmappatch.height = 128; - lightmappatch.mipmap.width = 128; - lightmappatch.mipmap.height = 128; + lightmappatch.mipmap->width = 128; + lightmappatch.mipmap->height = 128; #ifdef GLIDE_API_COMPATIBILITY - lightmappatch.mipmap.grInfo.smallLodLog2 = GR_LOD_LOG2_128; - lightmappatch.mipmap.grInfo.largeLodLog2 = GR_LOD_LOG2_128; - lightmappatch.mipmap.grInfo.aspectRatioLog2 = GR_ASPECT_LOG2_1x1; + lightmappatch.mipmap->grInfo.smallLodLog2 = GR_LOD_LOG2_128; + lightmappatch.mipmap->grInfo.largeLodLog2 = GR_LOD_LOG2_128; + lightmappatch.mipmap->grInfo.aspectRatioLog2 = GR_ASPECT_LOG2_1x1; #endif - lightmappatch.mipmap.flags = 0; //TF_WRAPXY; // DEBUG: view the overdraw ! + lightmappatch.mipmap->flags = 0; //TF_WRAPXY; // DEBUG: view the overdraw ! } - HWD.pfnSetTexture(&lightmappatch.mipmap); + HWD.pfnSetTexture(lightmappatch.mipmap); // The system-memory data can be purged now. - Z_ChangeTag(lightmappatch.mipmap.grInfo.data, PU_HWRCACHE_UNLOCKED); + Z_ChangeTag(lightmappatch.mipmap->grInfo.data, PU_HWRCACHE_UNLOCKED); } //********************************************************** diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index b847fdbc3..b53b17fcc 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -567,7 +567,7 @@ static GrTextureFormat_t PNG_Load(const char *filename, int *w, int *h, GLPatch_ //CONS_Debug(DBG_RENDER, "libpng load error on %s\n", filename); png_destroy_read_struct(&png_ptr, &png_info_ptr, NULL); fclose(png_FILE); - Z_Free(grpatch->mipmap.grInfo.data); + Z_Free(grpatch->mipmap->grInfo.data); return 0; } #ifdef USE_FAR_KEYWORD @@ -608,7 +608,7 @@ static GrTextureFormat_t PNG_Load(const char *filename, int *w, int *h, GLPatch_ { png_uint_32 i, pitch = png_get_rowbytes(png_ptr, png_info_ptr); - png_bytep PNG_image = Z_Malloc(pitch*height, PU_HWRCACHE, &grpatch->mipmap.grInfo.data); + png_bytep PNG_image = Z_Malloc(pitch*height, PU_HWRCACHE, &grpatch->mipmap->grInfo.data); png_bytepp row_pointers = png_malloc(png_ptr, height * sizeof (png_bytep)); for (i = 0; i < height; i++) row_pointers[i] = PNG_image + i*pitch; @@ -682,7 +682,7 @@ static GrTextureFormat_t PCX_Load(const char *filename, int *w, int *h, pw = *w = header.xmax - header.xmin + 1; ph = *h = header.ymax - header.ymin + 1; - image = Z_Malloc(pw*ph*4, PU_HWRCACHE, &grpatch->mipmap.grInfo.data); + image = Z_Malloc(pw*ph*4, PU_HWRCACHE, &grpatch->mipmap->grInfo.data); if (fread(palette, sizeof (UINT8), PALSIZE, file) != PALSIZE) { @@ -730,39 +730,39 @@ static void md2_loadTexture(md2_t *model) if (model->grpatch) { grpatch = model->grpatch; - Z_Free(grpatch->mipmap.grInfo.data); + Z_Free(grpatch->mipmap->grInfo.data); } else grpatch = Z_Calloc(sizeof *grpatch, PU_HWRPATCHINFO, &(model->grpatch)); - if (!grpatch->mipmap.downloaded && !grpatch->mipmap.grInfo.data) + if (!grpatch->mipmap->downloaded && !grpatch->mipmap->grInfo.data) { int w = 0, h = 0; #ifdef HAVE_PNG - grpatch->mipmap.grInfo.format = PNG_Load(filename, &w, &h, grpatch); - if (grpatch->mipmap.grInfo.format == 0) + grpatch->mipmap->grInfo.format = PNG_Load(filename, &w, &h, grpatch); + if (grpatch->mipmap->grInfo.format == 0) #endif - grpatch->mipmap.grInfo.format = PCX_Load(filename, &w, &h, grpatch); - if (grpatch->mipmap.grInfo.format == 0) + grpatch->mipmap->grInfo.format = PCX_Load(filename, &w, &h, grpatch); + if (grpatch->mipmap->grInfo.format == 0) return; - grpatch->mipmap.downloaded = 0; - grpatch->mipmap.flags = 0; + grpatch->mipmap->downloaded = 0; + grpatch->mipmap->flags = 0; grpatch->width = (INT16)w; grpatch->height = (INT16)h; - grpatch->mipmap.width = (UINT16)w; - grpatch->mipmap.height = (UINT16)h; + grpatch->mipmap->width = (UINT16)w; + grpatch->mipmap->height = (UINT16)h; #ifdef GLIDE_API_COMPATIBILITY // not correct! - grpatch->mipmap.grInfo.smallLodLog2 = GR_LOD_LOG2_256; - grpatch->mipmap.grInfo.largeLodLog2 = GR_LOD_LOG2_256; - grpatch->mipmap.grInfo.aspectRatioLog2 = GR_ASPECT_LOG2_1x1; + grpatch->mipmap->grInfo.smallLodLog2 = GR_LOD_LOG2_256; + grpatch->mipmap->grInfo.largeLodLog2 = GR_LOD_LOG2_256; + grpatch->mipmap->grInfo.aspectRatioLog2 = GR_ASPECT_LOG2_1x1; #endif } - HWD.pfnSetTexture(&grpatch->mipmap); + HWD.pfnSetTexture(grpatch->mipmap); HWR_UnlockCachedPatch(grpatch); } @@ -780,42 +780,42 @@ static void md2_loadBlendTexture(md2_t *model) if (model->blendgrpatch) { grpatch = model->blendgrpatch; - Z_Free(grpatch->mipmap.grInfo.data); + Z_Free(grpatch->mipmap->grInfo.data); } else grpatch = Z_Calloc(sizeof *grpatch, PU_HWRPATCHINFO, &(model->blendgrpatch)); - if (!grpatch->mipmap.downloaded && !grpatch->mipmap.grInfo.data) + if (!grpatch->mipmap->downloaded && !grpatch->mipmap->grInfo.data) { int w = 0, h = 0; #ifdef HAVE_PNG - grpatch->mipmap.grInfo.format = PNG_Load(filename, &w, &h, grpatch); - if (grpatch->mipmap.grInfo.format == 0) + grpatch->mipmap->grInfo.format = PNG_Load(filename, &w, &h, grpatch); + if (grpatch->mipmap->grInfo.format == 0) #endif - grpatch->mipmap.grInfo.format = PCX_Load(filename, &w, &h, grpatch); - if (grpatch->mipmap.grInfo.format == 0) + grpatch->mipmap->grInfo.format = PCX_Load(filename, &w, &h, grpatch); + if (grpatch->mipmap->grInfo.format == 0) { Z_Free(filename); return; } - grpatch->mipmap.downloaded = 0; - grpatch->mipmap.flags = 0; + grpatch->mipmap->downloaded = 0; + grpatch->mipmap->flags = 0; grpatch->width = (INT16)w; grpatch->height = (INT16)h; - grpatch->mipmap.width = (UINT16)w; - grpatch->mipmap.height = (UINT16)h; + grpatch->mipmap->width = (UINT16)w; + grpatch->mipmap->height = (UINT16)h; #ifdef GLIDE_API_COMPATIBILITY // not correct! - grpatch->mipmap.grInfo.smallLodLog2 = GR_LOD_LOG2_256; - grpatch->mipmap.grInfo.largeLodLog2 = GR_LOD_LOG2_256; - grpatch->mipmap.grInfo.aspectRatioLog2 = GR_ASPECT_LOG2_1x1; + grpatch->mipmap->grInfo.smallLodLog2 = GR_LOD_LOG2_256; + grpatch->mipmap->grInfo.largeLodLog2 = GR_LOD_LOG2_256; + grpatch->mipmap->grInfo.aspectRatioLog2 = GR_ASPECT_LOG2_1x1; #endif } - HWD.pfnSetTexture(&grpatch->mipmap); // We do need to do this so that it can be cleared and knows to recreate it when necessary + HWD.pfnSetTexture(grpatch->mipmap); // We do need to do this so that it can be cleared and knows to recreate it when necessary HWR_UnlockCachedPatch(grpatch); Z_Free(filename); @@ -1029,8 +1029,8 @@ static void HWR_CreateBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, cur = Z_Malloc(size*4, PU_HWRCACHE, &grmip->grInfo.data); memset(cur, 0x00, size*4); - image = gpatch->mipmap.grInfo.data; - blendimage = blendgpatch->mipmap.grInfo.data; + image = gpatch->mipmap->grInfo.data; + blendimage = blendgpatch->mipmap->grInfo.data; // Average all of the translation's colors if (color == SKINCOLOR_NONE || color >= MAXTRANSLATIONS) @@ -1145,13 +1145,13 @@ static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, INT if (colormap == colormaps || colormap == NULL) { // Don't do any blending - HWD.pfnSetTexture(&gpatch->mipmap); + HWD.pfnSetTexture(gpatch->mipmap); return; } // search for the mimmap // skip the first (no colormap translated) - for (grmip = &gpatch->mipmap; grmip->nextcolormap; ) + for (grmip = gpatch->mipmap; grmip->nextcolormap; ) { grmip = grmip->nextcolormap; if (grmip->colormap == colormap) @@ -1371,18 +1371,18 @@ void HWR_DrawMD2(gr_vissprite_t *spr) finalscale = md2->scale; //Hurdler: arf, I don't like that implementation at all... too much crappy gpatch = md2->grpatch; - if (!gpatch || !gpatch->mipmap.grInfo.format || !gpatch->mipmap.downloaded) + if (!gpatch || !gpatch->mipmap->grInfo.format || !gpatch->mipmap->downloaded) md2_loadTexture(md2); gpatch = md2->grpatch; // Load it again, because it isn't being loaded into gpatch after md2_loadtexture... - if ((gpatch && gpatch->mipmap.grInfo.format) // don't load the blend texture if the base texture isn't available - && (!md2->blendgrpatch || !((GLPatch_t *)md2->blendgrpatch)->mipmap.grInfo.format || !((GLPatch_t *)md2->blendgrpatch)->mipmap.downloaded)) + if ((gpatch && gpatch->mipmap->grInfo.format) // don't load the blend texture if the base texture isn't available + && (!md2->blendgrpatch || !((GLPatch_t *)md2->blendgrpatch)->mipmap->grInfo.format || !((GLPatch_t *)md2->blendgrpatch)->mipmap->downloaded)) md2_loadBlendTexture(md2); - if (gpatch && gpatch->mipmap.grInfo.format) // else if meant that if a texture couldn't be loaded, it would just end up using something else's texture + if (gpatch && gpatch->mipmap->grInfo.format) // else if meant that if a texture couldn't be loaded, it would just end up using something else's texture { if ((skincolors_t)spr->mobj->color != SKINCOLOR_NONE && - md2->blendgrpatch && ((GLPatch_t *)md2->blendgrpatch)->mipmap.grInfo.format + md2->blendgrpatch && ((GLPatch_t *)md2->blendgrpatch)->mipmap->grInfo.format && gpatch->width == ((GLPatch_t *)md2->blendgrpatch)->width && gpatch->height == ((GLPatch_t *)md2->blendgrpatch)->height) { INT32 skinnum = TC_DEFAULT; @@ -1413,7 +1413,7 @@ void HWR_DrawMD2(gr_vissprite_t *spr) else { // This is safe, since we know the texture has been downloaded - HWD.pfnSetTexture(&gpatch->mipmap); + HWD.pfnSetTexture(gpatch->mipmap); } } else diff --git a/src/w_wad.c b/src/w_wad.c index 51c77fd87..18781070c 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -1565,22 +1565,22 @@ void *W_CachePatchNumPwad(UINT16 wad, UINT16 lump, INT32 tag) grPatch = HWR_GetCachedGLPatchPwad(wad, lump); - if (grPatch->mipmap.grInfo.data) + if (grPatch->mipmap->grInfo.data) { if (tag == PU_CACHE) tag = PU_HWRCACHE; - Z_ChangeTag(grPatch->mipmap.grInfo.data, tag); + Z_ChangeTag(grPatch->mipmap->grInfo.data, tag); } else { patch_t *ptr = NULL; // Only load the patch if we haven't initialised the grPatch yet - if (grPatch->mipmap.width == 0) + if (grPatch->mipmap->width == 0) ptr = W_CacheLumpNumPwad(grPatch->wadnum, grPatch->lumpnum, PU_STATIC); // Run HWR_MakePatch in all cases, to recalculate some things - HWR_MakePatch(ptr, grPatch, &grPatch->mipmap, false); + HWR_MakePatch(ptr, grPatch, grPatch->mipmap, false); Z_Free(ptr); } From 99cd5161becec131099c64dddd2be6beafb538cc Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 7 Nov 2019 18:04:53 -0800 Subject: [PATCH 40/50] Also allocate mipmap for MD2 --- src/hardware/hw_md2.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index b53b17fcc..8e0de38a6 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -733,8 +733,11 @@ static void md2_loadTexture(md2_t *model) Z_Free(grpatch->mipmap->grInfo.data); } else + { grpatch = Z_Calloc(sizeof *grpatch, PU_HWRPATCHINFO, &(model->grpatch)); + grpatch->mipmap = Z_Calloc(sizeof (GLMipmap_t), PU_HWRPATCHINFO, NULL); + } if (!grpatch->mipmap->downloaded && !grpatch->mipmap->grInfo.data) { @@ -783,8 +786,11 @@ static void md2_loadBlendTexture(md2_t *model) Z_Free(grpatch->mipmap->grInfo.data); } else + { grpatch = Z_Calloc(sizeof *grpatch, PU_HWRPATCHINFO, &(model->blendgrpatch)); + grpatch->mipmap = Z_Calloc(sizeof (GLMipmap_t), PU_HWRPATCHINFO, NULL); + } if (!grpatch->mipmap->downloaded && !grpatch->mipmap->grInfo.data) { From 6ac613b2ca1bbf30f76082c672cda0a4b2a6c579 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 7 Nov 2019 18:27:06 -0800 Subject: [PATCH 41/50] Move this "skin wads" check so that PK3 can work with it --- src/r_things.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/r_things.c b/src/r_things.c index 00eaae1c2..fb30fb6db 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -400,10 +400,6 @@ void R_AddSpriteDefs(UINT16 wadnum) start = W_CheckNumForNamePwad("S_START", wadnum, 0); if (start == INT16_MAX) start = W_CheckNumForNamePwad("SS_START", wadnum, 0); //deutex compatib. - if (start == INT16_MAX) - start = 0; //let say S_START is lump 0 - else - start++; // just after S_START end = W_CheckNumForNamePwad("S_END",wadnum,start); if (end == INT16_MAX) @@ -417,9 +413,16 @@ void R_AddSpriteDefs(UINT16 wadnum) return; } - // ignore skin wads (we don't want skin sprites interfering with vanilla sprites) - if (start == 0 && W_CheckNumForNamePwad("S_SKIN", wadnum, 0) != UINT16_MAX) - return; + if (start == INT16_MAX) + { + // ignore skin wads (we don't want skin sprites interfering with vanilla sprites) + if (W_CheckNumForNamePwad("S_SKIN", wadnum, 0) != UINT16_MAX) + return; + + start = 0; //let say S_START is lump 0 + } + else + start++; // just after S_START if (end == INT16_MAX) { From 8203c6ae90348f38db94ad0fa6b5edae3ef33fe5 Mon Sep 17 00:00:00 2001 From: lachwright Date: Fri, 8 Nov 2019 20:09:12 +0800 Subject: [PATCH 42/50] Add support for custom sign color with var2 (shortcut for requests I sometimes got from character spriters in 2.1, e.g. neon green Pointy Sonic using a purple sign) --- src/p_enemy.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 1abf1271e..efeadda2f 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5070,14 +5070,15 @@ void A_SignSpin(mobj_t *actor) // Also used to display Eggman or the skin roulette whilst spinning. // // var1 = number of skin to display (e.g. 2 = Knuckles; special cases: -1 = target's skin, -2 = skin roulette, -3 = Eggman) -// var2 = unused +// var2 = custom sign color, if desired. // void A_SignPlayer(mobj_t *actor) { INT32 locvar1 = var1; + INT32 locvar2 = var2; skin_t *skin = NULL; mobj_t *ov; - UINT8 facecolor, signcolor; + UINT8 facecolor, signcolor = (UINT8)locvar2; UINT32 signframe = states[actor->info->raisestate].frame; #ifdef HAVE_BLUA @@ -5109,7 +5110,9 @@ void A_SignPlayer(mobj_t *actor) skin = &skins[actor->target->player->skin]; facecolor = actor->target->player->skincolor; - if ((actor->target->player->skincolor == skin->prefcolor) && (skin->prefoppositecolor)) // Set it as the skin's preferred oppositecolor? + if (signcolor) + ; + else if ((actor->target->player->skincolor == skin->prefcolor) && (skin->prefoppositecolor)) // Set it as the skin's preferred oppositecolor? { signcolor = skin->prefoppositecolor; /* @@ -5154,7 +5157,9 @@ void A_SignPlayer(mobj_t *actor) } facecolor = skin->prefcolor; - if (skin->prefoppositecolor) + if (signcolor) + ; + else if (skin->prefoppositecolor) { signcolor = skin->prefoppositecolor; } @@ -5177,7 +5182,10 @@ void A_SignPlayer(mobj_t *actor) { ov->color = SKINCOLOR_NONE; P_SetMobjState(ov, actor->info->meleestate); // S_EGGMANSIGN - actor->tracer->color = signcolor = SKINCOLOR_CARBON; + if (signcolor) + acotor->tracer->color = signcolor; + else + actor->tracer->color = signcolor = SKINCOLOR_CARBON; actor->tracer->frame = signframe += (15 - Color_Opposite[Color_Opposite[signcolor - 1][0] - 1][1]); } } From 3734eab7b618cd2946bd5d445de85829b6041be1 Mon Sep 17 00:00:00 2001 From: lachwright Date: Sat, 9 Nov 2019 00:47:51 +0800 Subject: [PATCH 43/50] Add signpost camera (and fix a typo whoops) --- src/p_enemy.c | 2 +- src/p_spec.c | 6 ++++++ src/p_user.c | 52 ++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index efeadda2f..30c5b88fb 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5183,7 +5183,7 @@ void A_SignPlayer(mobj_t *actor) ov->color = SKINCOLOR_NONE; P_SetMobjState(ov, actor->info->meleestate); // S_EGGMANSIGN if (signcolor) - acotor->tracer->color = signcolor; + actor->tracer->color = signcolor; else actor->tracer->color = signcolor = SKINCOLOR_CARBON; actor->tracer->frame = signframe += (15 - Color_Opposite[Color_Opposite[signcolor - 1][0] - 1][1]); diff --git a/src/p_spec.c b/src/p_spec.c index 02aeda4fd..366377bed 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4054,6 +4054,9 @@ void P_SetupSignExit(player_t *player) if (thing->type != MT_SIGN) continue; + if (!player->mo->target || player->mo->target->type != MT_SIGN) + P_SetTarget(&player->mo->target, thing); + if (thing->state != &states[thing->info->spawnstate]) continue; @@ -4080,6 +4083,9 @@ void P_SetupSignExit(player_t *player) if (thing->type != MT_SIGN) continue; + if (!player->mo->target || player->mo->target->type != MT_SIGN) + P_SetTarget(&player->mo->target, thing); + if (thing->state != &states[thing->info->spawnstate]) continue; diff --git a/src/p_user.c b/src/p_user.c index 561183cd5..a31657383 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -9501,7 +9501,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall fixed_t x, y, z, dist, distxy, distz, checkdist, viewpointx, viewpointy, camspeed, camdist, camheight, pviewheight, slopez = 0; INT32 camrotate; boolean camstill, cameranoclip, camorbit; - mobj_t *mo; + mobj_t *mo, *sign = NULL; subsector_t *newsubsec; fixed_t f1, f2; @@ -9511,6 +9511,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall mo = player->mo; + if (player->exiting && mo->target && mo->target->type == MT_SIGN) + sign = mo->target; + cameranoclip = (player->powers[pw_carry] == CR_NIGHTSMODE || player->pflags & PF_NOCLIP) || (mo->flags & (MF_NOCLIP|MF_NOCLIPHEIGHT)); // Noclipping player camera noclips too!! if (!(player->climbing || (player->powers[pw_carry] == CR_NIGHTSMODE) || player->playerstate == PST_DEAD || tutorialmode)) @@ -9557,6 +9560,11 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall focusangle = mo->angle; focusaiming = 0; } + else if (sign) + { + focusangle = FixedAngle(sign->spawnpoint->angle << FRACBITS) + ANGLE_180; + focusaiming = 0; + } else if (player == &players[consoleplayer]) { focusangle = localangle; @@ -9705,6 +9713,12 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall camheight = FixedMul(camheight, 6*FRACUNIT/5); } + if (sign) + { + camheight = mo->scale << 7; + camspeed = FRACUNIT/12; + } + if (player->climbing || player->exiting || player->playerstate == PST_DEAD || (player->powers[pw_carry] == CR_ROPEHANG || player->powers[pw_carry] == CR_GENERIC || player->powers[pw_carry] == CR_MACESPIN)) dist <<= 1; } @@ -9751,8 +9765,16 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall distz = slopez; } - x = mo->x - FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), distxy); - y = mo->y - FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), distxy); + if (sign) + { + x = sign->x - FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), distxy); + y = sign->y - FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), distxy); + } + else + { + x = mo->x - FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), distxy); + y = mo->y - FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), distxy); + } #if 0 if (twodlevel || (mo->flags2 & MF2_TWOD)) @@ -9997,14 +10019,30 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall // point viewed by the camera // this point is just 64 unit forward the player dist = FixedMul(64 << FRACBITS, mo->scale); - viewpointx = mo->x + FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); - viewpointy = mo->y + FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + if (sign) + { + viewpointx = sign->x + FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + viewpointy = sign->y + FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + } + else + { + viewpointx = mo->x + FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + viewpointy = mo->y + FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + } if (!camstill && !resetcalled && !paused) thiscam->angle = R_PointToAngle2(thiscam->x, thiscam->y, viewpointx, viewpointy); - viewpointx = mo->x + FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); - viewpointy = mo->y + FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + if (sign) + { + viewpointx = sign->x + FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + viewpointy = sign->y + FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + } + else + { + viewpointx = mo->x + FixedMul(FINECOSINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + viewpointy = mo->y + FixedMul(FINESINE((angle>>ANGLETOFINESHIFT) & FINEMASK), dist); + } /* if (twodlevel || (mo->flags2 & MF2_TWOD)) From 24e5ccec0b4d777d4dfe97cf224637ba04a7685f Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 8 Nov 2019 19:40:40 +0000 Subject: [PATCH 44/50] Fix players being launched by slopes and pmomz when dying. --- src/p_inter.c | 2 ++ src/p_mobj.c | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/p_inter.c b/src/p_inter.c index 9017f795d..70ea1324c 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2482,6 +2482,8 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget P_UnsetThingPosition(target); target->flags |= MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY; P_SetThingPosition(target); + target->standingslope = NULL; + target->pmomz = 0; if (target->player->powers[pw_super]) { diff --git a/src/p_mobj.c b/src/p_mobj.c index 5735dc27b..ab29926c7 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1861,6 +1861,9 @@ void P_XYMovement(mobj_t *mo) oldy = mo->y; #ifdef ESLOPE + if (mo->flags & MF_NOCLIPHEIGHT) + mo->standingslope = NULL; + // adjust various things based on slope if (mo->standingslope && abs(mo->standingslope->zdelta) > FRACUNIT>>8) { if (!P_IsObjectOnGround(mo)) { // We fell off at some point? Do the twisty thing! @@ -2051,7 +2054,7 @@ void P_XYMovement(mobj_t *mo) return; #ifdef ESLOPE - if (moved && oldslope) { // Check to see if we ran off + if (moved && oldslope && !(mo->flags & MF_NOCLIPHEIGHT)) { // Check to see if we ran off if (oldslope != mo->standingslope) { // First, compare different slopes angle_t oldangle, newangle; From d8b14e54c9290bf9fa4cb7de0b230ee044599102 Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 8 Nov 2019 21:43:39 +0000 Subject: [PATCH 45/50] Resolve #278. --- src/p_mobj.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 5735dc27b..e837fbd23 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2459,16 +2459,6 @@ static boolean P_ZMovement(mobj_t *mo) P_RemoveMobj(mo); return false; } - if (mo->momz - && !(mo->flags & MF_NOGRAVITY) - && ((!(mo->eflags & MFE_VERTICALFLIP) && mo->z <= mo->floorz) - || ((mo->eflags & MFE_VERTICALFLIP) && mo->z+mo->height >= mo->ceilingz))) - { - mo->flags |= MF_NOGRAVITY; - mo->momx = 8; // this is a hack which is used to ensure it still behaves as a missile and can damage others - mo->momy = mo->momz = 0; - mo->z = ((mo->eflags & MFE_VERTICALFLIP) ? mo->ceilingz-mo->height : mo->floorz); - } break; case MT_GOOP: if (P_CheckDeathPitCollide(mo)) @@ -9569,6 +9559,14 @@ void P_MobjThinker(mobj_t *mobj) else mobj->z = mobj->floorz; } + else if ((!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z <= mobj->floorz) + || ((mobj->eflags & MFE_VERTICALFLIP) && mobj->z+mobj->height >= mobj->ceilingz)) + { + mobj->flags |= MF_NOGRAVITY; + mobj->momx = 8; // this is a hack which is used to ensure it still behaves as a missile and can damage others + mobj->momy = mobj->momz = 0; + mobj->z = ((mobj->eflags & MFE_VERTICALFLIP) ? mobj->ceilingz-mobj->height : mobj->floorz); + } /* FALLTHRU */ default: // check mobj against possible water content, before movement code From aa20e304cffa98d3879ec83756b0e19d4547ca17 Mon Sep 17 00:00:00 2001 From: Louis-Antoine Date: Sat, 9 Nov 2019 15:46:34 +0100 Subject: [PATCH 46/50] Fix silly typo :P --- src/g_game.c | 2 +- src/p_inter.c | 2 +- src/p_map.c | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index e2f43e4f2..a411c9658 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2803,7 +2803,7 @@ void G_AddPlayer(INT32 playernum) countplayers++; - if (!players->exiting) + if (!players[i]->exiting) notexiting++; if (!(cv_coopstarposts.value && (gametype == GT_COOP) && (p->starpostnum < players[i].starpostnum))) diff --git a/src/p_inter.c b/src/p_inter.c index 9017f795d..b4a16ba84 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -633,7 +633,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (!(netgame || multiplayer)) { player->continues += 1; - players->gotcontinue = true; + player->gotcontinue = true; if (P_IsLocalPlayer(player)) S_StartSound(NULL, sfx_s3kac); else diff --git a/src/p_map.c b/src/p_map.c index 159489f70..bb56a50b1 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -540,7 +540,7 @@ static void P_DoFanAndGasJet(mobj_t *spring, mobj_t *object) static void P_DoPterabyteCarry(player_t *player, mobj_t *ptera) { - if (player->powers[pw_carry] && players->powers[pw_carry] != CR_ROLLOUT) + if (player->powers[pw_carry] && player->powers[pw_carry] != CR_ROLLOUT) return; if (ptera->extravalue1 != 1) return; // Not swooping @@ -1040,7 +1040,7 @@ static boolean PIT_CheckThing(mobj_t *thing) { if (tmthing->z > thing->z + thing->height || thing->z > tmthing->z + tmthing->height || !thing->health) return true; - + if (thing == tmthing->tracer) // don't collide with rider return true; @@ -1054,7 +1054,7 @@ static boolean PIT_CheckThing(mobj_t *thing) P_KillMobj(thing, tmthing, tmthing->tracer, 0); return true; } - + if (thing->type == tmthing->type // bounce against other rollout rocks && (tmthing->momx || tmthing->momy || thing->momx || thing->momy)) { From 068c71282425744c7b3a5879a8eed67e77250ea0 Mon Sep 17 00:00:00 2001 From: Louis-Antoine Date: Sat, 9 Nov 2019 17:24:10 +0100 Subject: [PATCH 47/50] Shut up --- src/g_game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index a411c9658..137992e4d 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2803,7 +2803,7 @@ void G_AddPlayer(INT32 playernum) countplayers++; - if (!players[i]->exiting) + if (!players[i].exiting) notexiting++; if (!(cv_coopstarposts.value && (gametype == GT_COOP) && (p->starpostnum < players[i].starpostnum))) From 26e534304d576169fc797e0e2c3c885b10f8313f Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 9 Nov 2019 16:43:44 +0000 Subject: [PATCH 48/50] Signed/unsigned comparison error --- src/p_enemy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 30c5b88fb..1e72c39e8 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -5038,7 +5038,7 @@ void A_SignSpin(mobj_t *actor) P_SetMobjState(actor, actor->info->deathstate); return; } - if (actor->state-states != actor->info->painstate) + if ((statenum_t)(actor->state-states) != actor->info->painstate) P_SetMobjState(actor, actor->info->painstate); actor->movedir = min((mapangle - actor->angle) >> 2, actor->movedir); } From 98b08580f5ff0366dcfffa7af4ca5797acf9da57 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 9 Nov 2019 17:17:05 +0000 Subject: [PATCH 49/50] Fix broken dehacked table. --- src/dehacked.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dehacked.c b/src/dehacked.c index a909b1858..a66428c92 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -5394,6 +5394,8 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_SIGNSPIN5", "S_SIGNSPIN6", "S_SIGNPLAYER", + "S_SIGNSLOW", + "S_SIGNSTOP", "S_SIGNBOARD", "S_EGGMANSIGN", From 8e2cb8857652d4ee4c20ae52d345c19813f8dcf3 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 9 Nov 2019 17:49:26 +0000 Subject: [PATCH 50/50] Lach wanted to do this, but we might have a release candidate before he gets back, so did it myself. Make the wall transfer while spinning PF_SPINNING|PF_THOKKED. This: * Prevents PF_MULTIABILITY players from using their ability after a wall transfer. * Has a more specialised case which allows players to roll after having wall-transferred while spinning. * (side effect) allows modders to apply PF_THOKKED any time for more controllable spinning. --- src/p_mobj.c | 2 +- src/p_user.c | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 5735dc27b..a8fd58108 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1991,7 +1991,7 @@ void P_XYMovement(mobj_t *mo) mo->momz = transfermomz; mo->standingslope = NULL; if (player->pflags & PF_SPINNING) - player->pflags = (player->pflags & ~PF_SPINNING) | (PF_JUMPED | PF_THOKKED); + player->pflags |= PF_THOKKED; } } #endif diff --git a/src/p_user.c b/src/p_user.c index 561183cd5..a98901ca4 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2225,8 +2225,8 @@ boolean P_PlayerHitFloor(player_t *player, boolean dorollstuff) { if (dorollstuff) { - if ((player->charability2 == CA2_SPINDASH) && !(player->pflags & PF_THOKKED) && (player->cmd.buttons & BT_USE) && (FixedHypot(player->mo->momx, player->mo->momy) > (5*player->mo->scale))) - player->pflags |= PF_SPINNING; + if ((player->charability2 == CA2_SPINDASH) && !((player->pflags & (PF_SPINNING|PF_THOKKED)) == PF_THOKKED) && (player->cmd.buttons & BT_USE) && (FixedHypot(player->mo->momx, player->mo->momy) > (5*player->mo->scale))) + player->pflags = (player->pflags|PF_SPINNING) & ~PF_THOKKED; else if (!(player->pflags & PF_STARTDASH)) player->pflags &= ~PF_SPINNING; } @@ -5767,7 +5767,7 @@ static void P_2dMovement(player_t *player) movepushforward >>= 1; // Proper air movement // Allow a bit of movement while spinning - if (player->pflags & PF_SPINNING) + if ((player->pflags & (PF_SPINNING|PF_THOKKED)) == PF_SPINNING) { if (!(player->pflags & PF_STARTDASH)) movepushforward = movepushforward/48; @@ -5794,7 +5794,7 @@ static void P_3dMovement(player_t *player) angle_t dangle; // replaces old quadrants bits fixed_t normalspd = FixedMul(player->normalspeed, player->mo->scale); boolean analogmove = false; - boolean spin = ((onground = P_IsObjectOnGround(player->mo)) && player->pflags & PF_SPINNING && (player->rmomx || player->rmomy) && !(player->pflags & PF_STARTDASH)); + boolean spin = ((onground = P_IsObjectOnGround(player->mo)) && (player->pflags & (PF_SPINNING|PF_THOKKED)) == PF_SPINNING && (player->rmomx || player->rmomy) && !(player->pflags & PF_STARTDASH)); fixed_t oldMagnitude, newMagnitude; #ifdef ESLOPE vector3_t totalthrust; @@ -5979,7 +5979,7 @@ static void P_3dMovement(player_t *player) movepushforward = cmd->forwardmove * (thrustfactor * acceleration); // Allow a bit of movement while spinning - if (player->pflags & PF_SPINNING) + if ((player->pflags & (PF_SPINNING|PF_THOKKED)) == PF_SPINNING) { if ((mforward && cmd->forwardmove > 0) || (mbackward && cmd->forwardmove < 0) || (player->pflags & PF_STARTDASH)) @@ -6020,7 +6020,7 @@ static void P_3dMovement(player_t *player) movepushforward = max(abs(cmd->sidemove), abs(cmd->forwardmove)) * (thrustfactor * acceleration); // Allow a bit of movement while spinning - if (player->pflags & PF_SPINNING) + if ((player->pflags & (PF_SPINNING|PF_THOKKED)) == PF_SPINNING) { if ((mforward && cmd->forwardmove > 0) || (mbackward && cmd->forwardmove < 0) || (player->pflags & PF_STARTDASH)) @@ -6055,11 +6055,11 @@ static void P_3dMovement(player_t *player) { movepushside >>= 2; // proper air movement // Reduce movepushslide even more if over "max" flight speed - if ((player->pflags & PF_SPINNING) || (player->powers[pw_tailsfly] && player->speed > topspeed)) + if (((player->pflags & (PF_SPINNING|PF_THOKKED)) == PF_SPINNING) || (player->powers[pw_tailsfly] && player->speed > topspeed)) movepushside >>= 2; } // Allow a bit of movement while spinning - else if (player->pflags & PF_SPINNING) + else if ((player->pflags & (PF_SPINNING|PF_THOKKED)) == PF_SPINNING) { if (player->pflags & PF_STARTDASH) movepushside = 0;