Annotation of doom/f_finale.c, revision 1.1.1.1

1.1       root        1: // F_finale.c
                      2: 
                      3: #include "DoomDef.h"
                      4: #include "soundst.h"
                      5: #include <ctype.h>
                      6: 
                      7: int             finalestage;            // 0 = text, 1 = art screen
                      8: int             finalecount;
                      9: 
                     10: #define TEXTSPEED       3
                     11: #define TEXTWAIT        250
                     12: 
                     13: char    *e1text = E1TEXT;
                     14: char    *e2text = E2TEXT;
                     15: char    *e3text = E3TEXT;
                     16: char    *e4text = E4TEXT;
                     17: char    *e5text = E5TEXT;
                     18: char    *finaletext;
                     19: char    *finaleflat;
                     20: 
                     21: int FontABaseLump;
                     22: 
                     23: extern boolean automapactive;
                     24: extern boolean viewactive;
                     25: 
                     26: extern void D_StartTitle(void);
                     27: 
                     28: /*
                     29: =======================
                     30: =
                     31: = F_StartFinale
                     32: =
                     33: =======================
                     34: */
                     35: 
                     36: void F_StartFinale (void)
                     37: {
                     38:        gameaction = ga_nothing;
                     39:        gamestate = GS_FINALE;
                     40:        viewactive = false;
                     41:        automapactive = false;
                     42:        players[consoleplayer].messageTics = 1;
                     43:        players[consoleplayer].message = NULL;
                     44: 
                     45:        switch(gameepisode)
                     46:        {
                     47:                case 1:
                     48:                        finaleflat = "FLOOR25";
                     49:                        finaletext = e1text;
                     50:                        break;
                     51:                case 2:
                     52:                        finaleflat = "FLATHUH1";
                     53:                        finaletext = e2text;
                     54:                        break;
                     55:                case 3:
                     56:                        finaleflat = "FLTWAWA2";
                     57:                        finaletext = e3text;
                     58:                        break;
                     59:                case 4:
                     60:                        finaleflat = "FLOOR28";
                     61:                        finaletext = e4text;
                     62:                        break;
                     63:                case 5:
                     64:                        finaleflat = "FLOOR08";
                     65:                        finaletext = e5text;
                     66:                        break;
                     67:        }
                     68: 
                     69:        finalestage = 0;
                     70:        finalecount = 0;
                     71:        FontABaseLump = W_GetNumForName("FONTA_S")+1;
                     72: 
                     73: //      S_ChangeMusic(mus_victor, true);
                     74:        S_StartSong(mus_cptd, true);
                     75: }
                     76: 
                     77: 
                     78: 
                     79: boolean F_Responder (event_t *event)
                     80: {
                     81:        if(event->type != ev_keydown)
                     82:        {
                     83:                return false;
                     84:        }
                     85:        if(finalestage == 1 && gameepisode == 2)
                     86:        { // we're showing the water pic, make any key kick to demo mode
                     87:                finalestage++;
                     88:                memset((byte *)0xa0000, 0, SCREENWIDTH*SCREENHEIGHT);
                     89:                memset(screen, 0, SCREENWIDTH*SCREENHEIGHT);
                     90:                I_SetPalette(W_CacheLumpName("PLAYPAL", PU_CACHE));
                     91:                return true;
                     92:        }
                     93:        return false;
                     94: }
                     95: 
                     96: 
                     97: /*
                     98: =======================
                     99: =
                    100: = F_Ticker
                    101: =
                    102: =======================
                    103: */
                    104: 
                    105: void F_Ticker (void)
                    106: {
                    107:        finalecount++;
                    108:        if (!finalestage && finalecount>strlen (finaletext)*TEXTSPEED + TEXTWAIT)
                    109:        {
                    110:                finalecount = 0;
                    111:                if(!finalestage)
                    112:                {
                    113:                        finalestage = 1;
                    114:                }
                    115: 
                    116: //              wipegamestate = -1;             // force a wipe
                    117: /*
                    118:                if (gameepisode == 3)
                    119:                        S_StartMusic (mus_bunny);
                    120: */
                    121:        }
                    122: }
                    123: 
                    124: 
                    125: /*
                    126: =======================
                    127: =
                    128: = F_TextWrite
                    129: =
                    130: =======================
                    131: */
                    132: 
                    133: //#include "HU_stuff.h"
                    134: //extern        patch_t *hu_font[HU_FONTSIZE];
                    135: 
                    136: void F_TextWrite (void)
                    137: {
                    138:        byte    *src, *dest;
                    139:        int             x,y;
                    140:        int             count;
                    141:        char    *ch;
                    142:        int             c;
                    143:        int             cx, cy;
                    144:        patch_t *w;
                    145: 
                    146: //
                    147: // erase the entire screen to a tiled background
                    148: //
                    149:        src = W_CacheLumpName(finaleflat, PU_CACHE);
                    150:        dest = screen;
                    151:        for (y=0 ; y<SCREENHEIGHT ; y++)
                    152:        {
                    153:                for (x=0 ; x<SCREENWIDTH/64 ; x++)
                    154:                {
                    155:                        memcpy (dest, src+((y&63)<<6), 64);
                    156:                        dest += 64;
                    157:                }
                    158:                if (SCREENWIDTH&63)
                    159:                {
                    160:                        memcpy (dest, src+((y&63)<<6), SCREENWIDTH&63);
                    161:                        dest += (SCREENWIDTH&63);
                    162:                }
                    163:        }
                    164: 
                    165: //      V_MarkRect (0, 0, SCREENWIDTH, SCREENHEIGHT);
                    166: 
                    167: //
                    168: // draw some of the text onto the screen
                    169: //
                    170:        cx = 20;
                    171:        cy = 5;
                    172:        ch = finaletext;
                    173: 
                    174:        count = (finalecount - 10)/TEXTSPEED;
                    175:        if (count < 0)
                    176:                count = 0;
                    177:        for ( ; count ; count-- )
                    178:        {
                    179:                c = *ch++;
                    180:                if (!c)
                    181:                        break;
                    182:                if (c == '\n')
                    183:                {
                    184:                        cx = 20;
                    185:                        cy += 9;
                    186:                        continue;
                    187:                }
                    188: 
                    189:                c = toupper(c);
                    190:                if (c < 33)
                    191:                {
                    192:                        cx += 5;
                    193:                        continue;
                    194:                }
                    195: 
                    196:                w = W_CacheLumpNum(FontABaseLump+c-33, PU_CACHE);
                    197:                if (cx+w->width > SCREENWIDTH)
                    198:                        break;
                    199:                V_DrawPatch(cx, cy, w);
                    200:                cx += w->width;
                    201:        }
                    202: 
                    203: }
                    204: 
                    205: 
                    206: #if 0
                    207: /*
                    208: =======================
                    209: =
                    210: = F_Cast
                    211: =
                    212: =======================
                    213: */
                    214: 
                    215: void F_Cast (void)
                    216: {
                    217:        byte    *src, *dest;
                    218:        int             x,y,w;
                    219:        int             count;
                    220:        char    *ch;
                    221:        int             c;
                    222:        int             cx, cy;
                    223: 
                    224: //
                    225: // erase the entire screen to a tiled background
                    226: //
                    227:        src = W_CacheLumpName ( "FWATER1" , PU_CACHE);
                    228:        dest = screen;
                    229: 
                    230:        for (y=0 ; y<SCREENHEIGHT ; y++)
                    231:        {
                    232:                for (x=0 ; x<SCREENWIDTH/64 ; x++)
                    233:                {
                    234:                        memcpy (dest, src+((y&63)<<6), 64);
                    235:                        dest += 64;
                    236:                }
                    237:                if (SCREENWIDTH&63)
                    238:                {
                    239:                        memcpy (dest, src+((y&63)<<6), SCREENWIDTH&63);
                    240:                        dest += (SCREENWIDTH&63);
                    241:                }
                    242:        }
                    243: 
                    244:        V_MarkRect (0, 0, SCREENWIDTH, SCREENHEIGHT);
                    245: 
                    246:        V_DrawPatch (105,21,0, W_CacheLumpName ( "
                    247: }
                    248: #endif
                    249: 
                    250: 
                    251: void F_DrawPatchCol (int x, patch_t *patch, int col)
                    252: {
                    253:        column_t        *column;
                    254:        byte            *source, *dest, *desttop;
                    255:        int                     count;
                    256: 
                    257:        column = (column_t *)((byte *)patch + LONG(patch->columnofs[col]));
                    258:        desttop = screen+x;
                    259: 
                    260: // step through the posts in a column
                    261: 
                    262:        while (column->topdelta != 0xff )
                    263:        {
                    264:                source = (byte *)column + 3;
                    265:                dest = desttop + column->topdelta*SCREENWIDTH;
                    266:                count = column->length;
                    267: 
                    268:                while (count--)
                    269:                {
                    270:                        *dest = *source++;
                    271:                        dest += SCREENWIDTH;
                    272:                }
                    273:                column = (column_t *)(  (byte *)column + column->length+ 4 );
                    274:        }
                    275: }
                    276: 
                    277: /*
                    278: ==================
                    279: =
                    280: = F_DemonScroll
                    281: =
                    282: ==================
                    283: */
                    284: 
                    285: void F_DemonScroll(void)
                    286: {
                    287:        byte *p1, *p2;
                    288:        static int yval = 0;
                    289:        static int nextscroll = 0;
                    290: 
                    291:        if(finalecount < nextscroll)
                    292:        {
                    293:                return;
                    294:        }
                    295:        p1 = W_CacheLumpName("FINAL1", PU_LEVEL);
                    296:        p2 = W_CacheLumpName("FINAL2", PU_LEVEL);
                    297:        if(finalecount < 70)
                    298:        {
                    299:                memcpy(screen, p1, SCREENHEIGHT*SCREENWIDTH);
                    300:                nextscroll = finalecount;
                    301:                return;
                    302:        }
                    303:        if(yval < 64000)
                    304:        {
                    305:                memcpy(screen, p2+SCREENHEIGHT*SCREENWIDTH-yval, yval);
                    306:                memcpy(screen+yval, p1, SCREENHEIGHT*SCREENWIDTH-yval);
                    307:                yval += SCREENWIDTH;
                    308:                nextscroll = finalecount+3;
                    309:        }
                    310:        else
                    311:        { //else, we'll just sit here and wait, for now
                    312:                memcpy(screen, p2, SCREENWIDTH*SCREENHEIGHT);
                    313:        }
                    314: }
                    315: 
                    316: /*
                    317: ==================
                    318: =
                    319: = F_DrawUnderwater
                    320: =
                    321: ==================
                    322: */
                    323: 
                    324: void F_DrawUnderwater(void)
                    325: {
                    326:        static boolean underwawa;
                    327:        extern boolean MenuActive;
                    328:        extern boolean askforquit;
                    329: 
                    330:        switch(finalestage)
                    331:        {
                    332:                case 1:
                    333:                        if(!underwawa)
                    334:                        {
                    335:                                underwawa = true;
                    336:                                memset((byte *)0xa0000, 0, SCREENWIDTH*SCREENHEIGHT);
                    337:                                I_SetPalette(W_CacheLumpName("E2PAL", PU_CACHE));
                    338:                                memcpy(screen, W_CacheLumpName("E2END", PU_CACHE),
                    339:                                        SCREENWIDTH*SCREENHEIGHT);
                    340:                        }
                    341:                        paused = false;
                    342:                        MenuActive = false;
                    343:                        askforquit = false;
                    344: 
                    345:                        break;
                    346:                case 2:
                    347:                        memcpy(screen, W_CacheLumpName("TITLE", PU_CACHE),
                    348:                                SCREENWIDTH*SCREENHEIGHT);
                    349:                        //D_StartTitle(); // go to intro/demo mode.
                    350:        }
                    351: }
                    352: 
                    353: 
                    354: #if 0
                    355: /*
                    356: ==================
                    357: =
                    358: = F_BunnyScroll
                    359: =
                    360: ==================
                    361: */
                    362: 
                    363: void F_BunnyScroll (void)
                    364: {
                    365:        int                     scrolled, x;
                    366:        patch_t         *p1, *p2;
                    367:        char            name[10];
                    368:        int                     stage;
                    369:        static int      laststage;
                    370: 
                    371:        p1 = W_CacheLumpName ("PFUB2", PU_LEVEL);
                    372:        p2 = W_CacheLumpName ("PFUB1", PU_LEVEL);
                    373: 
                    374:        V_MarkRect (0, 0, SCREENWIDTH, SCREENHEIGHT);
                    375: 
                    376:        scrolled = 320 - (finalecount-230)/2;
                    377:        if (scrolled > 320)
                    378:                scrolled = 320;
                    379:        if (scrolled < 0)
                    380:                scrolled = 0;
                    381: 
                    382:        for ( x=0 ; x<SCREENWIDTH ; x++)
                    383:        {
                    384:                if (x+scrolled < 320)
                    385:                        F_DrawPatchCol (x, p1, x+scrolled);
                    386:                else
                    387:                        F_DrawPatchCol (x, p2, x+scrolled - 320);
                    388:        }
                    389: 
                    390:        if (finalecount < 1130)
                    391:                return;
                    392:        if (finalecount < 1180)
                    393:        {
                    394:                V_DrawPatch ((SCREENWIDTH-13*8)/2, (SCREENHEIGHT-8*8)/2,0, W_CacheLumpName ("END0",PU_CACHE));
                    395:                laststage = 0;
                    396:                return;
                    397:        }
                    398: 
                    399:        stage = (finalecount-1180) / 5;
                    400:        if (stage > 6)
                    401:                stage = 6;
                    402:        if (stage > laststage)
                    403:        {
                    404:                S_StartSound (NULL, sfx_pistol);
                    405:                laststage = stage;
                    406:        }
                    407: 
                    408:        sprintf (name,"END%i",stage);
                    409:        V_DrawPatch ((SCREENWIDTH-13*8)/2, (SCREENHEIGHT-8*8)/2, W_CacheLumpName (name,PU_CACHE));
                    410: }
                    411: #endif
                    412: 
                    413: /*
                    414: =======================
                    415: =
                    416: = F_Drawer
                    417: =
                    418: =======================
                    419: */
                    420: 
                    421: void F_Drawer(void)
                    422: {
                    423:        UpdateState |= I_FULLSCRN;
                    424:        if (!finalestage)
                    425:                F_TextWrite ();
                    426:        else
                    427:        {
                    428:                switch (gameepisode)
                    429:                {
                    430:                        case 1:
                    431:                                if(shareware)
                    432:                                {
                    433:                                        V_DrawRawScreen(W_CacheLumpName("ORDER", PU_CACHE));
                    434:                                }
                    435:                                else
                    436:                                {
                    437:                                        V_DrawRawScreen(W_CacheLumpName("CREDIT", PU_CACHE));
                    438:                                }
                    439:                                break;
                    440:                        case 2:
                    441:                                F_DrawUnderwater();
                    442:                                break;
                    443:                        case 3:
                    444:                                F_DemonScroll();
                    445:                                break;
                    446:                        case 4: // Just show credits screen for extended episodes
                    447:                        case 5:
                    448:                                V_DrawRawScreen(W_CacheLumpName("CREDIT", PU_CACHE));
                    449:                                break;
                    450:                }
                    451:        }
                    452: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.