Annotation of doom/p_anim.c, revision 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.