Annotation of doom/p_acs.c, revision 1.1

1.1     ! root        1: 
        !             2: //**************************************************************************
        !             3: //**
        !             4: //** p_acs.c : Heretic 2 : Raven Software, Corp.
        !             5: //**
        !             6: //** $RCSfile: p_acs.c,v $
        !             7: //** $Revision: 1.31 $
        !             8: //** $Date: 95/10/09 16:25:17 $
        !             9: //** $Author: cjr $
        !            10: //**
        !            11: //**************************************************************************
        !            12: 
        !            13: // HEADER FILES ------------------------------------------------------------
        !            14: 
        !            15: #include "h2def.h"
        !            16: #include "p_local.h"
        !            17: 
        !            18: // MACROS ------------------------------------------------------------------
        !            19: 
        !            20: #define SCRIPT_CONTINUE 0
        !            21: #define SCRIPT_STOP 1
        !            22: #define SCRIPT_TERMINATE 2
        !            23: #define OPEN_SCRIPTS_BASE 1000
        !            24: #define PRINT_BUFFER_SIZE 256
        !            25: #define GAME_SINGLE_PLAYER 0
        !            26: #define GAME_NET_COOPERATIVE 1
        !            27: #define GAME_NET_DEATHMATCH 2
        !            28: #define TEXTURE_TOP 0
        !            29: #define TEXTURE_MIDDLE 1
        !            30: #define TEXTURE_BOTTOM 2
        !            31: #define S_DROP ACScript->stackPtr--
        !            32: #define S_POP ACScript->stack[--ACScript->stackPtr]
        !            33: #define S_PUSH(x) ACScript->stack[ACScript->stackPtr++] = x
        !            34: 
        !            35: // TYPES -------------------------------------------------------------------
        !            36: 
        !            37: typedef struct
        !            38: {
        !            39:        int marker;
        !            40:        int infoOffset;
        !            41:        int code;
        !            42: } acsHeader_t;
        !            43: 
        !            44: // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
        !            45: 
        !            46: // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
        !            47: 
        !            48: // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
        !            49: 
        !            50: static void StartOpenACS(int number, int infoIndex, int *address);
        !            51: static void ScriptFinished(int number);
        !            52: static boolean TagBusy(int tag);
        !            53: static boolean AddToACSStore(int map, int number, byte *args);
        !            54: static int GetACSIndex(int number);
        !            55: static void Push(int value);
        !            56: static int Pop(void);
        !            57: static int Top(void);
        !            58: static void Drop(void);
        !            59: 
        !            60: static int CmdNOP(void);
        !            61: static int CmdTerminate(void);
        !            62: static int CmdSuspend(void);
        !            63: static int CmdPushNumber(void);
        !            64: static int CmdLSpec1(void);
        !            65: static int CmdLSpec2(void);
        !            66: static int CmdLSpec3(void);
        !            67: static int CmdLSpec4(void);
        !            68: static int CmdLSpec5(void);
        !            69: static int CmdLSpec1Direct(void);
        !            70: static int CmdLSpec2Direct(void);
        !            71: static int CmdLSpec3Direct(void);
        !            72: static int CmdLSpec4Direct(void);
        !            73: static int CmdLSpec5Direct(void);
        !            74: static int CmdAdd(void);
        !            75: static int CmdSubtract(void);
        !            76: static int CmdMultiply(void);
        !            77: static int CmdDivide(void);
        !            78: static int CmdModulus(void);
        !            79: static int CmdEQ(void);
        !            80: static int CmdNE(void);
        !            81: static int CmdLT(void);
        !            82: static int CmdGT(void);
        !            83: static int CmdLE(void);
        !            84: static int CmdGE(void);
        !            85: static int CmdAssignScriptVar(void);
        !            86: static int CmdAssignMapVar(void);
        !            87: static int CmdAssignWorldVar(void);
        !            88: static int CmdPushScriptVar(void);
        !            89: static int CmdPushMapVar(void);
        !            90: static int CmdPushWorldVar(void);
        !            91: static int CmdAddScriptVar(void);
        !            92: static int CmdAddMapVar(void);
        !            93: static int CmdAddWorldVar(void);
        !            94: static int CmdSubScriptVar(void);
        !            95: static int CmdSubMapVar(void);
        !            96: static int CmdSubWorldVar(void);
        !            97: static int CmdMulScriptVar(void);
        !            98: static int CmdMulMapVar(void);
        !            99: static int CmdMulWorldVar(void);
        !           100: static int CmdDivScriptVar(void);
        !           101: static int CmdDivMapVar(void);
        !           102: static int CmdDivWorldVar(void);
        !           103: static int CmdModScriptVar(void);
        !           104: static int CmdModMapVar(void);
        !           105: static int CmdModWorldVar(void);
        !           106: static int CmdIncScriptVar(void);
        !           107: static int CmdIncMapVar(void);
        !           108: static int CmdIncWorldVar(void);
        !           109: static int CmdDecScriptVar(void);
        !           110: static int CmdDecMapVar(void);
        !           111: static int CmdDecWorldVar(void);
        !           112: static int CmdGoto(void);
        !           113: static int CmdIfGoto(void);
        !           114: static int CmdDrop(void);
        !           115: static int CmdDelay(void);
        !           116: static int CmdDelayDirect(void);
        !           117: static int CmdRandom(void);
        !           118: static int CmdRandomDirect(void);
        !           119: static int CmdThingCount(void);
        !           120: static int CmdThingCountDirect(void);
        !           121: static int CmdTagWait(void);
        !           122: static int CmdTagWaitDirect(void);
        !           123: static int CmdPolyWait(void);
        !           124: static int CmdPolyWaitDirect(void);
        !           125: static int CmdChangeFloor(void);
        !           126: static int CmdChangeFloorDirect(void);
        !           127: static int CmdChangeCeiling(void);
        !           128: static int CmdChangeCeilingDirect(void);
        !           129: static int CmdRestart(void);
        !           130: static int CmdAndLogical(void);
        !           131: static int CmdOrLogical(void);
        !           132: static int CmdAndBitwise(void);
        !           133: static int CmdOrBitwise(void);
        !           134: static int CmdEorBitwise(void);
        !           135: static int CmdNegateLogical(void);
        !           136: static int CmdLShift(void);
        !           137: static int CmdRShift(void);
        !           138: static int CmdUnaryMinus(void);
        !           139: static int CmdIfNotGoto(void);
        !           140: static int CmdLineSide(void);
        !           141: static int CmdScriptWait(void);
        !           142: static int CmdScriptWaitDirect(void);
        !           143: static int CmdClearLineSpecial(void);
        !           144: static int CmdCaseGoto(void);
        !           145: static int CmdBeginPrint(void);
        !           146: static int CmdEndPrint(void);
        !           147: static int CmdPrintString(void);
        !           148: static int CmdPrintNumber(void);
        !           149: static int CmdPrintCharacter(void);
        !           150: static int CmdPlayerCount(void);
        !           151: static int CmdGameType(void);
        !           152: static int CmdGameSkill(void);
        !           153: static int CmdTimer(void);
        !           154: static int CmdSectorSound(void);
        !           155: static int CmdAmbientSound(void);
        !           156: static int CmdSoundSequence(void);
        !           157: static int CmdSetLineTexture(void);
        !           158: static int CmdSetLineBlocking(void);
        !           159: static int CmdSetLineSpecial(void);
        !           160: static int CmdThingSound(void);
        !           161: static int CmdEndPrintBold(void);
        !           162: 
        !           163: static void ThingCount(int type, int tid);
        !           164: 
        !           165: // EXTERNAL DATA DECLARATIONS ----------------------------------------------
        !           166: 
        !           167: // PUBLIC DATA DEFINITIONS -------------------------------------------------
        !           168: 
        !           169: int ACScriptCount;
        !           170: byte *ActionCodeBase;
        !           171: acsInfo_t *ACSInfo;
        !           172: int MapVars[MAX_ACS_MAP_VARS];
        !           173: int WorldVars[MAX_ACS_WORLD_VARS];
        !           174: acsstore_t ACSStore[MAX_ACS_STORE+1]; // +1 for termination marker
        !           175: 
        !           176: // PRIVATE DATA DEFINITIONS ------------------------------------------------
        !           177: 
        !           178: static acs_t *ACScript;
        !           179: static int *PCodePtr;
        !           180: static byte SpecArgs[8];
        !           181: static int ACStringCount;
        !           182: static char **ACStrings;
        !           183: static char PrintBuffer[PRINT_BUFFER_SIZE];
        !           184: static acs_t *NewScript;
        !           185: 
        !           186: static int (*PCodeCmds[])(void) =
        !           187: {
        !           188:        CmdNOP,
        !           189:        CmdTerminate,
        !           190:        CmdSuspend,
        !           191:        CmdPushNumber,
        !           192:        CmdLSpec1,
        !           193:        CmdLSpec2,
        !           194:        CmdLSpec3,
        !           195:        CmdLSpec4,
        !           196:        CmdLSpec5,
        !           197:        CmdLSpec1Direct,
        !           198:        CmdLSpec2Direct,
        !           199:        CmdLSpec3Direct,
        !           200:        CmdLSpec4Direct,
        !           201:        CmdLSpec5Direct,
        !           202:        CmdAdd,
        !           203:        CmdSubtract,
        !           204:        CmdMultiply,
        !           205:        CmdDivide,
        !           206:        CmdModulus,
        !           207:        CmdEQ,
        !           208:        CmdNE,
        !           209:        CmdLT,
        !           210:        CmdGT,
        !           211:        CmdLE,
        !           212:        CmdGE,
        !           213:        CmdAssignScriptVar,
        !           214:        CmdAssignMapVar,
        !           215:        CmdAssignWorldVar,
        !           216:        CmdPushScriptVar,
        !           217:        CmdPushMapVar,
        !           218:        CmdPushWorldVar,
        !           219:        CmdAddScriptVar,
        !           220:        CmdAddMapVar,
        !           221:        CmdAddWorldVar,
        !           222:        CmdSubScriptVar,
        !           223:        CmdSubMapVar,
        !           224:        CmdSubWorldVar,
        !           225:        CmdMulScriptVar,
        !           226:        CmdMulMapVar,
        !           227:        CmdMulWorldVar,
        !           228:        CmdDivScriptVar,
        !           229:        CmdDivMapVar,
        !           230:        CmdDivWorldVar,
        !           231:        CmdModScriptVar,
        !           232:        CmdModMapVar,
        !           233:        CmdModWorldVar,
        !           234:        CmdIncScriptVar,
        !           235:        CmdIncMapVar,
        !           236:        CmdIncWorldVar,
        !           237:        CmdDecScriptVar,
        !           238:        CmdDecMapVar,
        !           239:        CmdDecWorldVar,
        !           240:        CmdGoto,
        !           241:        CmdIfGoto,
        !           242:        CmdDrop,
        !           243:        CmdDelay,
        !           244:        CmdDelayDirect,
        !           245:        CmdRandom,
        !           246:        CmdRandomDirect,
        !           247:        CmdThingCount,
        !           248:        CmdThingCountDirect,
        !           249:        CmdTagWait,
        !           250:        CmdTagWaitDirect,
        !           251:        CmdPolyWait,
        !           252:        CmdPolyWaitDirect,
        !           253:        CmdChangeFloor,
        !           254:        CmdChangeFloorDirect,
        !           255:        CmdChangeCeiling,
        !           256:        CmdChangeCeilingDirect,
        !           257:        CmdRestart,
        !           258:        CmdAndLogical,
        !           259:        CmdOrLogical,
        !           260:        CmdAndBitwise,
        !           261:        CmdOrBitwise,
        !           262:        CmdEorBitwise,
        !           263:        CmdNegateLogical,
        !           264:        CmdLShift,
        !           265:        CmdRShift,
        !           266:        CmdUnaryMinus,
        !           267:        CmdIfNotGoto,
        !           268:        CmdLineSide,
        !           269:        CmdScriptWait,
        !           270:        CmdScriptWaitDirect,
        !           271:        CmdClearLineSpecial,
        !           272:        CmdCaseGoto,
        !           273:        CmdBeginPrint,
        !           274:        CmdEndPrint,
        !           275:        CmdPrintString,
        !           276:        CmdPrintNumber,
        !           277:        CmdPrintCharacter,
        !           278:        CmdPlayerCount,
        !           279:        CmdGameType,
        !           280:        CmdGameSkill,
        !           281:        CmdTimer,
        !           282:        CmdSectorSound,
        !           283:        CmdAmbientSound,
        !           284:        CmdSoundSequence,
        !           285:        CmdSetLineTexture,
        !           286:        CmdSetLineBlocking,
        !           287:        CmdSetLineSpecial,
        !           288:        CmdThingSound,
        !           289:        CmdEndPrintBold
        !           290: };
        !           291: 
        !           292: // CODE --------------------------------------------------------------------
        !           293: 
        !           294: //==========================================================================
        !           295: //
        !           296: // P_LoadACScripts
        !           297: //
        !           298: //==========================================================================
        !           299: 
        !           300: void P_LoadACScripts(int lump)
        !           301: {
        !           302:        int i;
        !           303:        int *buffer;
        !           304:        acsHeader_t *header;
        !           305:        acsInfo_t *info;
        !           306: 
        !           307:        header = W_CacheLumpNum(lump, PU_LEVEL);
        !           308:        ActionCodeBase = (byte *)header;
        !           309:        buffer = (int *)((byte *)header+header->infoOffset);
        !           310:        ACScriptCount = *buffer++;
        !           311:        if(ACScriptCount == 0)
        !           312:        { // Empty behavior lump
        !           313:                return;
        !           314:        }
        !           315:        ACSInfo = Z_Malloc(ACScriptCount*sizeof(acsInfo_t), PU_LEVEL, 0);
        !           316:        memset(ACSInfo, 0, ACScriptCount*sizeof(acsInfo_t));
        !           317:        for(i = 0, info = ACSInfo; i < ACScriptCount; i++, info++)
        !           318:        {
        !           319:                info->number = *buffer++;
        !           320:                info->address = (int *)((byte *)ActionCodeBase+*buffer++);
        !           321:                info->argCount = *buffer++;
        !           322:                if(info->number >= OPEN_SCRIPTS_BASE)
        !           323:                { // Auto-activate
        !           324:                        info->number -= OPEN_SCRIPTS_BASE;
        !           325:                        StartOpenACS(info->number, i, info->address);
        !           326:                        info->state = ASTE_RUNNING;
        !           327:                }
        !           328:                else
        !           329:                {
        !           330:                        info->state = ASTE_INACTIVE;
        !           331:                }
        !           332:        }
        !           333:        ACStringCount = *buffer++;
        !           334:        ACStrings = (char **)buffer;
        !           335:        for(i = 0; i < ACStringCount; i++)
        !           336:        {
        !           337:                ACStrings[i] += (int)ActionCodeBase;
        !           338:        }
        !           339:        memset(MapVars, 0, sizeof(MapVars));
        !           340: }
        !           341: 
        !           342: //==========================================================================
        !           343: //
        !           344: // StartOpenACS
        !           345: //
        !           346: //==========================================================================
        !           347: 
        !           348: static void StartOpenACS(int number, int infoIndex, int *address)
        !           349: {
        !           350:        acs_t *script;
        !           351: 
        !           352:        script = Z_Malloc(sizeof(acs_t), PU_LEVSPEC, 0);
        !           353:        memset(script, 0, sizeof(acs_t));
        !           354:        script->number = number;
        !           355: 
        !           356:        // World objects are allotted 1 second for initialization
        !           357:        script->delayCount = 35;
        !           358: 
        !           359:        script->infoIndex = infoIndex;
        !           360:        script->ip = address;
        !           361:        script->thinker.function = T_InterpretACS;
        !           362:        P_AddThinker(&script->thinker);
        !           363: }
        !           364: 
        !           365: //==========================================================================
        !           366: //
        !           367: // P_CheckACSStore
        !           368: //
        !           369: // Scans the ACS store and executes all scripts belonging to the current
        !           370: // map.
        !           371: //
        !           372: //==========================================================================
        !           373: 
        !           374: void P_CheckACSStore(void)
        !           375: {
        !           376:        acsstore_t *store;
        !           377: 
        !           378:        for(store = ACSStore; store->map != 0; store++)
        !           379:        {
        !           380:                if(store->map == gamemap)
        !           381:                {
        !           382:                        P_StartACS(store->script, 0, store->args, NULL, NULL, 0);
        !           383:                        if(NewScript)
        !           384:                        {
        !           385:                                NewScript->delayCount = 35;
        !           386:                        }
        !           387:                        store->map = -1;
        !           388:                }
        !           389:        }
        !           390: }
        !           391: 
        !           392: //==========================================================================
        !           393: //
        !           394: // P_StartACS
        !           395: //
        !           396: //==========================================================================
        !           397: 
        !           398: static char ErrorMsg[128];
        !           399: 
        !           400: boolean P_StartACS(int number, int map, byte *args, mobj_t *activator,
        !           401:        line_t *line, int side)
        !           402: {
        !           403:        int i;
        !           404:        acs_t *script;
        !           405:        int infoIndex;
        !           406:        aste_t *statePtr;
        !           407: 
        !           408:        NewScript = NULL;
        !           409:        if(map && map != gamemap)
        !           410:        { // Add to the script store
        !           411:                return AddToACSStore(map, number, args);
        !           412:        }
        !           413:        infoIndex = GetACSIndex(number);
        !           414:        if(infoIndex == -1)
        !           415:        { // Script not found
        !           416:                //I_Error("P_StartACS: Unknown script number %d", number);
        !           417:                sprintf(ErrorMsg, "P_STARTACS ERROR: UNKNOWN SCRIPT %d", number);
        !           418:                P_SetMessage(&players[consoleplayer], ErrorMsg, true);
        !           419:        }
        !           420:        statePtr = &ACSInfo[infoIndex].state;
        !           421:        if(*statePtr == ASTE_SUSPENDED)
        !           422:        { // Resume a suspended script
        !           423:                *statePtr = ASTE_RUNNING;
        !           424:                return true;
        !           425:        }
        !           426:        if(*statePtr != ASTE_INACTIVE)
        !           427:        { // Script is already executing
        !           428:                return false;
        !           429:        }
        !           430:        script = Z_Malloc(sizeof(acs_t), PU_LEVSPEC, 0);
        !           431:        memset(script, 0, sizeof(acs_t));
        !           432:        script->number = number;
        !           433:        script->infoIndex = infoIndex;
        !           434:        script->activator = activator;
        !           435:        script->line = line;
        !           436:        script->side = side;
        !           437:        script->ip = ACSInfo[infoIndex].address;
        !           438:        script->thinker.function = T_InterpretACS;
        !           439:        for(i = 0; i < ACSInfo[infoIndex].argCount; i++)
        !           440:        {
        !           441:                script->vars[i] = args[i];
        !           442:        }
        !           443:        *statePtr = ASTE_RUNNING;
        !           444:        P_AddThinker(&script->thinker);
        !           445:        NewScript = script;
        !           446:        return true;
        !           447: }
        !           448: 
        !           449: //==========================================================================
        !           450: //
        !           451: // AddToACSStore
        !           452: //
        !           453: //==========================================================================
        !           454: 
        !           455: static boolean AddToACSStore(int map, int number, byte *args)
        !           456: {
        !           457:        int i;
        !           458:        int index;
        !           459: 
        !           460:        index = -1;
        !           461:        for(i = 0; ACSStore[i].map != 0; i++)
        !           462:        {
        !           463:                if(ACSStore[i].script == number
        !           464:                && ACSStore[i].map == map)
        !           465:                { // Don't allow duplicates
        !           466:                        return false;
        !           467:                }
        !           468:                if(index == -1 && ACSStore[i].map == -1)
        !           469:                { // Remember first empty slot
        !           470:                        index = i;
        !           471:                }
        !           472:        }
        !           473:        if(index == -1)
        !           474:        { // Append required
        !           475:                if(i == MAX_ACS_STORE)
        !           476:                {
        !           477:                        I_Error("AddToACSStore: MAX_ACS_STORE (%d) exceeded.",
        !           478:                                MAX_ACS_STORE);
        !           479:                }
        !           480:                index = i;
        !           481:                ACSStore[index+1].map = 0;
        !           482:        }
        !           483:        ACSStore[index].map = map;
        !           484:        ACSStore[index].script = number;
        !           485:        *((int *)ACSStore[index].args) = *((int *)args);
        !           486:        return true;
        !           487: }
        !           488: 
        !           489: //==========================================================================
        !           490: //
        !           491: // P_StartLockedACS
        !           492: //
        !           493: //==========================================================================
        !           494: 
        !           495: 
        !           496: boolean P_StartLockedACS(line_t *line, byte *args, mobj_t *mo, int side)
        !           497: {
        !           498:        int i;
        !           499:        int lock;
        !           500:        byte newArgs[5];
        !           501:        char LockedBuffer[80];
        !           502: 
        !           503:        extern char *TextKeyMessages[11];
        !           504: 
        !           505:        lock = args[4];
        !           506:        if(!mo->player)
        !           507:        {
        !           508:                return false;
        !           509:        }
        !           510:        if(lock)
        !           511:        {
        !           512:                if(!(mo->player->keys&(1<<(lock-1))))
        !           513:                {
        !           514:                        sprintf(LockedBuffer, "YOU NEED THE %s\n", 
        !           515:                                TextKeyMessages[lock-1]);
        !           516:                        P_SetMessage(mo->player, LockedBuffer, true);
        !           517:                        S_StartSound(mo, SFX_DOOR_LOCKED);
        !           518:                        return false;
        !           519:                }
        !           520:        }
        !           521:        for(i = 0; i < 4; i++)
        !           522:        {
        !           523:                newArgs[i] = args[i];
        !           524:        }
        !           525:        newArgs[4] = 0;
        !           526:        return P_StartACS(newArgs[0], newArgs[1], &newArgs[2], mo,
        !           527:                line, side);
        !           528: }
        !           529: 
        !           530: //==========================================================================
        !           531: //
        !           532: // P_TerminateACS
        !           533: //
        !           534: //==========================================================================
        !           535: 
        !           536: boolean P_TerminateACS(int number, int map)
        !           537: {
        !           538:        int infoIndex;
        !           539: 
        !           540:        infoIndex = GetACSIndex(number);
        !           541:        if(infoIndex == -1)
        !           542:        { // Script not found
        !           543:                return false;
        !           544:        }
        !           545:        if(ACSInfo[infoIndex].state == ASTE_INACTIVE
        !           546:                || ACSInfo[infoIndex].state == ASTE_TERMINATING)
        !           547:        { // States that disallow termination
        !           548:                return false;
        !           549:        }
        !           550:        ACSInfo[infoIndex].state = ASTE_TERMINATING;
        !           551:        return true;
        !           552: }
        !           553: 
        !           554: //==========================================================================
        !           555: //
        !           556: // P_SuspendACS
        !           557: //
        !           558: //==========================================================================
        !           559: 
        !           560: boolean P_SuspendACS(int number, int map)
        !           561: {
        !           562:        int infoIndex;
        !           563: 
        !           564:        infoIndex = GetACSIndex(number);
        !           565:        if(infoIndex == -1)
        !           566:        { // Script not found
        !           567:                return false;
        !           568:        }
        !           569:        if(ACSInfo[infoIndex].state == ASTE_INACTIVE
        !           570:                || ACSInfo[infoIndex].state == ASTE_SUSPENDED
        !           571:                || ACSInfo[infoIndex].state == ASTE_TERMINATING)
        !           572:        { // States that disallow suspension
        !           573:                return false;
        !           574:        }
        !           575:        ACSInfo[infoIndex].state = ASTE_SUSPENDED;
        !           576:        return true;
        !           577: }
        !           578: 
        !           579: //==========================================================================
        !           580: //
        !           581: // P_Init
        !           582: //
        !           583: //==========================================================================
        !           584: 
        !           585: void P_ACSInitNewGame(void)
        !           586: {
        !           587:        memset(WorldVars, 0, sizeof(WorldVars));
        !           588:        memset(ACSStore, 0, sizeof(ACSStore));
        !           589: }
        !           590: 
        !           591: //==========================================================================
        !           592: //
        !           593: // T_InterpretACS
        !           594: //
        !           595: //==========================================================================
        !           596: 
        !           597: void T_InterpretACS(acs_t *script)
        !           598: {
        !           599:        int cmd;
        !           600:        int action;
        !           601: 
        !           602:        if(ACSInfo[script->infoIndex].state == ASTE_TERMINATING)
        !           603:        {
        !           604:                ACSInfo[script->infoIndex].state = ASTE_INACTIVE;
        !           605:                ScriptFinished(ACScript->number);
        !           606:                P_RemoveThinker(&ACScript->thinker);
        !           607:                return;
        !           608:        }
        !           609:        if(ACSInfo[script->infoIndex].state != ASTE_RUNNING)
        !           610:        {
        !           611:                return;
        !           612:        }
        !           613:        if(script->delayCount)
        !           614:        {
        !           615:                script->delayCount--;
        !           616:                return;
        !           617:        }
        !           618:        ACScript = script;
        !           619:        PCodePtr = ACScript->ip;
        !           620:        do
        !           621:        {
        !           622:                cmd = *PCodePtr++;
        !           623:                action = PCodeCmds[cmd]();
        !           624:        } while(action == SCRIPT_CONTINUE);
        !           625:        ACScript->ip = PCodePtr;
        !           626:        if(action == SCRIPT_TERMINATE)
        !           627:        {
        !           628:                ACSInfo[script->infoIndex].state = ASTE_INACTIVE;
        !           629:                ScriptFinished(ACScript->number);
        !           630:                P_RemoveThinker(&ACScript->thinker);
        !           631:        }
        !           632: }
        !           633: 
        !           634: //==========================================================================
        !           635: //
        !           636: // P_TagFinished
        !           637: //
        !           638: //==========================================================================
        !           639: 
        !           640: void P_TagFinished(int tag)
        !           641: {
        !           642:        int i;
        !           643: 
        !           644:        if(TagBusy(tag) == true)
        !           645:        {
        !           646:                return;
        !           647:        }
        !           648:        for(i = 0; i < ACScriptCount; i++)
        !           649:        {
        !           650:                if(ACSInfo[i].state == ASTE_WAITINGFORTAG
        !           651:                        && ACSInfo[i].waitValue == tag)
        !           652:                {
        !           653:                        ACSInfo[i].state = ASTE_RUNNING;
        !           654:                }
        !           655:        }
        !           656: }
        !           657: 
        !           658: //==========================================================================
        !           659: //
        !           660: // P_PolyobjFinished
        !           661: //
        !           662: //==========================================================================
        !           663: 
        !           664: void P_PolyobjFinished(int po)
        !           665: {
        !           666:        int i;
        !           667: 
        !           668:        if(PO_Busy(po) == true)
        !           669:        {
        !           670:                return;
        !           671:        }
        !           672:        for(i = 0; i < ACScriptCount; i++)
        !           673:        {
        !           674:                if(ACSInfo[i].state == ASTE_WAITINGFORPOLY
        !           675:                        && ACSInfo[i].waitValue == po)
        !           676:                {
        !           677:                        ACSInfo[i].state = ASTE_RUNNING;
        !           678:                }
        !           679:        }
        !           680: }
        !           681: 
        !           682: //==========================================================================
        !           683: //
        !           684: // ScriptFinished
        !           685: //
        !           686: //==========================================================================
        !           687: 
        !           688: static void ScriptFinished(int number)
        !           689: {
        !           690:        int i;
        !           691: 
        !           692:        for(i = 0; i < ACScriptCount; i++)
        !           693:        {
        !           694:                if(ACSInfo[i].state == ASTE_WAITINGFORSCRIPT
        !           695:                        && ACSInfo[i].waitValue == number)
        !           696:                {
        !           697:                        ACSInfo[i].state = ASTE_RUNNING;
        !           698:                }
        !           699:        }
        !           700: }
        !           701: 
        !           702: //==========================================================================
        !           703: //
        !           704: // TagBusy
        !           705: //
        !           706: //==========================================================================
        !           707: 
        !           708: static boolean TagBusy(int tag)
        !           709: {
        !           710:        int sectorIndex;
        !           711: 
        !           712:        sectorIndex = -1;
        !           713:        while((sectorIndex = P_FindSectorFromTag(tag, sectorIndex)) >= 0)
        !           714:        {
        !           715:                if(sectors[sectorIndex].specialdata)
        !           716:                {
        !           717:                        return true;
        !           718:                }
        !           719:        }
        !           720:        return false;
        !           721: }
        !           722: 
        !           723: //==========================================================================
        !           724: //
        !           725: // GetACSIndex
        !           726: //
        !           727: // Returns the index of a script number.  Returns -1 if the script number
        !           728: // is not found.
        !           729: //
        !           730: //==========================================================================
        !           731: 
        !           732: static int GetACSIndex(int number)
        !           733: {
        !           734:        int i;
        !           735: 
        !           736:        for(i = 0; i < ACScriptCount; i++)
        !           737:        {
        !           738:                if(ACSInfo[i].number == number)
        !           739:                {
        !           740:                        return i;
        !           741:                }
        !           742:        }
        !           743:        return -1;
        !           744: }
        !           745: 
        !           746: //==========================================================================
        !           747: //
        !           748: // Push
        !           749: //
        !           750: //==========================================================================
        !           751: 
        !           752: static void Push(int value)
        !           753: {
        !           754:        ACScript->stack[ACScript->stackPtr++] = value;
        !           755: }
        !           756: 
        !           757: //==========================================================================
        !           758: //
        !           759: // Pop
        !           760: //
        !           761: //==========================================================================
        !           762: 
        !           763: static int Pop(void)
        !           764: {
        !           765:        return ACScript->stack[--ACScript->stackPtr];
        !           766: }
        !           767: 
        !           768: //==========================================================================
        !           769: //
        !           770: // Top
        !           771: //
        !           772: //==========================================================================
        !           773: 
        !           774: static int Top(void)
        !           775: {
        !           776:        return ACScript->stack[ACScript->stackPtr-1];
        !           777: }
        !           778: 
        !           779: //==========================================================================
        !           780: //
        !           781: // Drop
        !           782: //
        !           783: //==========================================================================
        !           784: 
        !           785: static void Drop(void)
        !           786: {
        !           787:        ACScript->stackPtr--;
        !           788: }
        !           789: 
        !           790: //==========================================================================
        !           791: //
        !           792: // P-Code Commands
        !           793: //
        !           794: //==========================================================================
        !           795: 
        !           796: static int CmdNOP(void)
        !           797: {
        !           798:        return SCRIPT_CONTINUE;
        !           799: }
        !           800: 
        !           801: static int CmdTerminate(void)
        !           802: {
        !           803:        return SCRIPT_TERMINATE;
        !           804: }
        !           805: 
        !           806: static int CmdSuspend(void)
        !           807: {
        !           808:        ACSInfo[ACScript->infoIndex].state = ASTE_SUSPENDED;
        !           809:        return SCRIPT_STOP;
        !           810: }
        !           811: 
        !           812: static int CmdPushNumber(void)
        !           813: {
        !           814:        Push(*PCodePtr++);
        !           815:        return SCRIPT_CONTINUE;
        !           816: }
        !           817: 
        !           818: static int CmdLSpec1(void)
        !           819: {
        !           820:        int special;
        !           821: 
        !           822:        special = *PCodePtr++;
        !           823:        SpecArgs[0] = Pop();
        !           824:        P_ExecuteLineSpecial(special, SpecArgs, ACScript->line,
        !           825:                ACScript->side, ACScript->activator);
        !           826:        return SCRIPT_CONTINUE;
        !           827: }
        !           828: 
        !           829: static int CmdLSpec2(void)
        !           830: {
        !           831:        int special;
        !           832: 
        !           833:        special = *PCodePtr++;
        !           834:        SpecArgs[1] = Pop();
        !           835:        SpecArgs[0] = Pop();
        !           836:        P_ExecuteLineSpecial(special, SpecArgs, ACScript->line,
        !           837:                ACScript->side, ACScript->activator);
        !           838:        return SCRIPT_CONTINUE;
        !           839: }
        !           840: 
        !           841: static int CmdLSpec3(void)
        !           842: {
        !           843:        int special;
        !           844: 
        !           845:        special = *PCodePtr++;
        !           846:        SpecArgs[2] = Pop();
        !           847:        SpecArgs[1] = Pop();
        !           848:        SpecArgs[0] = Pop();
        !           849:        P_ExecuteLineSpecial(special, SpecArgs, ACScript->line,
        !           850:                ACScript->side, ACScript->activator);
        !           851:        return SCRIPT_CONTINUE;
        !           852: }
        !           853: 
        !           854: static int CmdLSpec4(void)
        !           855: {
        !           856:        int special;
        !           857: 
        !           858:        special = *PCodePtr++;
        !           859:        SpecArgs[3] = Pop();
        !           860:        SpecArgs[2] = Pop();
        !           861:        SpecArgs[1] = Pop();
        !           862:        SpecArgs[0] = Pop();
        !           863:        P_ExecuteLineSpecial(special, SpecArgs, ACScript->line,
        !           864:                ACScript->side, ACScript->activator);
        !           865:        return SCRIPT_CONTINUE;
        !           866: }
        !           867: 
        !           868: static int CmdLSpec5(void)
        !           869: {
        !           870:        int special;
        !           871: 
        !           872:        special = *PCodePtr++;
        !           873:        SpecArgs[4] = Pop();
        !           874:        SpecArgs[3] = Pop();
        !           875:        SpecArgs[2] = Pop();
        !           876:        SpecArgs[1] = Pop();
        !           877:        SpecArgs[0] = Pop();
        !           878:        P_ExecuteLineSpecial(special, SpecArgs, ACScript->line,
        !           879:                ACScript->side, ACScript->activator);
        !           880:        return SCRIPT_CONTINUE;
        !           881: }
        !           882: 
        !           883: static int CmdLSpec1Direct(void)
        !           884: {
        !           885:        int special;
        !           886: 
        !           887:        special = *PCodePtr++;
        !           888:        SpecArgs[0] = *PCodePtr++;
        !           889:        P_ExecuteLineSpecial(special, SpecArgs, ACScript->line,
        !           890:                ACScript->side, ACScript->activator);
        !           891:        return SCRIPT_CONTINUE;
        !           892: }
        !           893: 
        !           894: static int CmdLSpec2Direct(void)
        !           895: {
        !           896:        int special;
        !           897: 
        !           898:        special = *PCodePtr++;
        !           899:        SpecArgs[0] = *PCodePtr++;
        !           900:        SpecArgs[1] = *PCodePtr++;
        !           901:        P_ExecuteLineSpecial(special, SpecArgs, ACScript->line,
        !           902:                ACScript->side, ACScript->activator);
        !           903:        return SCRIPT_CONTINUE;
        !           904: }
        !           905: 
        !           906: static int CmdLSpec3Direct(void)
        !           907: {
        !           908:        int special;
        !           909: 
        !           910:        special = *PCodePtr++;
        !           911:        SpecArgs[0] = *PCodePtr++;
        !           912:        SpecArgs[1] = *PCodePtr++;
        !           913:        SpecArgs[2] = *PCodePtr++;
        !           914:        P_ExecuteLineSpecial(special, SpecArgs, ACScript->line,
        !           915:                ACScript->side, ACScript->activator);
        !           916:        return SCRIPT_CONTINUE;
        !           917: }
        !           918: 
        !           919: static int CmdLSpec4Direct(void)
        !           920: {
        !           921:        int special;
        !           922: 
        !           923:        special = *PCodePtr++;
        !           924:        SpecArgs[0] = *PCodePtr++;
        !           925:        SpecArgs[1] = *PCodePtr++;
        !           926:        SpecArgs[2] = *PCodePtr++;
        !           927:        SpecArgs[3] = *PCodePtr++;
        !           928:        P_ExecuteLineSpecial(special, SpecArgs, ACScript->line,
        !           929:                ACScript->side, ACScript->activator);
        !           930:        return SCRIPT_CONTINUE;
        !           931: }
        !           932: 
        !           933: static int CmdLSpec5Direct(void)
        !           934: {
        !           935:        int special;
        !           936: 
        !           937:        special = *PCodePtr++;
        !           938:        SpecArgs[0] = *PCodePtr++;
        !           939:        SpecArgs[1] = *PCodePtr++;
        !           940:        SpecArgs[2] = *PCodePtr++;
        !           941:        SpecArgs[3] = *PCodePtr++;
        !           942:        SpecArgs[4] = *PCodePtr++;
        !           943:        P_ExecuteLineSpecial(special, SpecArgs, ACScript->line,
        !           944:                ACScript->side, ACScript->activator);
        !           945:        return SCRIPT_CONTINUE;
        !           946: }
        !           947: 
        !           948: static int CmdAdd(void)
        !           949: {
        !           950:        Push(Pop()+Pop());
        !           951:        return SCRIPT_CONTINUE;
        !           952: }
        !           953: 
        !           954: static int CmdSubtract(void)
        !           955: {
        !           956:        int operand2;
        !           957: 
        !           958:        operand2 = Pop();
        !           959:        Push(Pop()-operand2);
        !           960:        return SCRIPT_CONTINUE;
        !           961: }
        !           962: 
        !           963: static int CmdMultiply(void)
        !           964: {
        !           965:        Push(Pop()*Pop());
        !           966:        return SCRIPT_CONTINUE;
        !           967: }
        !           968: 
        !           969: static int CmdDivide(void)
        !           970: {
        !           971:        int operand2;
        !           972: 
        !           973:        operand2 = Pop();
        !           974:        Push(Pop()/operand2);
        !           975:        return SCRIPT_CONTINUE;
        !           976: }
        !           977: 
        !           978: static int CmdModulus(void)
        !           979: {
        !           980:        int operand2;
        !           981: 
        !           982:        operand2 = Pop();
        !           983:        Push(Pop()%operand2);
        !           984:        return SCRIPT_CONTINUE;
        !           985: }
        !           986: 
        !           987: static int CmdEQ(void)
        !           988: {
        !           989:        Push(Pop() == Pop());
        !           990:        return SCRIPT_CONTINUE;
        !           991: }
        !           992: 
        !           993: static int CmdNE(void)
        !           994: {
        !           995:        Push(Pop() != Pop());
        !           996:        return SCRIPT_CONTINUE;
        !           997: }
        !           998: 
        !           999: static int CmdLT(void)
        !          1000: {
        !          1001:        int operand2;
        !          1002: 
        !          1003:        operand2 = Pop();
        !          1004:        Push(Pop() < operand2);
        !          1005:        return SCRIPT_CONTINUE;
        !          1006: }
        !          1007: 
        !          1008: static int CmdGT(void)
        !          1009: {
        !          1010:        int operand2;
        !          1011: 
        !          1012:        operand2 = Pop();
        !          1013:        Push(Pop() > operand2);
        !          1014:        return SCRIPT_CONTINUE;
        !          1015: }
        !          1016: 
        !          1017: static int CmdLE(void)
        !          1018: {
        !          1019:        int operand2;
        !          1020: 
        !          1021:        operand2 = Pop();
        !          1022:        Push(Pop() <= operand2);
        !          1023:        return SCRIPT_CONTINUE;
        !          1024: }
        !          1025: 
        !          1026: static int CmdGE(void)
        !          1027: {
        !          1028:        int operand2;
        !          1029: 
        !          1030:        operand2 = Pop();
        !          1031:        Push(Pop() >= operand2);
        !          1032:        return SCRIPT_CONTINUE;
        !          1033: }
        !          1034: 
        !          1035: static int CmdAssignScriptVar(void)
        !          1036: {
        !          1037:        ACScript->vars[*PCodePtr++] = Pop();
        !          1038:        return SCRIPT_CONTINUE;
        !          1039: }
        !          1040: 
        !          1041: static int CmdAssignMapVar(void)
        !          1042: {
        !          1043:        MapVars[*PCodePtr++] = Pop();
        !          1044:        return SCRIPT_CONTINUE;
        !          1045: }
        !          1046: 
        !          1047: static int CmdAssignWorldVar(void)
        !          1048: {
        !          1049:        WorldVars[*PCodePtr++] = Pop();
        !          1050:        return SCRIPT_CONTINUE;
        !          1051: }
        !          1052: 
        !          1053: static int CmdPushScriptVar(void)
        !          1054: {
        !          1055:        Push(ACScript->vars[*PCodePtr++]);
        !          1056:        return SCRIPT_CONTINUE;
        !          1057: }
        !          1058: 
        !          1059: static int CmdPushMapVar(void)
        !          1060: {
        !          1061:        Push(MapVars[*PCodePtr++]);
        !          1062:        return SCRIPT_CONTINUE;
        !          1063: }
        !          1064: 
        !          1065: static int CmdPushWorldVar(void)
        !          1066: {
        !          1067:        Push(WorldVars[*PCodePtr++]);
        !          1068:        return SCRIPT_CONTINUE;
        !          1069: }
        !          1070: 
        !          1071: static int CmdAddScriptVar(void)
        !          1072: {
        !          1073:        ACScript->vars[*PCodePtr++] += Pop();
        !          1074:        return SCRIPT_CONTINUE;
        !          1075: }
        !          1076: 
        !          1077: static int CmdAddMapVar(void)
        !          1078: {
        !          1079:        MapVars[*PCodePtr++] += Pop();
        !          1080:        return SCRIPT_CONTINUE;
        !          1081: }
        !          1082: 
        !          1083: static int CmdAddWorldVar(void)
        !          1084: {
        !          1085:        WorldVars[*PCodePtr++] += Pop();
        !          1086:        return SCRIPT_CONTINUE;
        !          1087: }
        !          1088: 
        !          1089: static int CmdSubScriptVar(void)
        !          1090: {
        !          1091:        ACScript->vars[*PCodePtr++] -= Pop();
        !          1092:        return SCRIPT_CONTINUE;
        !          1093: }
        !          1094: 
        !          1095: static int CmdSubMapVar(void)
        !          1096: {
        !          1097:        MapVars[*PCodePtr++] -= Pop();
        !          1098:        return SCRIPT_CONTINUE;
        !          1099: }
        !          1100: 
        !          1101: static int CmdSubWorldVar(void)
        !          1102: {
        !          1103:        WorldVars[*PCodePtr++] -= Pop();
        !          1104:        return SCRIPT_CONTINUE;
        !          1105: }
        !          1106: 
        !          1107: static int CmdMulScriptVar(void)
        !          1108: {
        !          1109:        ACScript->vars[*PCodePtr++] *= Pop();
        !          1110:        return SCRIPT_CONTINUE;
        !          1111: }
        !          1112: 
        !          1113: static int CmdMulMapVar(void)
        !          1114: {
        !          1115:        MapVars[*PCodePtr++] *= Pop();
        !          1116:        return SCRIPT_CONTINUE;
        !          1117: }
        !          1118: 
        !          1119: static int CmdMulWorldVar(void)
        !          1120: {
        !          1121:        WorldVars[*PCodePtr++] *= Pop();
        !          1122:        return SCRIPT_CONTINUE;
        !          1123: }
        !          1124: 
        !          1125: static int CmdDivScriptVar(void)
        !          1126: {
        !          1127:        ACScript->vars[*PCodePtr++] /= Pop();
        !          1128:        return SCRIPT_CONTINUE;
        !          1129: }
        !          1130: 
        !          1131: static int CmdDivMapVar(void)
        !          1132: {
        !          1133:        MapVars[*PCodePtr++] /= Pop();
        !          1134:        return SCRIPT_CONTINUE;
        !          1135: }
        !          1136: 
        !          1137: static int CmdDivWorldVar(void)
        !          1138: {
        !          1139:        WorldVars[*PCodePtr++] /= Pop();
        !          1140:        return SCRIPT_CONTINUE;
        !          1141: }
        !          1142: 
        !          1143: static int CmdModScriptVar(void)
        !          1144: {
        !          1145:        ACScript->vars[*PCodePtr++] %= Pop();
        !          1146:        return SCRIPT_CONTINUE;
        !          1147: }
        !          1148: 
        !          1149: static int CmdModMapVar(void)
        !          1150: {
        !          1151:        MapVars[*PCodePtr++] %= Pop();
        !          1152:        return SCRIPT_CONTINUE;
        !          1153: }
        !          1154: 
        !          1155: static int CmdModWorldVar(void)
        !          1156: {
        !          1157:        WorldVars[*PCodePtr++] %= Pop();
        !          1158:        return SCRIPT_CONTINUE;
        !          1159: }
        !          1160: 
        !          1161: static int CmdIncScriptVar(void)
        !          1162: {
        !          1163:        ACScript->vars[*PCodePtr++]++;
        !          1164:        return SCRIPT_CONTINUE;
        !          1165: }
        !          1166: 
        !          1167: static int CmdIncMapVar(void)
        !          1168: {
        !          1169:        MapVars[*PCodePtr++]++;
        !          1170:        return SCRIPT_CONTINUE;
        !          1171: }
        !          1172: 
        !          1173: static int CmdIncWorldVar(void)
        !          1174: {
        !          1175:        WorldVars[*PCodePtr++]++;
        !          1176:        return SCRIPT_CONTINUE;
        !          1177: }
        !          1178: 
        !          1179: static int CmdDecScriptVar(void)
        !          1180: {
        !          1181:        ACScript->vars[*PCodePtr++]--;
        !          1182:        return SCRIPT_CONTINUE;
        !          1183: }
        !          1184: 
        !          1185: static int CmdDecMapVar(void)
        !          1186: {
        !          1187:        MapVars[*PCodePtr++]--;
        !          1188:        return SCRIPT_CONTINUE;
        !          1189: }
        !          1190: 
        !          1191: static int CmdDecWorldVar(void)
        !          1192: {
        !          1193:        WorldVars[*PCodePtr++]--;
        !          1194:        return SCRIPT_CONTINUE;
        !          1195: }
        !          1196: 
        !          1197: static int CmdGoto(void)
        !          1198: {
        !          1199:        PCodePtr = (int *)(ActionCodeBase+*PCodePtr);
        !          1200:        return SCRIPT_CONTINUE;
        !          1201: }
        !          1202: 
        !          1203: static int CmdIfGoto(void)
        !          1204: {
        !          1205:        if(Pop())
        !          1206:        {
        !          1207:                PCodePtr = (int *)(ActionCodeBase+*PCodePtr);
        !          1208:        }
        !          1209:        else
        !          1210:        {
        !          1211:                PCodePtr++;
        !          1212:        }
        !          1213:        return SCRIPT_CONTINUE;
        !          1214: }
        !          1215: 
        !          1216: static int CmdDrop(void)
        !          1217: {
        !          1218:        Drop();
        !          1219:        return SCRIPT_CONTINUE;
        !          1220: }
        !          1221: 
        !          1222: static int CmdDelay(void)
        !          1223: {
        !          1224:        ACScript->delayCount = Pop();
        !          1225:        return SCRIPT_STOP;
        !          1226: }
        !          1227: 
        !          1228: static int CmdDelayDirect(void)
        !          1229: {
        !          1230:        ACScript->delayCount = *PCodePtr++;
        !          1231:        return SCRIPT_STOP;
        !          1232: }
        !          1233: 
        !          1234: static int CmdRandom(void)
        !          1235: {
        !          1236:        int low;
        !          1237:        int high;
        !          1238: 
        !          1239:        high = Pop();
        !          1240:        low = Pop();
        !          1241:        Push(low+(P_Random()%(high-low+1)));
        !          1242:        return SCRIPT_CONTINUE;
        !          1243: }
        !          1244: 
        !          1245: static int CmdRandomDirect(void)
        !          1246: {
        !          1247:        int low;
        !          1248:        int high;
        !          1249: 
        !          1250:        low = *PCodePtr++;
        !          1251:        high = *PCodePtr++;
        !          1252:        Push(low+(P_Random()%(high-low+1)));
        !          1253:        return SCRIPT_CONTINUE;
        !          1254: }
        !          1255: 
        !          1256: static int CmdThingCount(void)
        !          1257: {
        !          1258:        int tid;
        !          1259: 
        !          1260:        tid = Pop();
        !          1261:        ThingCount(Pop(), tid);
        !          1262:        return SCRIPT_CONTINUE;
        !          1263: }
        !          1264: 
        !          1265: static int CmdThingCountDirect(void)
        !          1266: {
        !          1267:        int type;
        !          1268: 
        !          1269:        type = *PCodePtr++;
        !          1270:        ThingCount(type, *PCodePtr++);
        !          1271:        return SCRIPT_CONTINUE;
        !          1272: }
        !          1273: 
        !          1274: static void ThingCount(int type, int tid)
        !          1275: {
        !          1276:        int count;
        !          1277:        int searcher;
        !          1278:        mobj_t *mobj;
        !          1279:        mobjtype_t moType;
        !          1280:        thinker_t *think;
        !          1281: 
        !          1282:        if(!(type+tid))
        !          1283:        { // Nothing to count
        !          1284:                return;
        !          1285:        }
        !          1286:        moType = TranslateThingType[type];
        !          1287:        count = 0;
        !          1288:        searcher = -1;
        !          1289:        if(tid)
        !          1290:        { // Count TID things
        !          1291:                while((mobj = P_FindMobjFromTID(tid, &searcher)) != NULL)
        !          1292:                {
        !          1293:                        if(type == 0)
        !          1294:                        { // Just count TIDs
        !          1295:                                count++;
        !          1296:                        }
        !          1297:                        else if(moType == mobj->type)
        !          1298:                        {
        !          1299:                                if(mobj->flags&MF_COUNTKILL && mobj->health <= 0)
        !          1300:                                { // Don't count dead monsters
        !          1301:                                        continue;
        !          1302:                                }
        !          1303:                                count++;
        !          1304:                        }
        !          1305:                }
        !          1306:        }
        !          1307:        else
        !          1308:        { // Count only types
        !          1309:                for(think = thinkercap.next; think != &thinkercap;
        !          1310:                        think = think->next)
        !          1311:                {
        !          1312:                        if(think->function != P_MobjThinker)
        !          1313:                        { // Not a mobj thinker
        !          1314:                                continue;
        !          1315:                        }
        !          1316:                        mobj = (mobj_t *)think;
        !          1317:                        if(mobj->type != moType)
        !          1318:                        { // Doesn't match
        !          1319:                                continue;
        !          1320:                        }
        !          1321:                        if(mobj->flags&MF_COUNTKILL && mobj->health <= 0)
        !          1322:                        { // Don't count dead monsters
        !          1323:                                continue;
        !          1324:                        }
        !          1325:                        count++;
        !          1326:                }
        !          1327:        }
        !          1328:        Push(count);
        !          1329: }
        !          1330: 
        !          1331: static int CmdTagWait(void)
        !          1332: {
        !          1333:        ACSInfo[ACScript->infoIndex].waitValue = Pop();
        !          1334:        ACSInfo[ACScript->infoIndex].state = ASTE_WAITINGFORTAG;
        !          1335:        return SCRIPT_STOP;
        !          1336: }
        !          1337: 
        !          1338: static int CmdTagWaitDirect(void)
        !          1339: {
        !          1340:        ACSInfo[ACScript->infoIndex].waitValue = *PCodePtr++;
        !          1341:        ACSInfo[ACScript->infoIndex].state = ASTE_WAITINGFORTAG;
        !          1342:        return SCRIPT_STOP;
        !          1343: }
        !          1344: 
        !          1345: static int CmdPolyWait(void)
        !          1346: {
        !          1347:        ACSInfo[ACScript->infoIndex].waitValue = Pop();
        !          1348:        ACSInfo[ACScript->infoIndex].state = ASTE_WAITINGFORPOLY;
        !          1349:        return SCRIPT_STOP;
        !          1350: }
        !          1351: 
        !          1352: static int CmdPolyWaitDirect(void)
        !          1353: {
        !          1354:        ACSInfo[ACScript->infoIndex].waitValue = *PCodePtr++;
        !          1355:        ACSInfo[ACScript->infoIndex].state = ASTE_WAITINGFORPOLY;
        !          1356:        return SCRIPT_STOP;
        !          1357: }
        !          1358: 
        !          1359: static int CmdChangeFloor(void)
        !          1360: {
        !          1361:        int tag;
        !          1362:        int flat;
        !          1363:        int sectorIndex;
        !          1364: 
        !          1365:        flat = R_FlatNumForName(ACStrings[Pop()]);
        !          1366:        tag = Pop();
        !          1367:        sectorIndex = -1;
        !          1368:        while((sectorIndex = P_FindSectorFromTag(tag, sectorIndex)) >= 0)
        !          1369:        {
        !          1370:                sectors[sectorIndex].floorpic = flat;
        !          1371:        }
        !          1372:        return SCRIPT_CONTINUE;
        !          1373: }
        !          1374: 
        !          1375: static int CmdChangeFloorDirect(void)
        !          1376: {
        !          1377:        int tag;
        !          1378:        int flat;
        !          1379:        int sectorIndex;
        !          1380: 
        !          1381:        tag = *PCodePtr++;
        !          1382:        flat = R_FlatNumForName(ACStrings[*PCodePtr++]);
        !          1383:        sectorIndex = -1;
        !          1384:        while((sectorIndex = P_FindSectorFromTag(tag, sectorIndex)) >= 0)
        !          1385:        {
        !          1386:                sectors[sectorIndex].floorpic = flat;
        !          1387:        }
        !          1388:        return SCRIPT_CONTINUE;
        !          1389: }
        !          1390: 
        !          1391: static int CmdChangeCeiling(void)
        !          1392: {
        !          1393:        int tag;
        !          1394:        int flat;
        !          1395:        int sectorIndex;
        !          1396: 
        !          1397:        flat = R_FlatNumForName(ACStrings[Pop()]);
        !          1398:        tag = Pop();
        !          1399:        sectorIndex = -1;
        !          1400:        while((sectorIndex = P_FindSectorFromTag(tag, sectorIndex)) >= 0)
        !          1401:        {
        !          1402:                sectors[sectorIndex].ceilingpic = flat;
        !          1403:        }
        !          1404:        return SCRIPT_CONTINUE;
        !          1405: }
        !          1406: 
        !          1407: static int CmdChangeCeilingDirect(void)
        !          1408: {
        !          1409:        int tag;
        !          1410:        int flat;
        !          1411:        int sectorIndex;
        !          1412: 
        !          1413:        tag = *PCodePtr++;
        !          1414:        flat = R_FlatNumForName(ACStrings[*PCodePtr++]);
        !          1415:        sectorIndex = -1;
        !          1416:        while((sectorIndex = P_FindSectorFromTag(tag, sectorIndex)) >= 0)
        !          1417:        {
        !          1418:                sectors[sectorIndex].ceilingpic = flat;
        !          1419:        }
        !          1420:        return SCRIPT_CONTINUE;
        !          1421: }
        !          1422: 
        !          1423: static int CmdRestart(void)
        !          1424: {
        !          1425:        PCodePtr = ACSInfo[ACScript->infoIndex].address;
        !          1426:        return SCRIPT_CONTINUE;
        !          1427: }
        !          1428: 
        !          1429: static int CmdAndLogical(void)
        !          1430: {
        !          1431:        Push(Pop() && Pop());
        !          1432:        return SCRIPT_CONTINUE;
        !          1433: }
        !          1434: 
        !          1435: static int CmdOrLogical(void)
        !          1436: {
        !          1437:        Push(Pop() || Pop());
        !          1438:        return SCRIPT_CONTINUE;
        !          1439: }
        !          1440: 
        !          1441: static int CmdAndBitwise(void)
        !          1442: {
        !          1443:        Push(Pop()&Pop());
        !          1444:        return SCRIPT_CONTINUE;
        !          1445: }
        !          1446: 
        !          1447: static int CmdOrBitwise(void)
        !          1448: {
        !          1449:        Push(Pop()|Pop());
        !          1450:        return SCRIPT_CONTINUE;
        !          1451: }
        !          1452: 
        !          1453: static int CmdEorBitwise(void)
        !          1454: {
        !          1455:        Push(Pop()^Pop());
        !          1456:        return SCRIPT_CONTINUE;
        !          1457: }
        !          1458: 
        !          1459: static int CmdNegateLogical(void)
        !          1460: {
        !          1461:        Push(!Pop());
        !          1462:        return SCRIPT_CONTINUE;
        !          1463: }
        !          1464: 
        !          1465: static int CmdLShift(void)
        !          1466: {
        !          1467:        int operand2;
        !          1468: 
        !          1469:        operand2 = Pop();
        !          1470:        Push(Pop()<<operand2);
        !          1471:        return SCRIPT_CONTINUE;
        !          1472: }
        !          1473: 
        !          1474: static int CmdRShift(void)
        !          1475: {
        !          1476:        int operand2;
        !          1477: 
        !          1478:        operand2 = Pop();
        !          1479:        Push(Pop()>>operand2);
        !          1480:        return SCRIPT_CONTINUE;
        !          1481: }
        !          1482: 
        !          1483: static int CmdUnaryMinus(void)
        !          1484: {
        !          1485:        Push(-Pop());
        !          1486:        return SCRIPT_CONTINUE;
        !          1487: }
        !          1488: 
        !          1489: static int CmdIfNotGoto(void)
        !          1490: {
        !          1491:        if(Pop())
        !          1492:        {
        !          1493:                PCodePtr++;
        !          1494:        }
        !          1495:        else
        !          1496:        {
        !          1497:                PCodePtr = (int *)(ActionCodeBase+*PCodePtr);
        !          1498:        }
        !          1499:        return SCRIPT_CONTINUE;
        !          1500: }
        !          1501: 
        !          1502: static int CmdLineSide(void)
        !          1503: {
        !          1504:        Push(ACScript->side);
        !          1505:        return SCRIPT_CONTINUE;
        !          1506: }
        !          1507: 
        !          1508: static int CmdScriptWait(void)
        !          1509: {
        !          1510:        ACSInfo[ACScript->infoIndex].waitValue = Pop();
        !          1511:        ACSInfo[ACScript->infoIndex].state = ASTE_WAITINGFORSCRIPT;
        !          1512:        return SCRIPT_STOP;
        !          1513: }
        !          1514: 
        !          1515: static int CmdScriptWaitDirect(void)
        !          1516: {
        !          1517:        ACSInfo[ACScript->infoIndex].waitValue = *PCodePtr++;
        !          1518:        ACSInfo[ACScript->infoIndex].state = ASTE_WAITINGFORSCRIPT;
        !          1519:        return SCRIPT_STOP;
        !          1520: }
        !          1521: 
        !          1522: static int CmdClearLineSpecial(void)
        !          1523: {
        !          1524:        if(ACScript->line)
        !          1525:        {
        !          1526:                ACScript->line->special = 0;
        !          1527:        }
        !          1528:        return SCRIPT_CONTINUE;
        !          1529: }
        !          1530: 
        !          1531: static int CmdCaseGoto(void)
        !          1532: {
        !          1533:        if(Top() == *PCodePtr++)
        !          1534:        {
        !          1535:                PCodePtr = (int *)(ActionCodeBase+*PCodePtr);
        !          1536:                Drop();
        !          1537:        }
        !          1538:        else
        !          1539:        {
        !          1540:                PCodePtr++;
        !          1541:        }
        !          1542:        return SCRIPT_CONTINUE;
        !          1543: }
        !          1544: 
        !          1545: static int CmdBeginPrint(void)
        !          1546: {
        !          1547:        *PrintBuffer = 0;
        !          1548:        return SCRIPT_CONTINUE;
        !          1549: }
        !          1550: 
        !          1551: static int CmdEndPrint(void)
        !          1552: {
        !          1553:        player_t *player;
        !          1554: 
        !          1555:        if(ACScript->activator && ACScript->activator->player)
        !          1556:        {
        !          1557:                player = ACScript->activator->player;
        !          1558:        }
        !          1559:        else
        !          1560:        {
        !          1561:                player = &players[consoleplayer];
        !          1562:        }
        !          1563:        P_SetMessage(player, PrintBuffer, true);
        !          1564:        return SCRIPT_CONTINUE;
        !          1565: }
        !          1566: 
        !          1567: static int CmdEndPrintBold(void)
        !          1568: {
        !          1569:        int i;
        !          1570: 
        !          1571:        for(i = 0; i < MAXPLAYERS; i++)
        !          1572:        {
        !          1573:                if(playeringame[i])
        !          1574:                {
        !          1575:                        P_SetYellowMessage(&players[i], PrintBuffer, true);
        !          1576:                }
        !          1577:        }
        !          1578:        return SCRIPT_CONTINUE;
        !          1579: }
        !          1580: 
        !          1581: static int CmdPrintString(void)
        !          1582: {
        !          1583:        strcat(PrintBuffer, ACStrings[Pop()]);
        !          1584:        return SCRIPT_CONTINUE;
        !          1585: }
        !          1586: 
        !          1587: static int CmdPrintNumber(void)
        !          1588: {
        !          1589:        char tempStr[16];
        !          1590: 
        !          1591:        sprintf(tempStr, "%d", Pop());
        !          1592:        strcat(PrintBuffer, tempStr);
        !          1593:        return SCRIPT_CONTINUE;
        !          1594: }
        !          1595: 
        !          1596: static int CmdPrintCharacter(void)
        !          1597: {
        !          1598:        char *bufferEnd;
        !          1599: 
        !          1600:        bufferEnd = PrintBuffer+strlen(PrintBuffer);
        !          1601:        *bufferEnd++ = Pop();
        !          1602:        *bufferEnd = 0;
        !          1603:        return SCRIPT_CONTINUE;
        !          1604: }
        !          1605: 
        !          1606: static int CmdPlayerCount(void)
        !          1607: {
        !          1608:        int i;
        !          1609:        int count;
        !          1610: 
        !          1611:        count = 0;
        !          1612:        for(i = 0; i < MAXPLAYERS; i++)
        !          1613:        {
        !          1614:                count += playeringame[i];
        !          1615:        }
        !          1616:        Push(count);
        !          1617:        return SCRIPT_CONTINUE;
        !          1618: }
        !          1619: 
        !          1620: static int CmdGameType(void)
        !          1621: {
        !          1622:        int gametype;
        !          1623: 
        !          1624:        if(netgame == false)
        !          1625:        {
        !          1626:                gametype = GAME_SINGLE_PLAYER;
        !          1627:        }
        !          1628:        else if(deathmatch)
        !          1629:        {
        !          1630:                gametype = GAME_NET_DEATHMATCH;
        !          1631:        }
        !          1632:        else
        !          1633:        {
        !          1634:                gametype = GAME_NET_COOPERATIVE;
        !          1635:        }
        !          1636:        Push(gametype);
        !          1637:        return SCRIPT_CONTINUE;
        !          1638: }
        !          1639: 
        !          1640: static int CmdGameSkill(void)
        !          1641: {
        !          1642:        Push(gameskill);
        !          1643:        return SCRIPT_CONTINUE;
        !          1644: }
        !          1645: 
        !          1646: static int CmdTimer(void)
        !          1647: {
        !          1648:        Push(leveltime);
        !          1649:        return SCRIPT_CONTINUE;
        !          1650: }
        !          1651: 
        !          1652: static int CmdSectorSound(void)
        !          1653: {
        !          1654:        int volume;
        !          1655:        mobj_t *mobj;
        !          1656: 
        !          1657:        mobj = NULL;
        !          1658:        if(ACScript->line)
        !          1659:        {
        !          1660:                mobj = (mobj_t *)&ACScript->line->frontsector->soundorg;
        !          1661:        }
        !          1662:        volume = Pop();
        !          1663:        S_StartSoundAtVolume(mobj, S_GetSoundID(ACStrings[Pop()]), volume);
        !          1664:        return SCRIPT_CONTINUE;
        !          1665: }
        !          1666: 
        !          1667: static int CmdThingSound(void)
        !          1668: {
        !          1669:        int tid;
        !          1670:        int sound;
        !          1671:        int volume;
        !          1672:        mobj_t *mobj;
        !          1673:        int searcher;
        !          1674: 
        !          1675:        volume = Pop();
        !          1676:        sound = S_GetSoundID(ACStrings[Pop()]);
        !          1677:        tid = Pop();
        !          1678:        searcher = -1;
        !          1679:        while((mobj = P_FindMobjFromTID(tid, &searcher)) != NULL)
        !          1680:        {
        !          1681:                S_StartSoundAtVolume(mobj, sound, volume);
        !          1682:        }
        !          1683:        return SCRIPT_CONTINUE;
        !          1684: }
        !          1685: 
        !          1686: static int CmdAmbientSound(void)
        !          1687: {
        !          1688:        int volume;
        !          1689: 
        !          1690:        volume = Pop();
        !          1691:        S_StartSoundAtVolume(NULL, S_GetSoundID(ACStrings[Pop()]), volume);
        !          1692:        return SCRIPT_CONTINUE;
        !          1693: }
        !          1694: 
        !          1695: static int CmdSoundSequence(void)
        !          1696: {
        !          1697:        mobj_t *mobj;
        !          1698: 
        !          1699:        mobj = NULL;
        !          1700:        if(ACScript->line)
        !          1701:        {
        !          1702:                mobj = (mobj_t *)&ACScript->line->frontsector->soundorg;
        !          1703:        }
        !          1704:        SN_StartSequenceName(mobj, ACStrings[Pop()]);
        !          1705:        return SCRIPT_CONTINUE;
        !          1706: }
        !          1707: 
        !          1708: static int CmdSetLineTexture(void)
        !          1709: {
        !          1710:        line_t *line;
        !          1711:        int lineTag;
        !          1712:        int side;
        !          1713:        int position;
        !          1714:        int texture;
        !          1715:        int searcher;
        !          1716: 
        !          1717:        texture = R_TextureNumForName(ACStrings[Pop()]);
        !          1718:        position = Pop();
        !          1719:        side = Pop();
        !          1720:        lineTag = Pop();
        !          1721:        searcher = -1;
        !          1722:        while((line = P_FindLine(lineTag, &searcher)) != NULL)
        !          1723:        {
        !          1724:                if(position == TEXTURE_MIDDLE)
        !          1725:                {
        !          1726:                        sides[line->sidenum[side]].midtexture = texture;
        !          1727:                }
        !          1728:                else if(position == TEXTURE_BOTTOM)
        !          1729:                {
        !          1730:                        sides[line->sidenum[side]].bottomtexture = texture;
        !          1731:                }
        !          1732:                else
        !          1733:                { // TEXTURE_TOP
        !          1734:                        sides[line->sidenum[side]].toptexture = texture;
        !          1735:                }
        !          1736:        }
        !          1737:        return SCRIPT_CONTINUE;
        !          1738: }
        !          1739: 
        !          1740: static int CmdSetLineBlocking(void)
        !          1741: {
        !          1742:        line_t *line;
        !          1743:        int lineTag;
        !          1744:        boolean blocking;
        !          1745:        int searcher;
        !          1746: 
        !          1747:        blocking = Pop() ? ML_BLOCKING : 0;
        !          1748:        lineTag = Pop();
        !          1749:        searcher = -1;
        !          1750:        while((line = P_FindLine(lineTag, &searcher)) != NULL)
        !          1751:        {
        !          1752:                line->flags = (line->flags&~ML_BLOCKING)|blocking;
        !          1753:        }
        !          1754:        return SCRIPT_CONTINUE;
        !          1755: }
        !          1756: 
        !          1757: static int CmdSetLineSpecial(void)
        !          1758: {
        !          1759:        line_t *line;
        !          1760:        int lineTag;
        !          1761:        int special, arg1, arg2, arg3, arg4, arg5;
        !          1762:        int searcher;
        !          1763: 
        !          1764:        arg5 = Pop();
        !          1765:        arg4 = Pop();
        !          1766:        arg3 = Pop();
        !          1767:        arg2 = Pop();
        !          1768:        arg1 = Pop();
        !          1769:        special = Pop();
        !          1770:        lineTag = Pop();
        !          1771:        searcher = -1;
        !          1772:        while((line = P_FindLine(lineTag, &searcher)) != NULL)
        !          1773:        {
        !          1774:                line->special = special;
        !          1775:                line->arg1 = arg1;
        !          1776:                line->arg2 = arg2;
        !          1777:                line->arg3 = arg3;
        !          1778:                line->arg4 = arg4;
        !          1779:                line->arg5 = arg5;
        !          1780:        }
        !          1781:        return SCRIPT_CONTINUE;
        !          1782: }

unix.superglobalmegacorp.com

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