summaryrefslogtreecommitdiff
path: root/src/heretic/f_finale.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/heretic/f_finale.c')
-rw-r--r--src/heretic/f_finale.c452
1 files changed, 452 insertions, 0 deletions
diff --git a/src/heretic/f_finale.c b/src/heretic/f_finale.c
new file mode 100644
index 00000000..63b0b7f3
--- /dev/null
+++ b/src/heretic/f_finale.c
@@ -0,0 +1,452 @@
+// F_finale.c
+
+#include "DoomDef.h"
+#include "soundst.h"
+#include <ctype.h>
+
+int finalestage; // 0 = text, 1 = art screen
+int finalecount;
+
+#define TEXTSPEED 3
+#define TEXTWAIT 250
+
+char *e1text = E1TEXT;
+char *e2text = E2TEXT;
+char *e3text = E3TEXT;
+char *e4text = E4TEXT;
+char *e5text = E5TEXT;
+char *finaletext;
+char *finaleflat;
+
+int FontABaseLump;
+
+extern boolean automapactive;
+extern boolean viewactive;
+
+extern void D_StartTitle(void);
+
+/*
+=======================
+=
+= F_StartFinale
+=
+=======================
+*/
+
+void F_StartFinale (void)
+{
+ gameaction = ga_nothing;
+ gamestate = GS_FINALE;
+ viewactive = false;
+ automapactive = false;
+ players[consoleplayer].messageTics = 1;
+ players[consoleplayer].message = NULL;
+
+ switch(gameepisode)
+ {
+ case 1:
+ finaleflat = "FLOOR25";
+ finaletext = e1text;
+ break;
+ case 2:
+ finaleflat = "FLATHUH1";
+ finaletext = e2text;
+ break;
+ case 3:
+ finaleflat = "FLTWAWA2";
+ finaletext = e3text;
+ break;
+ case 4:
+ finaleflat = "FLOOR28";
+ finaletext = e4text;
+ break;
+ case 5:
+ finaleflat = "FLOOR08";
+ finaletext = e5text;
+ break;
+ }
+
+ finalestage = 0;
+ finalecount = 0;
+ FontABaseLump = W_GetNumForName("FONTA_S")+1;
+
+// S_ChangeMusic(mus_victor, true);
+ S_StartSong(mus_cptd, true);
+}
+
+
+
+boolean F_Responder (event_t *event)
+{
+ if(event->type != ev_keydown)
+ {
+ return false;
+ }
+ if(finalestage == 1 && gameepisode == 2)
+ { // we're showing the water pic, make any key kick to demo mode
+ finalestage++;
+ memset((byte *)0xa0000, 0, SCREENWIDTH*SCREENHEIGHT);
+ memset(screen, 0, SCREENWIDTH*SCREENHEIGHT);
+ I_SetPalette(W_CacheLumpName("PLAYPAL", PU_CACHE));
+ return true;
+ }
+ return false;
+}
+
+
+/*
+=======================
+=
+= F_Ticker
+=
+=======================
+*/
+
+void F_Ticker (void)
+{
+ finalecount++;
+ if (!finalestage && finalecount>strlen (finaletext)*TEXTSPEED + TEXTWAIT)
+ {
+ finalecount = 0;
+ if(!finalestage)
+ {
+ finalestage = 1;
+ }
+
+// wipegamestate = -1; // force a wipe
+/*
+ if (gameepisode == 3)
+ S_StartMusic (mus_bunny);
+*/
+ }
+}
+
+
+/*
+=======================
+=
+= F_TextWrite
+=
+=======================
+*/
+
+//#include "HU_stuff.h"
+//extern patch_t *hu_font[HU_FONTSIZE];
+
+void F_TextWrite (void)
+{
+ byte *src, *dest;
+ int x,y;
+ int count;
+ char *ch;
+ int c;
+ int cx, cy;
+ patch_t *w;
+
+//
+// erase the entire screen to a tiled background
+//
+ src = W_CacheLumpName(finaleflat, PU_CACHE);
+ dest = screen;
+ for (y=0 ; y<SCREENHEIGHT ; y++)
+ {
+ for (x=0 ; x<SCREENWIDTH/64 ; x++)
+ {
+ memcpy (dest, src+((y&63)<<6), 64);
+ dest += 64;
+ }
+ if (SCREENWIDTH&63)
+ {
+ memcpy (dest, src+((y&63)<<6), SCREENWIDTH&63);
+ dest += (SCREENWIDTH&63);
+ }
+ }
+
+// V_MarkRect (0, 0, SCREENWIDTH, SCREENHEIGHT);
+
+//
+// draw some of the text onto the screen
+//
+ cx = 20;
+ cy = 5;
+ ch = finaletext;
+
+ count = (finalecount - 10)/TEXTSPEED;
+ if (count < 0)
+ count = 0;
+ for ( ; count ; count-- )
+ {
+ c = *ch++;
+ if (!c)
+ break;
+ if (c == '\n')
+ {
+ cx = 20;
+ cy += 9;
+ continue;
+ }
+
+ c = toupper(c);
+ if (c < 33)
+ {
+ cx += 5;
+ continue;
+ }
+
+ w = W_CacheLumpNum(FontABaseLump+c-33, PU_CACHE);
+ if (cx+w->width > SCREENWIDTH)
+ break;
+ V_DrawPatch(cx, cy, w);
+ cx += w->width;
+ }
+
+}
+
+
+#if 0
+/*
+=======================
+=
+= F_Cast
+=
+=======================
+*/
+
+void F_Cast (void)
+{
+ byte *src, *dest;
+ int x,y,w;
+ int count;
+ char *ch;
+ int c;
+ int cx, cy;
+
+//
+// erase the entire screen to a tiled background
+//
+ src = W_CacheLumpName ( "FWATER1" , PU_CACHE);
+ dest = screen;
+
+ for (y=0 ; y<SCREENHEIGHT ; y++)
+ {
+ for (x=0 ; x<SCREENWIDTH/64 ; x++)
+ {
+ memcpy (dest, src+((y&63)<<6), 64);
+ dest += 64;
+ }
+ if (SCREENWIDTH&63)
+ {
+ memcpy (dest, src+((y&63)<<6), SCREENWIDTH&63);
+ dest += (SCREENWIDTH&63);
+ }
+ }
+
+ V_MarkRect (0, 0, SCREENWIDTH, SCREENHEIGHT);
+
+ V_DrawPatch (105,21,0, W_CacheLumpName ( "
+}
+#endif
+
+
+void F_DrawPatchCol (int x, patch_t *patch, int col)
+{
+ column_t *column;
+ byte *source, *dest, *desttop;
+ int count;
+
+ column = (column_t *)((byte *)patch + LONG(patch->columnofs[col]));
+ desttop = screen+x;
+
+// step through the posts in a column
+
+ while (column->topdelta != 0xff )
+ {
+ source = (byte *)column + 3;
+ dest = desttop + column->topdelta*SCREENWIDTH;
+ count = column->length;
+
+ while (count--)
+ {
+ *dest = *source++;
+ dest += SCREENWIDTH;
+ }
+ column = (column_t *)( (byte *)column + column->length+ 4 );
+ }
+}
+
+/*
+==================
+=
+= F_DemonScroll
+=
+==================
+*/
+
+void F_DemonScroll(void)
+{
+ byte *p1, *p2;
+ static int yval = 0;
+ static int nextscroll = 0;
+
+ if(finalecount < nextscroll)
+ {
+ return;
+ }
+ p1 = W_CacheLumpName("FINAL1", PU_LEVEL);
+ p2 = W_CacheLumpName("FINAL2", PU_LEVEL);
+ if(finalecount < 70)
+ {
+ memcpy(screen, p1, SCREENHEIGHT*SCREENWIDTH);
+ nextscroll = finalecount;
+ return;
+ }
+ if(yval < 64000)
+ {
+ memcpy(screen, p2+SCREENHEIGHT*SCREENWIDTH-yval, yval);
+ memcpy(screen+yval, p1, SCREENHEIGHT*SCREENWIDTH-yval);
+ yval += SCREENWIDTH;
+ nextscroll = finalecount+3;
+ }
+ else
+ { //else, we'll just sit here and wait, for now
+ memcpy(screen, p2, SCREENWIDTH*SCREENHEIGHT);
+ }
+}
+
+/*
+==================
+=
+= F_DrawUnderwater
+=
+==================
+*/
+
+void F_DrawUnderwater(void)
+{
+ static boolean underwawa;
+ extern boolean MenuActive;
+ extern boolean askforquit;
+
+ switch(finalestage)
+ {
+ case 1:
+ if(!underwawa)
+ {
+ underwawa = true;
+ memset((byte *)0xa0000, 0, SCREENWIDTH*SCREENHEIGHT);
+ I_SetPalette(W_CacheLumpName("E2PAL", PU_CACHE));
+ memcpy(screen, W_CacheLumpName("E2END", PU_CACHE),
+ SCREENWIDTH*SCREENHEIGHT);
+ }
+ paused = false;
+ MenuActive = false;
+ askforquit = false;
+
+ break;
+ case 2:
+ memcpy(screen, W_CacheLumpName("TITLE", PU_CACHE),
+ SCREENWIDTH*SCREENHEIGHT);
+ //D_StartTitle(); // go to intro/demo mode.
+ }
+}
+
+
+#if 0
+/*
+==================
+=
+= F_BunnyScroll
+=
+==================
+*/
+
+void F_BunnyScroll (void)
+{
+ int scrolled, x;
+ patch_t *p1, *p2;
+ char name[10];
+ int stage;
+ static int laststage;
+
+ p1 = W_CacheLumpName ("PFUB2", PU_LEVEL);
+ p2 = W_CacheLumpName ("PFUB1", PU_LEVEL);
+
+ V_MarkRect (0, 0, SCREENWIDTH, SCREENHEIGHT);
+
+ scrolled = 320 - (finalecount-230)/2;
+ if (scrolled > 320)
+ scrolled = 320;
+ if (scrolled < 0)
+ scrolled = 0;
+
+ for ( x=0 ; x<SCREENWIDTH ; x++)
+ {
+ if (x+scrolled < 320)
+ F_DrawPatchCol (x, p1, x+scrolled);
+ else
+ F_DrawPatchCol (x, p2, x+scrolled - 320);
+ }
+
+ if (finalecount < 1130)
+ return;
+ if (finalecount < 1180)
+ {
+ V_DrawPatch ((SCREENWIDTH-13*8)/2, (SCREENHEIGHT-8*8)/2,0, W_CacheLumpName ("END0",PU_CACHE));
+ laststage = 0;
+ return;
+ }
+
+ stage = (finalecount-1180) / 5;
+ if (stage > 6)
+ stage = 6;
+ if (stage > laststage)
+ {
+ S_StartSound (NULL, sfx_pistol);
+ laststage = stage;
+ }
+
+ sprintf (name,"END%i",stage);
+ V_DrawPatch ((SCREENWIDTH-13*8)/2, (SCREENHEIGHT-8*8)/2, W_CacheLumpName (name,PU_CACHE));
+}
+#endif
+
+/*
+=======================
+=
+= F_Drawer
+=
+=======================
+*/
+
+void F_Drawer(void)
+{
+ UpdateState |= I_FULLSCRN;
+ if (!finalestage)
+ F_TextWrite ();
+ else
+ {
+ switch (gameepisode)
+ {
+ case 1:
+ if(shareware)
+ {
+ V_DrawRawScreen(W_CacheLumpName("ORDER", PU_CACHE));
+ }
+ else
+ {
+ V_DrawRawScreen(W_CacheLumpName("CREDIT", PU_CACHE));
+ }
+ break;
+ case 2:
+ F_DrawUnderwater();
+ break;
+ case 3:
+ F_DemonScroll();
+ break;
+ case 4: // Just show credits screen for extended episodes
+ case 5:
+ V_DrawRawScreen(W_CacheLumpName("CREDIT", PU_CACHE));
+ break;
+ }
+ }
+}