From 237d00f6fff3545c39fead0f84b97c62c408c0bf Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 12 Aug 2019 22:12:20 -0400 Subject: [PATCH 01/14] 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/14] 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 1ebcdb5344159cffab96939e5c3712e3e78dca01 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Sat, 2 Nov 2019 12:12:36 -0400 Subject: [PATCH 03/14] 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 04/14] 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 05/14] 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 06/14] 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 07/14] 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 08/14] 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 09/14] 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 10/14] 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 11/14] 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 12/14] 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 43fff92c82e5050d36f1da4bba24709c23e1cc24 Mon Sep 17 00:00:00 2001 From: mazmazz Date: Mon, 4 Nov 2019 02:43:48 -0500 Subject: [PATCH 13/14] 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 872e662618d85a138eefd982060d103d86fc5731 Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 7 Nov 2019 13:42:54 -0800 Subject: [PATCH 14/14] 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<