Annotation of doom/p_anim.c, revision 1.1.1.1

1.1       root        1: 
                      2: //**************************************************************************
                      3: //**
                      4: //** p_anim.c : Heretic 2 : Raven Software, Corp.
                      5: //**
                      6: //** $RCSfile: p_anim.c,v $
                      7: //** $Revision: 1.9 $
                      8: //** $Date: 95/07/17 18:50:37 $
                      9: //** $Author: bgokey $
                     10: //**
                     11: //**************************************************************************
                     12: 
                     13: // HEADER FILES ------------------------------------------------------------
                     14: 
                     15: #include "h2def.h"
                     16: #include "p_local.h"
                     17: 
                     18: // MACROS ------------------------------------------------------------------
                     19: 
                     20: #define ANIM_SCRIPT_NAME "ANIMDEFS"
                     21: #define MAX_ANIM_DEFS 20
                     22: #define MAX_FRAME_DEFS 96
                     23: #define ANIM_FLAT 0
                     24: #define ANIM_TEXTURE 1
                     25: #define SCI_FLAT "flat"
                     26: #define SCI_TEXTURE "texture"
                     27: #define SCI_PIC "pic"
                     28: #define SCI_TICS "tics"
                     29: #define SCI_RAND "rand"
                     30: 
                     31: #define LIGHTNING_SPECIAL      198
                     32: #define LIGHTNING_SPECIAL2     199
                     33: #define SKYCHANGE_SPECIAL      200
                     34: 
                     35: // TYPES -------------------------------------------------------------------
                     36: 
                     37: typedef struct
                     38: {
                     39:        int index;
                     40:        int tics;
                     41: } frameDef_t;
                     42: 
                     43: typedef struct
                     44: {
                     45:        int type;
                     46:        int index;
                     47:        int tics;
                     48:        int currentFrameDef;
                     49:        int startFrameDef;
                     50:        int endFrameDef;
                     51: } animDef_t;
                     52: 
                     53: // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
                     54: 
                     55: // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
                     56: 
                     57: // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
                     58: 
                     59: static void P_LightningFlash(void);
                     60: 
                     61: // EXTERNAL DATA DECLARATIONS ----------------------------------------------
                     62: 
                     63: extern fixed_t Sky1ColumnOffset;
                     64: extern fixed_t Sky2ColumnOffset;
                     65: extern int Sky1Texture;
                     66: extern boolean DoubleSky;
                     67: 
                     68: // PUBLIC DATA DEFINITIONS -------------------------------------------------
                     69: 
                     70: fixed_t Sky1ScrollDelta;
                     71: fixed_t Sky2ScrollDelta;
                     72: 
                     73: // PRIVATE DATA DEFINITIONS ------------------------------------------------
                     74: 
                     75: static animDef_t AnimDefs[MAX_ANIM_DEFS];
                     76: static frameDef_t FrameDefs[MAX_FRAME_DEFS];
                     77: static int AnimDefCount;
                     78: static boolean LevelHasLightning;
                     79: static int NextLightningFlash;
                     80: static int LightningFlash;
                     81: static int *LightningLightLevels;
                     82: 
                     83: // CODE --------------------------------------------------------------------
                     84: 
                     85: //==========================================================================
                     86: //
                     87: // P_AnimateSurfaces
                     88: //
                     89: //==========================================================================
                     90: 
                     91: void P_AnimateSurfaces(void)
                     92: {
                     93:        int i;
                     94:        animDef_t *ad;
                     95:        line_t *line;
                     96: 
                     97:        // Animate flats and textures
                     98:        for(i = 0; i < AnimDefCount; i++)
                     99:        {
                    100:                ad = &AnimDefs[i];
                    101:                ad->tics--;
                    102:                if(ad->tics == 0)
                    103:                {
                    104:                        if(ad->currentFrameDef == ad->endFrameDef)
                    105:                        {
                    106:                                ad->currentFrameDef = ad->startFrameDef;
                    107:                        }
                    108:                        else
                    109:                        {
                    110:                                ad->currentFrameDef++;
                    111:                        }
                    112:                        ad->tics = FrameDefs[ad->currentFrameDef].tics;
                    113:                        if(ad->tics > 255)
                    114:                        { // Random tics
                    115:                                ad->tics = (ad->tics>>16)
                    116:                                        +P_Random()%((ad->tics&0xff00)>>8);
                    117:                        }
                    118:                        if(ad->type == ANIM_FLAT)
                    119:                        {
                    120:                                flattranslation[ad->index] =
                    121:                                        FrameDefs[ad->currentFrameDef].index;
                    122:                        }
                    123:                        else
                    124:                        { // Texture
                    125:                                texturetranslation[ad->index] =
                    126:                                        FrameDefs[ad->currentFrameDef].index;
                    127:                        }
                    128:                }
                    129:        }
                    130: 
                    131:        // Update scrolling textures
                    132:        for(i = 0; i < numlinespecials; i++)
                    133:        {
                    134:                line = linespeciallist[i];
                    135:                switch(line->special)
                    136:                {
                    137:                        case 100: // Scroll_Texture_Left
                    138:                                sides[line->sidenum[0]].textureoffset += line->arg1<<10;
                    139:                                break;
                    140:                        case 101: // Scroll_Texture_Right
                    141:                                sides[line->sidenum[0]].textureoffset -= line->arg1<<10;
                    142:                                break;
                    143:                        case 102: // Scroll_Texture_Up
                    144:                                sides[line->sidenum[0]].rowoffset += line->arg1<<10;
                    145:                                break;
                    146:                        case 103: // Scroll_Texture_Down
                    147:                                sides[line->sidenum[0]].rowoffset -= line->arg1<<10;
                    148:                                break;
                    149:                }
                    150:        }
                    151: 
                    152:        // Update sky column offsets
                    153:        Sky1ColumnOffset += Sky1ScrollDelta;
                    154:        Sky2ColumnOffset += Sky2ScrollDelta;
                    155: 
                    156:        if(LevelHasLightning)
                    157:        {
                    158:                if(!NextLightningFlash || LightningFlash)
                    159:                {
                    160:                        P_LightningFlash();
                    161:                }
                    162:                else
                    163:                {
                    164:                        NextLightningFlash--;
                    165:                }
                    166:        }
                    167: }
                    168: 
                    169: //==========================================================================
                    170: //
                    171: // P_LightningFlash
                    172: //
                    173: //==========================================================================
                    174: 
                    175: static void P_LightningFlash(void)
                    176: {
                    177:        int i;
                    178:        sector_t *tempSec;
                    179:        int *tempLight;
                    180:        boolean foundSec;
                    181:        int flashLight;
                    182: 
                    183:        if(LightningFlash)
                    184:        {
                    185:                LightningFlash--;
                    186:                if(LightningFlash)
                    187:                {
                    188:                        tempLight = LightningLightLevels;
                    189:                        tempSec = sectors;
                    190:                        for(i = 0; i < numsectors; i++, tempSec++)
                    191:                        {
                    192:                                if(tempSec->ceilingpic == skyflatnum 
                    193:                                        || tempSec->special == LIGHTNING_SPECIAL
                    194:                                        || tempSec->special == LIGHTNING_SPECIAL2)
                    195:                                {
                    196:                                        if(*tempLight < tempSec->lightlevel-4)
                    197:                                        {
                    198:                                                tempSec->lightlevel -= 4;
                    199:                                        }
                    200:                                        tempLight++;
                    201:                                }
                    202:                        }
                    203:                }                                       
                    204:                else
                    205:                { // remove the alternate lightning flash special
                    206:                        tempLight = LightningLightLevels;
                    207:                        tempSec = sectors;
                    208:                        for(i = 0; i < numsectors; i++, tempSec++)
                    209:                        {
                    210:                                if(tempSec->ceilingpic == skyflatnum
                    211:                                        || tempSec->special == LIGHTNING_SPECIAL
                    212:                                        || tempSec->special == LIGHTNING_SPECIAL2)
                    213:                                {
                    214:                                        tempSec->lightlevel = *tempLight;
                    215:                                        tempLight++;
                    216:                                }
                    217:                        }
                    218:                        Sky1Texture = P_GetMapSky1Texture(gamemap);             
                    219:                }
                    220:                return;
                    221:        }
                    222:        LightningFlash = (P_Random()&7)+8;
                    223:        flashLight = 200+(P_Random()&31);
                    224:        tempSec = sectors;
                    225:        tempLight = LightningLightLevels;
                    226:        foundSec = false;
                    227:        for(i = 0; i < numsectors; i++, tempSec++)
                    228:        {
                    229:                if(tempSec->ceilingpic == skyflatnum
                    230:                                        || tempSec->special == LIGHTNING_SPECIAL
                    231:                                        || tempSec->special == LIGHTNING_SPECIAL2)
                    232:                {
                    233:                        *tempLight = tempSec->lightlevel;
                    234:                        if(tempSec->special == LIGHTNING_SPECIAL)
                    235:                        { 
                    236:                                tempSec->lightlevel += 64;
                    237:                                if(tempSec->lightlevel > flashLight)
                    238:                                {
                    239:                                        tempSec->lightlevel = flashLight;
                    240:                                }
                    241:                        }
                    242:                        else if(tempSec->special == LIGHTNING_SPECIAL2)
                    243:                        {
                    244:                                tempSec->lightlevel += 32;
                    245:                                if(tempSec->lightlevel > flashLight)
                    246:                                {
                    247:                                        tempSec->lightlevel = flashLight;
                    248:                                }
                    249:                        }
                    250:                        else
                    251:                        {
                    252:                                tempSec->lightlevel = flashLight;
                    253:                        }
                    254:                        if(tempSec->lightlevel < *tempLight)
                    255:                        {
                    256:                                tempSec->lightlevel = *tempLight;
                    257:                        }
                    258:                        tempLight++;
                    259:                        foundSec = true;
                    260:                }
                    261:        }
                    262:        if(foundSec)
                    263:        {
                    264:                Sky1Texture = P_GetMapSky2Texture(gamemap); // set alternate sky                
                    265:                S_StartSound(NULL, SFX_THUNDER_CRASH);
                    266:        }
                    267:        // Calculate the next lighting flash
                    268:        if(!NextLightningFlash)
                    269:        {
                    270:                if(P_Random() < 50)
                    271:                { // Immediate Quick flash
                    272:                        NextLightningFlash = (P_Random()&15)+16;
                    273:                }
                    274:                else
                    275:                {
                    276:                        if(P_Random() < 128 && !(leveltime&32))
                    277:                        {
                    278:                                NextLightningFlash = ((P_Random()&7)+2)*35;
                    279:                        }
                    280:                        else
                    281:                        {
                    282:                                NextLightningFlash = ((P_Random()&15)+5)*35;
                    283:                        }
                    284:                }
                    285:        }
                    286: }
                    287: 
                    288: //==========================================================================
                    289: //
                    290: // P_ForceLightning
                    291: //
                    292: //==========================================================================
                    293: 
                    294: void P_ForceLightning(void)
                    295: {
                    296:        NextLightningFlash = 0;
                    297: }
                    298: 
                    299: //==========================================================================
                    300: //
                    301: // P_InitLightning
                    302: //
                    303: //==========================================================================
                    304: 
                    305: void P_InitLightning(void)
                    306: {
                    307:        int i;
                    308:        int secCount;
                    309: 
                    310:        if(!P_GetMapLightning(gamemap))
                    311:        {
                    312:                LevelHasLightning = false;
                    313:                LightningFlash = 0;
                    314:                return;
                    315:        }
                    316:        LightningFlash = 0;
                    317:        secCount = 0;
                    318:        for(i = 0; i < numsectors; i++)
                    319:        {
                    320:                if(sectors[i].ceilingpic == skyflatnum 
                    321:                        || sectors[i].special == LIGHTNING_SPECIAL
                    322:                        || sectors[i].special == LIGHTNING_SPECIAL2)
                    323:                {
                    324:                        secCount++;
                    325:                }
                    326:        }
                    327:        if(secCount)
                    328:        {
                    329:                LevelHasLightning = true;
                    330:        }
                    331:        else
                    332:        {
                    333:                LevelHasLightning = false;
                    334:                return;
                    335:        }
                    336:        LightningLightLevels = (int *)Z_Malloc(secCount*sizeof(int), PU_LEVEL,
                    337:                NULL);
                    338:        NextLightningFlash = ((P_Random()&15)+5)*35; // don't flash at level start
                    339: }
                    340: 
                    341: //==========================================================================
                    342: //
                    343: // P_InitFTAnims
                    344: //
                    345: // Initialize flat and texture animation lists.
                    346: //
                    347: //==========================================================================
                    348: 
                    349: void P_InitFTAnims(void)
                    350: {
                    351:        int base;
                    352:        int mod;
                    353:        int fd;
                    354:        animDef_t *ad;
                    355:        boolean ignore;
                    356:        boolean done;
                    357: 
                    358:        fd = 0;
                    359:        ad = AnimDefs;
                    360:        AnimDefCount = 0;
                    361:        SC_Open(ANIM_SCRIPT_NAME);
                    362:        while(SC_GetString())
                    363:        {
                    364:                if(AnimDefCount == MAX_ANIM_DEFS)
                    365:                {
                    366:                        I_Error("P_InitFTAnims: too many AnimDefs.");
                    367:                }
                    368:                if(SC_Compare(SCI_FLAT))
                    369:                {
                    370:                        ad->type = ANIM_FLAT;
                    371:                }
                    372:                else if(SC_Compare(SCI_TEXTURE))
                    373:                {
                    374:                        ad->type = ANIM_TEXTURE;
                    375:                }
                    376:                else
                    377:                {
                    378:                        SC_ScriptError(NULL);
                    379:                }
                    380:                SC_MustGetString(); // Name
                    381:                ignore = false;
                    382:                if(ad->type == ANIM_FLAT)
                    383:                {
                    384:                        if(W_CheckNumForName(sc_String) == -1)
                    385:                        {
                    386:                                ignore = true;
                    387:                        }
                    388:                        else
                    389:                        {
                    390:                                ad->index = R_FlatNumForName(sc_String);
                    391:                        }
                    392:                }
                    393:                else
                    394:                { // Texture
                    395:                        if(R_CheckTextureNumForName(sc_String) == -1)
                    396:                        {
                    397:                                ignore = true;
                    398:                        }
                    399:                        else
                    400:                        {
                    401:                                ad->index = R_TextureNumForName(sc_String);
                    402:                        }
                    403:                }
                    404:                ad->startFrameDef = fd;
                    405:                done = false;
                    406:                while(done == false)
                    407:                {
                    408:                        if(SC_GetString())
                    409:                        {
                    410:                                if(SC_Compare(SCI_PIC))
                    411:                                {
                    412:                                        if(fd == MAX_FRAME_DEFS)
                    413:                                        {
                    414:                                                I_Error("P_InitFTAnims: too many FrameDefs.");
                    415:                                        }
                    416:                                        SC_MustGetNumber();
                    417:                                        if(ignore == false)
                    418:                                        {
                    419:                                                FrameDefs[fd].index = ad->index+sc_Number-1;
                    420:                                        }
                    421:                                        SC_MustGetString();
                    422:                                        if(SC_Compare(SCI_TICS))
                    423:                                        {
                    424:                                                SC_MustGetNumber();
                    425:                                                if(ignore == false)
                    426:                                                {
                    427:                                                        FrameDefs[fd].tics = sc_Number;
                    428:                                                        fd++;
                    429:                                                }
                    430:                                        }
                    431:                                        else if(SC_Compare(SCI_RAND))
                    432:                                        {
                    433:                                                SC_MustGetNumber();
                    434:                                                base = sc_Number;
                    435:                                                SC_MustGetNumber();
                    436:                                                if(ignore == false)
                    437:                                                {
                    438:                                                        mod = sc_Number-base+1;
                    439:                                                        FrameDefs[fd].tics = (base<<16)+(mod<<8);
                    440:                                                        fd++;
                    441:                                                }
                    442:                                        }
                    443:                                        else
                    444:                                        {
                    445:                                                SC_ScriptError(NULL);
                    446:                                        }
                    447:                                }
                    448:                                else
                    449:                                {
                    450:                                        SC_UnGet();
                    451:                                        done = true;
                    452:                                }
                    453:                        }
                    454:                        else
                    455:                        {
                    456:                                done = true;
                    457:                        }
                    458:                }
                    459:                if((ignore == false) && (fd-ad->startFrameDef < 2))
                    460:                {
                    461:                        I_Error("P_InitFTAnims: AnimDef has framecount < 2.");
                    462:                }
                    463:                if(ignore == false)
                    464:                {
                    465:                        ad->endFrameDef = fd-1;
                    466:                        ad->currentFrameDef = ad->endFrameDef;
                    467:                        ad->tics = 1; // Force 1st game tic to animate
                    468:                        AnimDefCount++;
                    469:                        ad++;
                    470:                }
                    471:        }
                    472:        SC_Close();
                    473: }

unix.superglobalmegacorp.com

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