diff --git a/src/d_main.c b/src/d_main.c index 2ac28b32..9cf7467c 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -877,6 +877,14 @@ static void IdentifyVersion(void) D_AddFile(musicpath); else if (ms == 0) I_Error("File %s has been modified with non-music lumps",musicfile); + + const char* kmusicfile = "music.kart"; + const char* kmusicpath = va(pandf,srb2waddir,kmusicfile); + ms = W_VerifyNMUSlumps(kmusicpath); + if (ms == 1) + D_AddFile(kmusicpath); + else if (ms == 0) + I_Error("File %s has been modified with non-music lumps",kmusicfile); } #endif } diff --git a/src/f_finale.c b/src/f_finale.c index a79500d8..8faace23 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -43,7 +43,6 @@ static INT32 continuetime; // Short delay when continuing static tic_t animtimer; // Used for some animation timings static INT32 roidtics; // Asteroid spinning -static INT32 deplete; static tic_t stoptimer; static boolean keypressed = false; @@ -247,7 +246,7 @@ static void F_SkyScroll(INT32 scrollspeed) // ============= // INTRO SCENE // ============= -#define NUMINTROSCENES 16 +#define NUMINTROSCENES 1 INT32 intro_scenenum = 0; INT32 intro_curtime = 0; @@ -255,22 +254,7 @@ const char *introtext[NUMINTROSCENES]; static tic_t introscenetime[NUMINTROSCENES] = { - 7*TICRATE + (TICRATE/2), // STJr Presents - 11*TICRATE + (TICRATE/2), // Two months had passed since... - 15*TICRATE + (TICRATE/2), // As it was about to drain the rings... - 14*TICRATE, // What Sonic, Tails, and Knuckles... - 18*TICRATE, // About once every year, a strange... - 19*TICRATE + (TICRATE/2), // Curses! Eggman yelled. That ridiculous... - 19*TICRATE + (TICRATE/4), // It was only later that he had an idea... - 10*TICRATE + (TICRATE/2), // Before beginning his scheme, Eggman decided to give Sonic... - 16*TICRATE, // We're ready to fire in 15 seconds, the robot said... - 16*TICRATE, // Meanwhile, Sonic was tearing across the zones... - 16*TICRATE + (TICRATE/2), // Sonic knew he was getting closer to the city... - 17*TICRATE, // Greenflower City was gone... - 16*TICRATE + (TICRATE/2), // You're not quite as dead as we thought, huh?... - 18*TICRATE + (TICRATE/2), // Eggman took this as his cue and blasted off... - 16*TICRATE, // Easy! We go find Eggman and stop his... - 25*TICRATE, // I'm just finding what mission obje... + 8*TICRATE, // KART KR(eW }; // custom intros @@ -289,149 +273,6 @@ void F_StartIntro(void) introtext[0] = " #"; - introtext[1] = M_GetText( - "Two months had passed since Dr. Eggman\n" - "tried to take over the world using his\n" - "Ring Satellite.\n#"); - - introtext[2] = M_GetText( - "As it was about to drain the rings\n" - "away from the planet, Sonic burst into\n" - "the Satellite and for what he thought\n" - "would be the last time,\xB4 defeated\n" - "Dr. Eggman.\n#"); - - introtext[3] = M_GetText( - "\nWhat Sonic, Tails, and Knuckles had\n" - "not anticipated was that Eggman would\n" - "return,\xB8 bringing an all new threat.\n#"); - - introtext[4] = M_GetText( - "\xA8""About once every year, a strange asteroid\n" - "hovers around the planet.\xBF It suddenly\n" - "appears from nowhere, circles around, and\n" - "\xB6- just as mysteriously as it arrives -\xB6\n" - "vanishes after about two months.\xBF\n" - "No one knows why it appears, or how.\n#"); - - introtext[5] = M_GetText( - "\xA7\"Curses!\"\xA9\xBA Eggman yelled. \xA7\"That hedgehog\n" - "and his ridiculous friends will pay\n" - "dearly for this!\"\xA9\xC8 Just then his scanner\n" - "blipped as the Black Rock made its\n" - "appearance from nowhere.\xBF Eggman looked at\n" - "the screen, and just shrugged it off.\n#"); - - introtext[6] = M_GetText( - "It was only later\n" - "that he had an\n" - "idea. \xBF\xA7\"The Black\n" - "Rock usually has a\n" - "lot of energy\n" - "within it\xAC...\xA7\xBF\n" - "If I can somehow\n" - "harness this,\xB8 I\n" - "can turn it into\n" - "the ultimate\n" - "battle station\xAC...\xA7\xBF\n" - "And every last\n" - "person will be\n" - "begging for mercy,\xB8\xA8\n" - "including Sonic!\"\n#"); - - introtext[7] = M_GetText( - "\xA8\nBefore beginning his scheme,\n" - "Eggman decided to give Sonic\n" - "a reunion party...\n#"); - - introtext[8] = M_GetText( - "\xA5\"We're\xB6 ready\xB6 to\xB4 fire\xB6 in\xB6 15\xB6 seconds!\"\xA8\xB8\n" - "The robot said, his voice crackling a\n" - "little down the com-link. \xBF\xA7\"Good!\"\xA8\xB8\n" - "Eggman sat back in his Egg-Mobile and\n" - "began to count down as he saw the\n" - "GreenFlower city on the main monitor.\n#"); - - introtext[9] = M_GetText( - "\xA5\"10...\xD2""9...\xD2""8...\"\xA8\xD2\n" - "Meanwhile, Sonic was tearing across the\n" - "zones. Everything became a blur as he\n" - "ran around loops, skimmed over water,\n" - "and catapulted himself off rocks with\n" - "his phenomenal speed.\n#"); - - introtext[10] = M_GetText( - "\xA5\"6...\xD2""5...\xD2""4...\"\xA8\xD2\n" - "Sonic knew he was getting closer to the\n" - "City, and pushed himself harder.\xB4 Finally,\n" - "the city appeared in the horizon.\xD2\xD2\n" - "\xA5\"3...\xD2""2...\xD2""1...\xD2""Zero.\"\n#"); - - introtext[11] = M_GetText( - "GreenFlower City was gone.\xC4\n" - "Sonic arrived just in time to see what\n" - "little of the 'ruins' were left.\n" - "Everyone and everything in the city\n" - "had been obliterated.\n#"); - - introtext[12] = M_GetText( - "\xA7\"You're not quite as dead as we thought,\n" - "huh?\xBF Are you going to tell us your plan as\n" - "usual or will I \xA8\xB4'have to work it out'\xA7 or\n" - "something?\"\xD2\xD2\n" - "\"We'll see\xAA...\xA7\xBF let's give you a quick warm\n" - "up, Sonic!\xA6\xC4 JETTYSYNS!\xA7\xBD Open fire!\"\n#"); - - introtext[13] = M_GetText( - "Eggman took this\n" - "as his cue and\n" - "blasted off,\n" - "leaving Sonic\n" - "and Tails behind.\xB6\n" - "Tails looked at\n" - "the ruins of the\n" - "Greenflower City\n" - "with a grim face\n" - "and sighed.\xC6\n" - "\xA7\"Now\xB6 what do we\n" - "do?\",\xA9 he asked.\n#"); - - introtext[14] = M_GetText( - "\xA7\"Easy!\xBF We go\n" - "find Eggman\n" - "and stop his\n" - "latest\n" - "insane plan.\xBF\n" - "Just like\n" - "we've always\n" - "done,\xBA right?\xD2\n\n" - "\xAE...\xA9\xD2\n\n" - "\"Tails, what\n" - "\xAA*ARE*\xA9 you\n" - "doing?\"\n#"); - - introtext[15] = M_GetText( - "\xA8\"I'm just finding what mission obje\xAC\xB1...\xBF\n" - "\xA6""a-\xB8""ha!\xBF Here it is!\xA8\xBF This will only give us\n" - "the robot's primary objective.\xBF It says\xAC\xB1...\"\n" - "\xD2\xA3\x83" - "* LOCATE AND RETRIEVE: CHAOS EMERALDS *" - "\xBF\n" - "* CLOSEST LOCATION: GREENFLOWER ZONE *" - "\x80\n\xA9\xD2\xD2" - "\"All right, then\xAF... \xD2\xD2\xA7let's go!\"\n#"); - -/* - "What are we waiting for? The first emerald is ours!" Sonic was about to - run, when he saw a shadow pass over him, he recognized the silhouette - instantly. - "Knuckles!" Sonic said. The echidna stopped his glide and landed - facing Sonic. "What are you doing here?" - He replied, "This crisis affects the Floating Island, - if that explosion I saw is anything to go by." - If you're willing to help then... let's go!" -*/ - G_SetGamestate(GS_INTRO); gameaction = ga_nothing; playerdeadview = false; @@ -444,6 +285,7 @@ void F_StartIntro(void) finalecount = animtimer = stoptimer = 0; roidtics = BASEVIDWIDTH - 64; timetonext = introscenetime[intro_scenenum]; + S_StopMusic(); } // @@ -455,90 +297,25 @@ static void F_IntroDrawScene(void) INT32 cx = 8, cy = 128; patch_t *background = NULL; INT32 bgxoffs = 0; - void *patch; // DRAW A FULL PIC INSTEAD OF FLAT! - if (intro_scenenum == 0); - else if (intro_scenenum == 1) - background = W_CachePatchName("INTRO1", PU_CACHE); - else if (intro_scenenum == 2) + if (intro_scenenum == 0) { - background = W_CachePatchName("INTRO2", PU_CACHE); - highres = true; - } - else if (intro_scenenum == 3) - background = W_CachePatchName("INTRO3", PU_CACHE); - else if (intro_scenenum == 4) - background = W_CachePatchName("INTRO4", PU_CACHE); - else if (intro_scenenum == 5) - { - if (intro_curtime >= 5*TICRATE) - background = W_CachePatchName("RADAR", PU_CACHE); - else + if (finalecount == 8) + S_StartSound(NULL, sfx_vroom); + else if (finalecount == 47) { - background = W_CachePatchName("DRAT", PU_CACHE); - highres = true; + // Need to use M_Random otherwise it always uses the same sound + INT32 rskin = M_RandomKey(numskins); + UINT8 rtaunt = M_RandomKey(4); + sfxenum_t rsound = skins[rskin].soundsid[SKSPLTNT1+rtaunt]; + S_StartSound(NULL, rsound); } - } - else if (intro_scenenum == 6) - { - background = W_CachePatchName("INTRO6", PU_CACHE); - cx = 180; - cy = 8; - } - else if (intro_scenenum == 7) - { - if (intro_curtime >= 6*TICRATE) - background = W_CachePatchName("SGRASS5", PU_CACHE); - else - background = W_CachePatchName("SGRASS1", PU_CACHE); - } - else if (intro_scenenum == 8) - { - background = W_CachePatchName("WATCHING", PU_CACHE); - highres = true; - } - else if (intro_scenenum == 9) - { - background = W_CachePatchName("ZOOMING", PU_CACHE); - highres = true; - } - else if (intro_scenenum == 10); - else if (intro_scenenum == 11) - background = W_CachePatchName("INTRO5", PU_CACHE); - else if (intro_scenenum == 12) - { - if (intro_curtime >= 7*TICRATE) - background = W_CachePatchName("CONFRONT", PU_CACHE); - else - background = W_CachePatchName("REVENGE", PU_CACHE); - highres = true; - } - else if (intro_scenenum == 13) - { - background = W_CachePatchName("TAILSSAD", PU_CACHE); - highres = true; - bgxoffs = 144; - cx = 8; - cy = 8; - } - else if (intro_scenenum == 14) - { - if (intro_curtime >= 7*TICRATE) - background = W_CachePatchName("SONICDO2", PU_CACHE); - else - background = W_CachePatchName("SONICDO1", PU_CACHE); - highres = true; - cx = 224; - cy = 8; - } - else if (intro_scenenum == 15) - { - background = W_CachePatchName("INTRO7", PU_CACHE); + background = W_CachePatchName("KARTKREW", PU_CACHE); highres = true; } - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); + V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 120); if (background) { @@ -547,210 +324,12 @@ static void F_IntroDrawScene(void) else V_DrawScaledPatch(bgxoffs, 0, 0, background); } - else if (intro_scenenum == 0) // STJr presents - { - // "Waaaaaaah" intro - if (finalecount-TICRATE/2 < 4*TICRATE+23) { - // aspect is FRACUNIT/2 for 4:3 (source) resolutions, smaller for 16:10 (SRB2) resolutions - fixed_t aspect = (FRACUNIT + (FRACUNIT*4/3 - FRACUNIT*vid.width/vid.height)/2)>>1; - fixed_t x,y; - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 2); - if (finalecount < 30) { // Cry! - if (finalecount < 4) - S_StopMusic(); - if (finalecount == 4) - S_ChangeMusicInternal("stjr", false); - x = (BASEVIDWIDTH< 6) { - V_DrawSciencePatch(x, y, 0, (patch = W_CachePatchName("WAHH2", PU_CACHE)), aspect); - W_UnlockCachedPatch(patch); - } - if (finalecount > 10) { - V_DrawSciencePatch(x, y, 0, (patch = W_CachePatchName("WAHH3", PU_CACHE)), aspect); - W_UnlockCachedPatch(patch); - } - if (finalecount > 14) { - V_DrawSciencePatch(x, y, 0, (patch = W_CachePatchName("WAHH4", PU_CACHE)), aspect); - W_UnlockCachedPatch(patch); - } - } - else if (finalecount-30 < 20) { // Big eggy - background = W_CachePatchName("FEEDIN", PU_CACHE); - x = (BASEVIDWIDTH< 4*TICRATE) { // Door is being raised! - int ftime = (finalecount-TICRATE/2-4*TICRATE); - y -= FixedDiv((ftime*ftime)< 5*TICRATE && timetonext < 6*TICRATE) - { - if (!(finalecount & 3)) - background = W_CachePatchName("BRITEGG1", PU_CACHE); - else - background = W_CachePatchName("DARKEGG1", PU_CACHE); - - V_DrawScaledPatch(0, 0, 0, background); - } - else if (timetonext > 3*TICRATE && timetonext < 4*TICRATE) - { - if (!(finalecount & 3)) - background = W_CachePatchName("BRITEGG2", PU_CACHE); - else - background = W_CachePatchName("DARKEGG2", PU_CACHE); - - V_DrawScaledPatch(0, 0, 0, background); - } - else if (timetonext > 1*TICRATE && timetonext < 2*TICRATE) - { - if (!(finalecount & 3)) - background = W_CachePatchName("BRITEGG3", PU_CACHE); - else - background = W_CachePatchName("DARKEGG3", PU_CACHE); - - V_DrawScaledPatch(0, 0, 0, background); - } - else - { - F_SkyScroll(80*4); - if (timetonext == 6) - { - stoptimer = finalecount; - animtimer = finalecount % 16; - } - else if (timetonext >= 0 && timetonext < 6) - { - animtimer = stoptimer; - deplete -= 32; - } - else - { - animtimer = finalecount % 16; - deplete = 160; - } - - if (finalecount & 1) - { - V_DrawScaledPatch(deplete, 8, 0, (patch = W_CachePatchName("RUN2", PU_CACHE))); - W_UnlockCachedPatch(patch); - V_DrawScaledPatch(deplete, 72, 0, (patch = W_CachePatchName("PEELOUT2", PU_CACHE))); - W_UnlockCachedPatch(patch); - } - else - { - V_DrawScaledPatch(deplete, 8, 0, (patch = W_CachePatchName("RUN1", PU_CACHE))); - W_UnlockCachedPatch(patch); - V_DrawScaledPatch(deplete, 72, 0, (patch = W_CachePatchName("PEELOUT1", PU_CACHE))); - W_UnlockCachedPatch(patch); - } - - { // Fixing up the black box rendering to look right in resolutions <16:10 -Red - INT32 y = 112; - INT32 h = BASEVIDHEIGHT - 112; - if (vid.height != BASEVIDHEIGHT * vid.dupy) - { - INT32 adjust = (vid.height/vid.dupy)-200; - adjust /= 2; - y += adjust; - h += adjust; - V_DrawFill(0, 0, BASEVIDWIDTH, adjust, 31); // Render a black bar on top so it keeps the "cinematic" windowboxing... I just prefer it this way. -Red - } - V_DrawFill(0, y, BASEVIDWIDTH, h, 31); - } - } - } W_UnlockCachedPatch(background); - if (intro_scenenum == 4) // The asteroid SPINS! - { - if (roidtics >= 0) - { - V_DrawScaledPatch(roidtics, 24, 0, - (patch = W_CachePatchName(va("ROID00%.2d", intro_curtime%35), PU_CACHE))); - W_UnlockCachedPatch(patch); - } - } - if (animtimer) animtimer--; - if (intro_scenenum == 7 && intro_curtime > 7*TICRATE) - { - patch_t *sgrass; - - if (intro_curtime >= 7*TICRATE + ((TICRATE/7)*2)) - sgrass = W_CachePatchName("SGRASS4", PU_CACHE); - else if (intro_curtime >= 7*TICRATE + (TICRATE/7)) - sgrass = W_CachePatchName("SGRASS3", PU_CACHE); - else - sgrass = W_CachePatchName("SGRASS2", PU_CACHE); - V_DrawScaledPatch(123, 4, 0, sgrass); - - W_UnlockCachedPatch(sgrass); - } - V_DrawString(cx, cy, 0, cutscene_disptext); } @@ -771,31 +350,6 @@ void F_IntroDrawer(void) F_RunWipe(99,true); } - S_ChangeMusicInternal("read_m", false); - } - else if (intro_scenenum == 3) - roidtics = BASEVIDWIDTH - 64; - else if (intro_scenenum == 10) - { - // The only fade to white in the entire damn game. - if (rendermode != render_none) - { - F_WipeStartScreen(); - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 0); - F_WipeEndScreen(); - F_RunWipe(99,true); - } - } - else if (intro_scenenum == 15) - { - if (rendermode != render_none) - { - F_WipeStartScreen(); - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - F_WipeEndScreen(); - F_RunWipe(99,true); - } - // Stay on black for a bit. =) { tic_t quittime; @@ -812,6 +366,7 @@ void F_IntroDrawer(void) D_StartTitle(); return; } + F_NewCutscene(introtext[++intro_scenenum]); timetonext = introscenetime[intro_scenenum]; @@ -822,62 +377,6 @@ void F_IntroDrawer(void) intro_curtime = introscenetime[intro_scenenum] - timetonext; - if (rendermode != render_none) - { - if (intro_scenenum == 5 && intro_curtime == 5*TICRATE) - { - patch_t *radar = W_CachePatchName("RADAR", PU_CACHE); - - F_WipeStartScreen(); - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - V_DrawScaledPatch(0, 0, 0, radar); - W_UnlockCachedPatch(radar); - V_DrawString(8, 128, 0, cutscene_disptext); - - F_WipeEndScreen(); - F_RunWipe(99,true); - } - else if (intro_scenenum == 7 && intro_curtime == 6*TICRATE) // Force a wipe here - { - patch_t *grass = W_CachePatchName("SGRASS5", PU_CACHE); - - F_WipeStartScreen(); - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - V_DrawScaledPatch(0, 0, 0, grass); - W_UnlockCachedPatch(grass); - V_DrawString(8, 128, 0, cutscene_disptext); - - F_WipeEndScreen(); - F_RunWipe(99,true); - } - else if (intro_scenenum == 12 && intro_curtime == 7*TICRATE) - { - patch_t *confront = W_CachePatchName("CONFRONT", PU_CACHE); - - F_WipeStartScreen(); - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - V_DrawSmallScaledPatch(0, 0, 0, confront); - W_UnlockCachedPatch(confront); - V_DrawString(8, 128, 0, cutscene_disptext); - - F_WipeEndScreen(); - F_RunWipe(99,true); - } - if (intro_scenenum == 14 && intro_curtime == 7*TICRATE) - { - patch_t *sdo = W_CachePatchName("SONICDO2", PU_CACHE); - - F_WipeStartScreen(); - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - V_DrawSmallScaledPatch(0, 0, 0, sdo); - W_UnlockCachedPatch(sdo); - V_DrawString(224, 8, 0, cutscene_disptext); - - F_WipeEndScreen(); - F_RunWipe(99,true); - } - } - F_IntroDrawScene(); } diff --git a/src/p_inter.c b/src/p_inter.c index 70e1ce10..e059c858 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3128,7 +3128,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da K_SpinPlayer(player, source); damage = player->mo->health - 1; P_RingDamage(player, inflictor, source, damage); - if (inflictor->type == MT_GREENITEM || inflictor->type == MT_REDITEM || inflictor->type == MT_REDITEMDUD) + if (inflictor && (inflictor->type == MT_GREENITEM || inflictor->type == MT_REDITEM || inflictor->type == MT_REDITEMDUD)) P_PlayerRingBurst(player, 5); player->mo->momx = player->mo->momy = 0; if (P_IsLocalPlayer(player)) diff --git a/src/sounds.c b/src/sounds.c index bf2453e2..9e50bb84 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -500,7 +500,8 @@ sfxinfo_t S_sfx[NUMSFX] = {"mkitmF", true, 72, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"clash", false, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR}, {"tossed", false,150, 8, -1, NULL, 0, -1, -1, LUMPERROR}, - {"shelit", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR}, + {"shelit", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR}, + {"vroom", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // SRB2kart - Skin sounds {"kwin", false, 64, 0, -1, NULL, 0, SKSWIN, -1, LUMPERROR}, diff --git a/src/sounds.h b/src/sounds.h index 57571771..c61ddfb0 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -572,6 +572,7 @@ typedef enum sfx_clash, sfx_tossed, sfx_shelit, + sfx_vroom, sfx_kwin, sfx_klose,