diff options
author | Simon Howard | 2008-09-04 23:15:36 +0000 |
---|---|---|
committer | Simon Howard | 2008-09-04 23:15:36 +0000 |
commit | 0df2cb80cf03d7259746834220d209b306a8c503 (patch) | |
tree | fdc5037429c91dcbc8207c3e75fc787ef96e207a /src/heretic/f_finale.c | |
parent | 6a294daa7859eaf0250aa4a77484dd11550e5c5e (diff) | |
download | chocolate-doom-0df2cb80cf03d7259746834220d209b306a8c503.tar.gz chocolate-doom-0df2cb80cf03d7259746834220d209b306a8c503.tar.bz2 chocolate-doom-0df2cb80cf03d7259746834220d209b306a8c503.zip |
Add GPLed Heretic/Hexen source.
Subversion-branch: /branches/raven-branch
Subversion-revision: 1195
Diffstat (limited to 'src/heretic/f_finale.c')
-rw-r--r-- | src/heretic/f_finale.c | 452 |
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; + } + } +} |