⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f_wipe.c

📁 The source code of Doom legacy for windows
💻 C
字号:
// Emacs style mode select   -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: f_wipe.c,v 1.2 2000/02/27 00:42:10 hurdler Exp $//// Copyright (C) 1993-1996 by id Software, Inc.// Portions Copyright (C) 1998-2000 by DooM Legacy Team.//// This program is free software; you can redistribute it and/or// modify it under the terms of the GNU General Public License// as published by the Free Software Foundation; either version 2// of the License, or (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.////// $Log: f_wipe.c,v $// Revision 1.2  2000/02/27 00:42:10  hurdler// fix CR+LF problem//// Revision 1.1.1.1  2000/02/22 20:32:32  hurdler// Initial import into CVS (v1.29 pr3)////// DESCRIPTION://      Mission begin melt/wipe screen special effect.////-----------------------------------------------------------------------------#include "doomdef.h"#include "m_random.h"#include "f_wipe.h"#include "i_system.h"#include "i_video.h"#include "v_video.h"#include "r_draw.h" // transtable#include "p_pspr.h" // tr_transxxx#include "z_zone.h"//--------------------------------------------------------------------------//                        SCREEN WIPE PACKAGE//--------------------------------------------------------------------------// when zero, stop the wipestatic boolean  go = 0;static byte*    wipe_scr_start;static byte*    wipe_scr_end;static byte*    wipe_scr;void wipe_shittyColMajorXform ( short*        array,                                int           width,                                int           height ){    int         x;    int         y;    short*      dest;    dest = (short*) Z_Malloc(width*height*2, PU_STATIC, 0);    for(y=0;y<height;y++)        for(x=0;x<width;x++)            dest[x*height+y] = array[y*width+x];    memcpy(array, dest, width*height*2);    Z_Free(dest);}int wipe_initColorXForm ( int   width,                          int   height,                          int   ticks ){    memcpy(wipe_scr, wipe_scr_start, width*height*scr_bpp);    return 0;}/* BP:the original one, work only in hicolorint wipe_doColorXForm ( int   width,                        int   height,                        int   ticks ){    boolean     changed;    byte*       w;    byte*       e;    int         newval;    changed = false;    w = wipe_scr;    e = wipe_scr_end;    while (w!=wipe_scr+width*height)    {        if (*w != *e)        {            if (*w > *e)            {                newval = *w - ticks;                if (newval < *e)                    *w = *e;                else                    *w = newval;                changed = true;            }            else if (*w < *e)            {                newval = *w + ticks;                if (newval > *e)                    *w = *e;                else                    *w = newval;                changed = true;            }        }        w++;        e++;    }    return !changed;}*/int wipe_doColorXForm ( int   width,                        int   height,                        int   ticks ){    boolean     changed;    byte*       w;    byte*       e;    byte        newval;    static int  slowdown=0;    changed = false;    while(ticks--)    {        // slowdown        if(slowdown++) { slowdown=0;return false; }                w = wipe_scr;        e = wipe_scr_end;                        while (w!=wipe_scr+width*height)        {            if (*w != *e)            {                if((newval=transtables[(*e<<8)+*w+((tr_transmor-1)<<FF_TRANSSHIFT)])==*w)                    if((newval=transtables[(*e<<8)+*w+((tr_transmed-1)<<FF_TRANSSHIFT)])==*w)                        if((newval=transtables[(*w<<8)+*e+((tr_transmor-1)<<FF_TRANSSHIFT)])==*w)                            newval=*e;                *w=newval;                changed = true;            }            w++;            e++;        }    }    return !changed;}int wipe_exitColorXForm ( int   width,                          int   height,                          int   ticks ){    return 0;}static int*     y;int wipe_initMelt ( int   width,                    int   height,                    int   ticks ){    int i, r;    // copy start screen to main screen    memcpy(wipe_scr, wipe_scr_start, width*height*scr_bpp);    // makes this wipe faster (in theory)    // to have stuff in column-major format    wipe_shittyColMajorXform((short*)wipe_scr_start, width*scr_bpp/2, height);    wipe_shittyColMajorXform((short*)wipe_scr_end, width*scr_bpp/2, height);    // setup initial column positions    // (y<0 => not ready to scroll yet)    y = (int *) Z_Malloc(width*sizeof(int), PU_STATIC, 0);    y[0] = -(M_Random()%16);    for (i=1;i<width;i++)    {        r = (M_Random()%3) - 1;         y[i] = y[i-1] + r;        if (y[i] > 0) y[i] = 0;        else if (y[i] == -16) y[i] = -15;    }    // dup for normal speed in high res    for (i=0;i<width;i++)        y[i]*=vid.dupy;    return 0;}int wipe_doMelt ( int   width,                  int   height,                  int   ticks ){    int         i;    int         j;    int         dy;    int         idx;    short*      s;    short*      d;    boolean     done = true;    width = (width * scr_bpp) / 2;    while (ticks--)    {        for (i=0;i<width;i++)        {            if (y[i]<0)            {                y[i]++; done = false;            }            else if (y[i] < height)            {                dy = (y[i] < 16) ? y[i]+1 : 8;                dy *= vid.dupy;                if (y[i]+dy >= height) dy = height - y[i];                s = &((short *)wipe_scr_end)[i*height+y[i]];                d = &((short *)wipe_scr)[y[i]*width+i];                idx = 0;                for (j=dy;j;j--)                {                    d[idx] = *(s++);                    idx += width;                }                y[i] += dy;                s = &((short *)wipe_scr_start)[i*height];                d = &((short *)wipe_scr)[y[i]*width+i];                idx = 0;                for (j=height-y[i];j;j--)                {                    d[idx] = *(s++);                    idx += width;                }                done = false;            }        }    }    return done;}int wipe_exitMelt ( int   width,                    int   height,                    int   ticks ){    Z_Free(y);    return 0;}//  save the 'before' screen of the wipe (the one that melts down)//int wipe_StartScreen ( int   x,                       int   y,                       int   width,                       int   height ){    wipe_scr_start = screens[2];    I_ReadScreen(wipe_scr_start);    return 0;}//  save the 'after' screen of the wipe (the one that show behind the melt)//int wipe_EndScreen ( int   x,                     int   y,                     int   width,                     int   height ){    wipe_scr_end = screens[3];    I_ReadScreen(wipe_scr_end);    V_DrawBlock(x, y, 0, width, height, wipe_scr_start); // restore start scr.    return 0;}int wipe_ScreenWipe ( int   wipeno,                      int   x,                      int   y,                      int   width,                      int   height,                      int   ticks ){    int rc;    static int (*wipes[])(int, int, int) =    {        wipe_initColorXForm,         wipe_doColorXForm,         wipe_exitColorXForm,        wipe_initMelt,         wipe_doMelt,         wipe_exitMelt    };    //Fab: obsolete (we don't use dirty-rectangles type of refresh)    //void V_MarkRect(int, int, int, int);    // initial stuff    if (!go)    {        go = 1;        // wipe_scr = (byte *) Z_Malloc(width*height*scr_bpp, PU_STATIC, 0); // DEBUG        wipe_scr = screens[0];        (*wipes[wipeno*3])(width, height, ticks);    }    // do a piece of wipe-in    //V_MarkRect(0, 0, width, height);    rc = (*wipes[wipeno*3+1])(width, height, ticks);    //  V_DrawBlock(x, y, 0, width, height, wipe_scr); // DEBUG    // final stuff    if (rc)    {        go = 0;        (*wipes[wipeno*3+2])(width, height, ticks);    }    return !go;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -