|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.